使用OpenCV在JPG中对图像进行编码,避免重影效应

时间:2014-04-10 09:44:27

标签: c++ image opencv encoding jpeg

我有一个应用程序(openCV - C ++)从网络摄像头抓取图像,用JPG对其进行编码并将其从服务器传输到客户端。 Thwebcam是立体声,所以实际上我有两个图像,LEFT和RIGHT。在客户端,当我收到图像时,我解码它,我生成一个浮雕3D效果。 为此,我使用OpenCV ... 我用这种方式对图像进行编码:

 params.push_back(CV_IMWRITE_JPEG_QUALITY);
 params.push_back(60); //image quality
 imshow(image); // here the anagliphic image is good!
 cv::imencode(".jpg", image, buffer, params);

以这种方式解码:

 cv::Mat imageRecieved = cv::imdecode( cv::Mat(v), CV_LOAD_IMAGE_COLOR );

我所看到的是,这种编码在浮雕图像中产生了一种"重影效果" (神器?)所以对象的边缘会产生不良影响。如果看门,例如门的边缘会产生鬼影。我确信这取决于编码,因为如果我在编码指令之前显示浮雕图像,这很有效。我无法使用PNG,因为它生成大图像,这是服务器和客户端之间连接的问题。

我寻找GIF但是,如果我理解得好,则不受cv :: encode函数的支持。

所以还有另一种方法来编码一个cv:在JPG中使用Mat obj,这种不良效果并没有增加到图像的大小?

2 个答案:

答案 0 :(得分:1)

我假设立体图编码使用行隔行扫描将两面合并为一个图像。

您正在使用JPEG压缩图像。 该算法经过优化,可以从相机中压缩“类似照片”的真实世界图像,并且可以很好地处理这些图像。

关于图像压缩的“照片式”和其他图像的差异与图像中出现的频率有关 粗略地说,在“类似照片”的图像中,高频部分相对较小,并且对图像内容大多不重要。
因此可以安全地压缩高频。

如果两个帧逐行交错,则会生成具有非常强的高频部分的图像。

JPEG算法将大部分信息视为不重要,但由于它实际上很重要,因此会产生相对较强的伪影。

JPEG基本上只对这种图像“不起作用”。

如果您可以并排更改anaqlyph图像的编码,或者从左右交替更改完整图像,JPEG压缩应该可以正常工作。

这是你的选择吗?

如果没有,它将变得更加复杂。一个问题 - 如果你需要良好的压缩 - 是那些非常适合压缩具有很高频率的图像的算法在压缩“类似照片”的数据方面非常糟糕,这仍然是你图像的较大部分。

因此,请尽量将编码更改为不是行隔行扫描,这应该比其他选项更容易一个数量级。

答案 1 :(得分:1)

如果您的服务器仅用作图像存储,您可以向服务器发送2个原始立体图像(压缩),并在需要时生成立体图像。我想如果你从服务器获取图像对(JPEG),然后生成Anaglyph(客户端),它将没有重影。可能是压缩的图像组合小于立体图.png