【发布时间】: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