使用 QImage 和 OpenCV 显示图像 [重复]

Posted

技术标签:

【中文标题】使用 QImage 和 OpenCV 显示图像 [重复]【英文标题】:Displaying an image with QImage and OpenCV [duplicate] 【发布时间】:2013-01-24 17:09:21 【问题描述】:

可能重复:Fastest method to convert IplImage IPL_DEPTH_32S to QImage Format_RGB32

我在使用 Qt 显示图像时遇到了一个奇怪的问题...我使用 OpenCV 读取视频帧并将其从 BGR 转换为 RGB。

video >> frameOrg;
cvtColor(frameOrg,frameOrg,CV_BGR2RGB);

然后我使用裁剪样式在图像上选择一个 ROI..

frame = frameOrg(roi);

我通过信号/插槽将选定的 ROI 发送到小部件进行显示.. 显示使用的 paintEvent()

image = QImage((const unsigned char*)frame.data,frame.cols,
               frame.rows,QImage::Format_RGB888);

QRectF target(0.0,0.0,image.width(),image.height());
QRectF source(0.0,0.0,image.width(),image.height());
QPainter painter(this);
painter.drawImage(target,image,source);

但是,每当我选择 ROI 的奇数值宽度和高度的某种组合时,我都会得到一个奇怪的显示,如下所示... 原图

所选投资回报率的图像

我需要做一些修改吗? windows 7显示有问题吗?使用imshow() 显示时相同的 ROI 显示正确...任何人帮助我..thanx 提前...

有效的实际代码

image = QImage((const unsigned char*)frame.data,frame.cols,
               frame.rows,frame.step,QImage::Format_RGB888);

【问题讨论】:

某处不是缺少 +1 吗?行i 总是左移i 列,这只是前一行缺少1 列的传播。 这种情况并不总是发生......仅对于某些组合,我得到了如此奇怪的结果...... 然后明确指出其中一些组合。 我已经讨论过这个here。 @karlphillip 这个问题显然不是那个问题的重复。它处理的是与这里描述的完全不同的问题。 【参考方案1】:

这可能是填充问题。你还没有说你的frame 变量的类型是什么,但是IPLImage 有一个widthStep 字段。将此构造函数用于 QImage

QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )

并将widthStep 作为bytesPerLine 参数传递。

【讨论】:

+1 我同意,这通常看起来像 4 字节对齐问题

以上是关于使用 QImage 和 OpenCV 显示图像 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

关于QImage和IplImage之间转换的实现

Mat与QImage互相转换

Opencv和Qt QImage格式转Mat

使用QT5绘制OpenCV3的Mat图像

使用QT5绘制OpenCV3的Mat图像

QImage OpenCV - setPixel 只有绿色和黑色