Отображение живого изображения с камеры - PullRequest
0 голосов
/ 08 апреля 2009

Я занимаюсь разработкой приложения на 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;
}

@ Марк, найдите ниже сегмент кода, который я использую для получения данных с камеры ...

Логика: сначала я получаю размер изображения, а затем открываю петлю n-соединения, пока не получу размер байтов от камеры.

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;
        }
    }
}

Пожалуйста, укажите на проблему ... Заранее спасибо.

1 Ответ

0 голосов
/ 08 апреля 2009

«Прокрутка вправо» говорит мне, что каждое изображение последовательно декодируется, но последовательные изображения отключены по отношению друг к другу. Правильный? Это означает, что проблема не в коде, который вы нам показали, а в коде, который читает с камеры.

Редактировать: кажется вероятным, что ваша ширина и высота немного смещены. Единственная документация, которую я нашел для камеры 664x504, гласит, что «активная область» (часть, которая на самом деле содержит изображение) действительно 648x488. Если это так, то ваше изображение также может немного наклониться, поскольку каждая строка будет смещена относительно следующей, и будет сдвигаться вверх, поскольку каждый прочитанный кадр получит часть данных следующего кадра.

...