【问题标题】:C# image compression for serial transmission用于串行传输的 C# 图像压缩
【发布时间】:2016-05-23 23:58:23
【问题描述】:

这是我的第一个问题,所以我希望提供它需要得到一个体面的答案。

我想通过串行链接发送网络摄像头接收到的图像。 Image被转换成字节数组,然后写入串口。

我遇到的第一个问题是,当我尝试发送图像时,它导致TimeoutException。查看字节数组的长度,它向我展示了大约 1 MB 需要传输的数据。缩小图像的实际尺寸会导致传输速度更快,但之后图像太小了。

第二个问题是我尝试压缩图像时。使用不同的方法,传输的大小总是完全相同的。

我希望你能帮助我找到一种方法来改进我的实现,以便传输只需几秒钟,同时仍然保持图像的合理分辨率。谢谢。


具体信息

网络摄像头图像

  • AForge 库接收来自网络摄像头的图像
  • 图像作为位图处理
  • (显然)它不会传输每一帧,仅在单击按钮时才传输

串口

  • 端口使用 57600 bps 的波特率(由下面的硬件定义)
  • WriteTimeout-value 设置为 30 秒,因为等待时间超过此时间是不可接受的
  • 文本传输在 WinForm 中的 SerialPort-item 上使用默认值

图像处理

我使用了不同的方法来压缩图像:

类似的简单方法

public static byte[] getBytes(Bitmap img)
{
    MemoryStream ms = new MemoryStream();
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

    byte[] output = ms.toArray();
    ms.Dispose();
    return output;
}

以及更高级的方法,例如 here 发布的方法。不仅有Encoder.Quality,还有Encoder.Compression

我的申请

private void btn_Send(...)
{
    Bitmap currentFrame = getImageFromWebcam();
    
    //Bitmap sendFrame = new Bitmap(currentFrame, new Size(currentFrame.Width/10, currentFrame.Height/10));
    Bitmap sendFrame = compressImage(currentFrame);

    byte[] data = getBytes(sendFrame);

    serialPort.Write(data, 0, data.Lenght);
}

【问题讨论】:

  • 图片的尺寸是多少?你把它缩了多少?您的getBytes 似乎正在泄漏,而压缩与质量只是表达同一事物的相反方式。你不能有高Q和高压缩
  • 图像没有保存到磁盘,所以我不能告诉“文件大小”,但在转换后是 1 MB 以下。你的意思是泄漏,因为我没有关闭 MemoryStream?
  • 尺寸是指尺寸 WxH;应该处置 memstream。 90 vs 92 vs 95 的质量实际上在尺寸上产生了很大的差异
  • 当我回到那台电脑时,我必须检查一下。网络摄像头拍摄 800x600 的照片,我真的不知道它们“在”AForge “内部”会发生什么。我得到它时会添加信息。
  • GIF 编码可能不是一件坏事——在宽带普及和负担得起之前,摄像头默认生成 GIF。索引颜色可能意味着更少的数据

标签: c# image serial-port compression


【解决方案1】:

C 挂起串口的超时属性可以解决超时问题。如何在此链接https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.writetimeout(v=vs.110).aspx 中显示。文件压缩的​​工作原理是查看数据块并将给定块段的相似块相互关联。如果您的图像太独特,它将不会根据所使用的压缩软件进行压缩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2018-10-19
    • 2018-09-01
    相关资源
    最近更新 更多