[英]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.