我希望通过以太网发送位图(或图像)以执行一些图像处理,然后将它们发回。 “客户端”正在运行 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# 中工作。
我走的路线正确吗?理想情况下,我想发送单个帧的所有数据,然后对其进行处理,然后将其发回,但我不知道这是否是我正在做的事情。发现它比平常更困难,因为在服务器上我只是用 scrap/gedit 编写并使用 gcc 进行编译,以前从未在 Linux 上编码过,所以我错过了诸如智能感知/调试之类的东西。
如有任何帮助/建议,我们将不胜感激
最佳答案
是的,简而言之,我想说你做你想做的事情的方法是正确的。
我想问一下,你为什么要把它发送到服务器?我猜这与并行处理或其他什么有关?除非您正在进行非常繁重的处理,否则使用单个帧可能比将其传输到服务器更快(据我所知,C# 中的 EmguCV 并不比 C/C++ 中的 OpenCV 慢很多)。
System.Drawing.Bitmap 类是 .Net 框架的一部分,您可能在 C 中找不到直接对应的类。您可能需要考虑首先将图像转换为某种已知格式,例如 .png 文件。然后发送该文件的原始字节。在服务器端,您接收原始字节数组,并使用任何 C 结构将该图像加载为 .png 文件。重点是消除一些抽象并更准确地了解正在发送的内容。
也许使用 System.Net.WebRequest 类之类的东西会更容易?同样,这在一定程度上取决于您想要解决的问题。
我希望这能有所帮助 - 这个回答有点模糊(你的问题也是:P),所以请随时要求对特定部分进行澄清:)
关于c# - 通过以太网发送位图,然后再返回(c# 和 c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240766/