使用OpenCV在JPG中对图像进行编码,避免重影效果
Encode image in JPG with OpenCV avoiding the ghost effect
我有一个应用程序(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压缩应该可以正常工作。
这是你的选择吗?
如果没有,事情会变得更加复杂。如果你需要良好的压缩,一个问题是,那些非常适合压缩高频图像的算法在压缩"类照片"数据方面真的很糟糕,而这些数据仍然是你图像的大部分。
因此,请非常努力地将编码更改为非行交错,这应该比其他选项容易一个数量级左右。
- 如何将stdout重定向到stderr
- 如何确定我已使用非编码文件到达 EOF?
- QTableView:endMoveRows在模型中重置水平页眉大小
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 编写时C++中的输入重定向问题
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何避免在仅标头库中C++类/变量重定义
- 使用已使用 java 编码的 openssl 解码数据
- 更改"child's parent's style sheet"时如何将孩子的样式表重置为 Qt 默认样式表?
- 通过重命名C++中的符号来减小二进制大小
- 切换大小写后如何阻止变量重置?
- 获取通过重定向传入的输入文件的名称?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 使用 ubuntu Linux 的 c++ 文件重定向和编码问题
- 添加派生类会导致重影错误
- 'PolishStack'不是类模板,虚函数重影错误
- 使用OpenCV在JPG中对图像进行编码,避免重影效果