我有一个应用程序(openCV-C++),它可以从网络摄像头获取图像,用JPG编码,并将其从服务器传输到客户端。网络摄像头是立体声的,所以实际上我有两个图像,左和右。在客户端中,当我收到图像时,我会对其进行解码,并生成一个立体图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函数的支持。
因此,有另一种方法可以在JPG中编码cv:Mat obj,而不会产生这种不良影响,也不会增加图像的大小?
如果你的服务器只用作图像存储,你可以向服务器发送2个原始立体图像(压缩),并在需要时生成Anaglyph。我认为,如果你从服务器获取图像对(JPEG),然后生成Anaglogh(客户端),它将不会出现重影。可能是组合的压缩图像对小于字形.png
。
我假设浮雕编码是使用线交错将两侧组合成一个图像。
您正在使用JPEG压缩图像。该算法经过优化,可以压缩来自相机的"类似照片"的真实世界图像,并且在这些图像上效果非常好。
"类照片"和其他图像在图像压缩方面的区别在于图像中出现的频率
粗略地说,在"类照片"图像中,高频部分相对较小,并且大多对图像内容不重要
所以高频可以被安全地压缩。
如果两个帧逐行交错,这将创建具有非常强的高频部分的图像。
JPEG算法丢弃了大部分不重要的信息,但因为它实际上很重要,这会导致相对较强的伪影。
JPEG基本上就是对这类图像"不起作用"。
如果您可以将anaqlyph图像的编码更改为并排,或者将完整图像左右交替,JPEG压缩应该可以正常工作。
这是你的选择吗?
如果没有,事情会变得更加复杂。如果你需要良好的压缩,一个问题是,那些非常适合压缩高频图像的算法在压缩"类照片"数据方面真的很糟糕,而这些数据仍然是你图像的大部分。
因此,请非常努力地将编码更改为非行交错,这应该比其他选项容易一个数量级左右。