C#-> Python编码和解码网络摄像头流

问题描述

我一直很难弄清楚如何通过命名管道传递网络摄像头图像。已经完成了使服务器和客户端交换数据的工作,但是无法弄清楚如何使用这些库对图像进行正确的编码和解码。现在,我的Python端仅显示为灰色图像。希望您能帮助我解决这个问题。

这是我的C#块,将位图编码为ByteArray并通过命名管道传递:

public byte[] encodeImage(System.Drawing.Image imageIn)
    //Helper Function for turning Bitmap images into ByteArrays
    {
        using (var ms = new MemoryStream())
        {
            imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Bmp);
            return ms.ToArray();
        }
    }

public void OnFrameReceive(object sender,NewFrameEventArgs eventArgs)
    {
        byte[] image_bytes;
        Console.WriteLine("Received new frame");
        Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
        image_bytes = encodeImage(bitmap);
        writetoPipe(image_bytes);
    }

public void writetoPipe(byte[] frame)
    {
        if (server.IsConnected)
        {
            MemoryStream memoryStream = new MemoryStream();
            using (BinaryWriter writer = new BinaryWriter(memoryStream))
            {
                Console.WriteLine("Wrting to pipe");
                writer.Write(frame);
                int bufferLength = (memoryStream.ToArray().Length);
                server.Write(memoryStream.ToArray(),bufferLength);
            }
            memoryStream.Close();
        }
        else
        {
            Console.WriteLine("Not connected");
        }

这是Python端接收该数据并尝试对其进行解码:

def init_pipe_signal():
    print("At init_pipe_signal")
    bufferSize = 921600
    arraySize = int(math.sqrt(bufferSize))
    i = np.arange(bufferSize).reshape(arraySize,arraySize)

    fileHandle = win32file.CreateFile("\\\\.\\pipe\\Demo",win32file.GENERIC_READ | win32file.GENERIC_WRITE,None,win32file.OPEN_EXISTING,None)

    while True:
        response,data = win32file.ReadFile(fileHandle,bufferSize)

        if response == 0:
            try:
                frame = Image.frombytes("RGB",(480,640),data,decoder_name="raw")
                frame = np.array(frame)
                cv.imshow('Test',frame)
            
            except ValueError:
                print("Value Error Here")
    
        else:
            print("No pipe data")

任何指导或帮助将不胜感激!

解决方法

知道了!对于那些正在寻找答案的人: 这是我的C#面

        public byte[] encodeImage(System.Drawing.Image imageIn)
    //Helper Function for turning Bitmap images into ByteArrays
    {
        using (var ms = new MemoryStream())
        {
            imageIn.Save(ms,ImageFormat.Bmp);
            return ms.ToArray();
        }
    }

    public void OnFrameReceive(object sender,NewFrameEventArgs eventArgs)
    {
        byte[] image_bytes;
        Console.WriteLine("Received new frame");
        Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
        image_bytes = encodeImage(bitmap);
        writeToPipe(image_bytes);
    }
    public void writeToPipe(byte[] frame)
    {
        if (server.IsConnected)
        {
            MemoryStream memoryStream = new MemoryStream();
            using (BinaryWriter writer = new BinaryWriter(memoryStream))
            {

                Console.WriteLine("Wrting to pipe");
                writer.Write(frame);

                //int bufferLength = (memoryStream.ToArray().Length/32)*32;
                int bufferLength = (memoryStream.ToArray().Length);
                server.Write(memoryStream.ToArray(),bufferLength);
                Console.WriteLine(memoryStream.ToArray().Length);
            }
            /*
            Not sure if Memory Stream needs to be closed here (after every Write) 
            or after every time the server finishes.
            Test performance for both
            */
            memoryStream.Close();
        }
        else
        {
            Console.WriteLine("NOPE NOT CONNECTED");
        }
    }

这是python解码端:

def init_pipe_signal():
    print("At init_pipe_signal")
    bufferSize = 921654
    fileHandle = win32file.CreateFile("\\\\.\\pipe\\Demo",win32file.GENERIC_READ | win32file.GENERIC_WRITE,None,win32file.OPEN_EXISTING,None)
while True:
    response,data = win32file.ReadFile(fileHandle,bufferSize)

    if response == 0:
        try:
            frame = np.array(Image.frombytes("RGB",(640,480),data))
            frame = np.rot90(frame,2)
            cv2.imshow("Test",frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        except ValueError:
            print("Value Error Here")
    
    else:
        print("No pipe data")