【问题标题】:Sending bitmaps over ethernet and then back again (c# and c)通过以太网发送位图然后再返回(c# 和 c)
【发布时间】: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更容易吗?用于插值、边缘检测等

标签: c# c sockets tcp bitmap


【解决方案1】:

是的,简而言之,我会说你做你想做的事的方法是正确的。

不过我会问,你为什么要将它发送到服务器?我猜它与并行处理有关吗?除非您正在执行非常繁重的处理,否则处理单个帧可能比将其传输到服务器更快(据我所知,C# 中的 EmguCV 并不比 C/C++ 中的 OpenCV 慢很多)。

System.Drawing.Bitmap 类是 .Net 框架的一部分,您可能在 C 中找不到直接对应关系。您可能需要考虑首先将图像转换为某种已知格式,例如 .png 文件。然后您发送该文件的原始字节。在服务器端,您接收原始字节数组,并使用任何 C 结构将该图像加载为 .png 文件。关键是要消除一些抽象,并更准确地了解正在发送的内容。

也许使用 System.Net.WebRequest 类之类的东西会更容易?同样,这在一定程度上取决于您要解决的具体问题。

我希望这有帮助 - 这个回答有点含糊(你的问题也是:P),所以请随时要求澄清特定部分:)

【讨论】:

  • OP 使用的是ImageFormat.Bmp,这是一个普通的.bmp 文件。它不是特定于 .NET 的格式。 .png 会更好,因为它是压缩的,但对于接收代码的使用同样有效。
  • 它被发送到带有 FPGA 的开发板以尝试使用,但首先它只会在板上的 arm 芯片上运行。因为我想要执行一些图像处理(插值、边缘检测,可能还有一些运动的东西)以尝试实现某种形式的超分辨率,所以我想我想避免压缩图像。编辑:刚刚看到 PNG 是无损压缩的,我可能会研究它们,它们是否更容易处理、更改像素值等?
  • 不,它们只是占用更少的空间。你要做的就是压缩成PNG,然后发送,在处理之前在另一边解压
  • 很公平,带有内存流的注释代码看起来正确吗?目标是在将图像发回之前反转图像或类似的东西。要发回它,我是否只需使用最初发送它时使用的相同代码?
  • MemoryStream 代码看起来不错,但在我测试它之前我不会说它肯定会工作。您是否尝试运行它以查看它是否有效?您可以使用相同的方法将其发送回去。
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2013-03-23
  • 2011-05-08
  • 1970-01-01
相关资源
最近更新 更多