C# 显示摄像机的实时图像
我正在开发一个C#.NET应用程序,它将显示从相机(智能相机)捕获的图像。我正在使用下面的函数将从相机(字节数组)接收的原始数据转换为位图图像。我在下面的代码中遇到的问题是,C#.NET应用程序的图片框中显示的图像(理想情况下应该是实时图像)看起来像一个电影卷轴,并且一直向右滚动。你知道如何解决这个问题吗C# 显示摄像机的实时图像,c#,.net,image-processing,C#,.net,Image Processing,我正在开发一个C#.NET应用程序,它将显示从相机(智能相机)捕获的图像。我正在使用下面的函数将从相机(字节数组)接收的原始数据转换为位图图像。我在下面的代码中遇到的问题是,C#.NET应用程序的图片框中显示的图像(理想情况下应该是实时图像)看起来像一个电影卷轴,并且一直向右滚动。你知道如何解决这个问题吗 private Image ByteArrayToImage(byte[] myByteArray) { if (myByteArray != null) {
private Image ByteArrayToImage(byte[] myByteArray)
{
if (myByteArray != null)
{
MemoryStream ms = new MemoryStream(myByteArray);
int Height = 504; /*The exact height of image from Smart Camera*/
int Width = 664; /*The exact width of image from Smart Camera*/
BitmapData bmpData =
bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.WriteOnly, bmp.PixelFormat);
Marshal.Copy(myByteArray, 0, bmpData.Scan0, myByteArray.Length);
Bitmap bmp = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
BitmapData bmpData =
bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, bmp.PixelFormat);
int offset = 0;
long ptr = bmpData.Scan0.ToInt64();
for (int i = 0; i < Height; i++)
{
Marshal.Copy(myByteArray, offset, new IntPtr(ptr), Width);
offset += (Width);
ptr += bmpData.Stride;
}
bmp.UnlockBits(bmpData);
return bmp;
}
return null;
}
private Image ByteArrayToImage(字节[]myByteArray)
{
如果(myByteArray!=null)
{
MemoryStream ms=新的MemoryStream(myByteArray);
int Height=504;/*智能相机图像的精确高度*/
int Width=664;/*智能相机图像的精确宽度*/
BitmapData bmpData=
锁位(新矩形(0,0,bmp.Width,bmp.Height),
ImageLockMode.WriteOnly,bmp.PixelFormat);
Marshal.Copy(myByteArray,0,bmpData.Scan0,myByteArray.Length);
位图bmp=新位图(宽度、高度、像素格式.Format24bppRgb);
BitmapData bmpData=
锁位(新矩形(0,0,bmp.Width,bmp.Height),
ImageLockMode.ReadWrite,bmp.PixelFormat);
整数偏移=0;
long ptr=bmpData.Scan0.ToInt64();
对于(int i=0;i
@标记,在下面找到我用来从摄像机接收数据的代码段
逻辑:我首先接收sizeof图像,然后打开socket connection n loop,直到从相机获得sizeof字节
public static byte[] receivedata(Socket clientSock)
{
if (clientSock != null)
{
byte[] size = new byte[10000000];
byte[] buffer = null;
int ch, received, offset;
try
{
clientSock.Receive(size);
//MessageBox.Show("size array is " + size[0]
// + " " + size[1] + " " + size[2] + " " );
ch = BitConverter.ToInt32(size, 0);
//ch = 334656;
//MessageBox.Show("Sizeofimg = " + ch + "");
buffer = new byte[ch];
//MessageBox.Show("Start receiving image from camera");
received = 0;
offset = 0;
do
{
received += clientSock.Receive(buffer,
offset + received,
ch - received,
SocketFlags.None);
} while (received < ch);
//MessageBox.Show("Received " + received + " values");
System.Threading.Thread.Sleep(50);
}
catch (Exception e)
{
MessageBox.Show("Error receiving ...");
MessageBox.Show(e.StackTrace);
}
return buffer;
}
else
{
return null;
}
}
}
公共静态字节[]接收数据(套接字客户端sock)
{
if(clientSock!=null)
{
字节[]大小=新字节[10000000];
字节[]缓冲区=空;
int ch,接收,偏移;
尝试
{
clientSock.Receive(尺寸);
//Show(“大小数组为”+size[0]
//+“”+大小[1]+“”+大小[2]+“”);
ch=位转换器.ToInt32(大小,0);
//ch=334656;
//MessageBox.Show(“Sizeofimg=“+ch+”);
缓冲区=新字节[ch];
//MessageBox.Show(“开始从相机接收图像”);
接收=0;
偏移量=0;
做
{
received+=客户端sock.Receive(缓冲区,
偏移量+已接收,
收到,,
SocketFlags(无);
}while(收到
请指出问题所在。。。
提前感谢。“向右滚动”告诉我,每个图像都在持续解码,但连续图像彼此之间的关系是关闭的。对的这意味着问题不在于你给我们看的代码,而在于从相机读取的代码
public static byte[] receivedata(Socket clientSock)
{
if (clientSock != null)
{
byte[] size = new byte[10000000];
byte[] buffer = null;
int ch, received, offset;
try
{
clientSock.Receive(size);
//MessageBox.Show("size array is " + size[0]
// + " " + size[1] + " " + size[2] + " " );
ch = BitConverter.ToInt32(size, 0);
//ch = 334656;
//MessageBox.Show("Sizeofimg = " + ch + "");
buffer = new byte[ch];
//MessageBox.Show("Start receiving image from camera");
received = 0;
offset = 0;
do
{
received += clientSock.Receive(buffer,
offset + received,
ch - received,
SocketFlags.None);
} while (received < ch);
//MessageBox.Show("Received " + received + " values");
System.Threading.Thread.Sleep(50);
}
catch (Exception e)
{
MessageBox.Show("Error receiving ...");
MessageBox.Show(e.StackTrace);
}
return buffer;
}
else
{
return null;
}
}
}
编辑:看起来你的宽度和高度有点偏离。我找到的关于664x504相机的唯一文档表明,“活动区域”(实际包含图片的部分)实际上是648x488。如果是这样的话,你的图片看起来也会有点倾斜,因为每一行都会与下一行偏移,并且会随着你读到的每一帧都会得到下一帧的部分数据而向上移动。@Mark,请在我原来帖子的编辑部分找到我的回复。请帮忙。知道照相机的型号会有帮助的。虽然我很喜欢在灯光下看到我的名字,但如果你不想专门呼叫我,你会更走运。