问题描述
我一直很难弄清楚如何通过命名管道传递网络摄像头图像。已经完成了使服务器和客户端交换数据的工作,但是无法弄清楚如何使用这些库对图像进行正确的编码和解码。现在,我的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")