【发布时间】:2020-09-27 07:20:18
【问题描述】:
我一直无法弄清楚如何通过命名管道传递网络摄像头图像。已经完成让服务器和客户端交换数据,但无法弄清楚如何使用库来正确编码和解码图像。现在我的 Python 端只是显示为灰色图像。希望您能帮助指导我解决这个问题。
这是我将位图编码为 ByteArray 并通过命名管道传递的 C# 块:
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");
}
这里是 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")
任何指导或帮助将不胜感激!
【问题讨论】:
-
我立即注意到的事情是:1)在 C# 端,您将其保存为位图(特定文件格式),而在 Python 端,您尝试将其视为原始文件(我可能是错的,因为我不是 Python 开发人员)。 2)当您写入流时,您没有传递图像的字节长度,因此您无法知道一个图像在哪里结束,另一个在哪里开始。
标签: python c# image decode encode