我有一个应用程序(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,这种不良效果并没有增加到图像的大小?
答案 0 :(得分:1)
我假设立体图编码使用行隔行扫描将两面合并为一个图像。
您正在使用JPEG压缩图像。 该算法经过优化,可以从相机中压缩“类似照片”的真实世界图像,并且可以很好地处理这些图像。
关于图像压缩的“照片式”和其他图像的差异与图像中出现的频率有关
粗略地说,在“类似照片”的图像中,高频部分相对较小,并且对图像内容大多不重要。
因此可以安全地压缩高频。
如果两个帧逐行交错,则会生成具有非常强的高频部分的图像。
JPEG算法将大部分信息视为不重要,但由于它实际上很重要,因此会产生相对较强的伪影。
JPEG基本上只对这种图像“不起作用”。
如果您可以并排更改anaqlyph图像的编码,或者从左右交替更改完整图像,JPEG压缩应该可以正常工作。
这是你的选择吗?
如果没有,它将变得更加复杂。一个问题 - 如果你需要良好的压缩 - 是那些非常适合压缩具有很高频率的图像的算法在压缩“类似照片”的数据方面非常糟糕,这仍然是你图像的较大部分。
因此,请尽量将编码更改为不是行隔行扫描,这应该比其他选项更容易一个数量级。
答案 1 :(得分:1)
如果您的服务器仅用作图像存储,您可以向服务器发送2个原始立体图像(压缩),并在需要时生成立体图像。我想如果你从服务器获取图像对(JPEG),然后生成Anaglyph(客户端),它将没有重影。可能是压缩的图像组合小于立体图.png
。