【发布时间】:2015-01-30 16:52:42
【问题描述】:
我希望通过以太网发送位图(或图像)以执行一些图像处理,然后将它们发回。 “客户端”正在运行 c# 代码,使用 emgucv 从视频中提取帧。 “服务器”将在 arm cpu 上运行 c/c++,尽管目前在我的笔记本电脑上使用基本操作系统是 x86。所以我需要避免使用opencv之类的东西来处理图像本身,但这是另一点。
我研究了套接字等,可以向服务器发送一些数据或从服务器发送一些数据,此时只是在控制台中输入文本。
从最初的研究来看,我似乎需要将位图转换为字节数组才能发送它,我已经使用以下代码完成了(我认为):
Stream stm = tcpclnt.GetStream();
int l;
using (MemoryStream ms = new MemoryStream())
{
bmpFrame.Save(ms, ImageFormat.Bmp);
byte[] byteFrame = ms.ToArray();
l = byteFrame.Length;
stm.Write(byteFrame, 0, byteFrame.Length);
stm.Flush();
}
然后在服务器端尝试使用:
char buff[10000];
int n;
n = read(conn_desc, buff, sizeof(buff)-1);
if ( n > 0)
{
//MemoryStream ms = new MemoryStream(receivedBytes);
//Bitmap bmpReceived = new Bitmap(ms, System.Drawing.Imaging.ImageFormat.Bmp);
printf("Received %s\n", buff);
}
else
{
printf("Failed receiving\n");
}
您可以看到注释代码,我认为我可以将其更改回位图,但我不确定我是否想要/需要再这样做,如果我可以通过访问字节来编辑图像直接,而且我不知道位图如何/是否在 C 而不是 C# 中工作。
我走的是正确的路线吗?理想情况下,我想发送单个帧的所有数据,然后对其进行处理,然后将其发送回去,但我不知道这是否是我正在做的事情。在服务器上发现它比平时更困难,因为我只是在草稿/gedit 中编写并使用 gcc 进行编译,以前从未在 linux 上编码过,所以我错过了诸如智能感知/调试之类的东西。
任何帮助/建议将不胜感激
【问题讨论】:
-
printf(%s...) 仅适用于以空字符结尾的字符串。部分接收的位图缓冲区不是以 null 结尾的字符串。
-
位图在 .NET 中的工作方式与在非托管 C++ 中的工作方式相同,因为格式实际上是正常的文件格式(即,当您保存到
MemoryStream时,这与您想要的完全相同的数据获取是否已保存到文件中)。因此,您需要找到一个示例,说明如何在服务器端将数据解释为 Windows .bmp 格式。无论如何,您可能应该使用 .png,因为它是压缩的(但仍然无损),而且您可能在 Linux 上对 .png 的支持比对 .bmp 的支持更好(但实际上,.bmp 也得到了相当广泛的支持)。跨度> -
当我第一次设置客户端和服务器之间的通信并且只是发送一个字符串时,printf 就在那里。我不想打印它,我想在发回之前执行一些图像处理。关于PNG足够公平,用PNG编辑像素值等比BMP更容易吗?用于插值、边缘检测等