简体   繁体   English

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

[英]C# -> Python Encoding and Decoding Webcam Stream

I've been having trouble figuring out how to pass a webcam image through a Named Pipe.我一直无法弄清楚如何通过命名管道传递网络摄像头图像。 Already accomplished getting the Server and Client to exchange data but can't figure out how to use the libraries to actually encode and decode an image properly.已经完成让服务器和客户端交换数据,但无法弄清楚如何使用库来正确地对图像进行编码和解码。 Right now my Python side just shows up as a Grey Image.现在,我的 Python 端仅显示为灰色图像。 Hopefully you could help guide me through this problem.希望你能帮助指导我解决这个问题。

Here is my C# Block Encoding a Bitmap to a ByteArray and Passing it through a named Pipe:这是我的 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(), 0, bufferLength);
            }
            memoryStream.Close();
        }
        else
        {
            Console.WriteLine("Not connected");
        }

And here is the Python side receiving that data and trying to decode it:这是接收该数据并尝试对其进行解码的 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, 0, None, win32file.OPEN_EXISTING, 0, 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")

Any guidance or help would be appreciated!任何指导或帮助将不胜感激!

Got it!知道了! For those who are looking for the answer: Here is my C# Side对于那些正在寻找答案的人:这是我的 C# Side

        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(), 0, 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");
        }
    }

and here is the python decoding side:这是python解码端:

def init_pipe_signal():
    print("At init_pipe_signal")
    bufferSize = 921654
    fileHandle = win32file.CreateFile("\\\\.\\pipe\\Demo", win32file.GENERIC_READ | win32file.GENERIC_WRITE, 0, None, win32file.OPEN_EXISTING, 0, 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")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM