Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示摄像机的实时图像_C#_.net_Image Processing - Fatal编程技术网

C# 显示摄像机的实时图像

C# 显示摄像机的实时图像,c#,.net,image-processing,C#,.net,Image Processing,我正在开发一个C#.NET应用程序,它将显示从相机(智能相机)捕获的图像。我正在使用下面的函数将从相机(字节数组)接收的原始数据转换为位图图像。我在下面的代码中遇到的问题是,C#.NET应用程序的图片框中显示的图像(理想情况下应该是实时图像)看起来像一个电影卷轴,并且一直向右滚动。你知道如何解决这个问题吗 private Image ByteArrayToImage(byte[] myByteArray) { if (myByteArray != null) {

我正在开发一个C#.NET应用程序,它将显示从相机(智能相机)捕获的图像。我正在使用下面的函数将从相机(字节数组)接收的原始数据转换为位图图像。我在下面的代码中遇到的问题是,C#.NET应用程序的图片框中显示的图像(理想情况下应该是实时图像)看起来像一个电影卷轴,并且一直向右滚动。你知道如何解决这个问题吗

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,请在我原来帖子的编辑部分找到我的回复。请帮忙。知道照相机的型号会有帮助的。虽然我很喜欢在灯光下看到我的名字,但如果你不想专门呼叫我,你会更走运。