2016-08-20 50 views
1

我正在为我的数字图像处理类做家庭作业,我正在使用OpenCV与QT框架。QWidget绘制扭曲的角度QImage

我创建了一个类ImageDisplay,它是QWidget类的子类。

我已经使用OpenCV来操纵灰度图像,然后从Mat对象中创建一个QImage对象。之后,我使用QWidget::drawImage()来绘制图像。但有时它会显示扭曲的,有角度的图像。

我在做实验,发现它与图像尺寸有关。

例如,对于320x391像素这个图像被正常再现 The image with 320x391 pixels is rendered normally

但是,如果变化的尺寸,以321x391(使用瘸子),它显示了这样的: The image with 321x391 pixels is rendered anormally

这是代码该paintEvent方法:

void ImageDisplay::paintEvent(QPaintEvent *){ 
    QPainter painter(this); 
    Mat tmp; 
    /* The mat in the next line is a Mat object that contains the image data */ 
    cvtColor(mat, tmp, CV_GRAY2BGR); 
    QImage image(tmp.data, tmp.cols, tmp.rows, QImage::Format_RGB888); 
    painter.drawImage(rect(), image); 
} 

有没有人有一个线索,这是什么问题,如何解决?

在此先感谢!

+1

你在哪里调整图像大小?看起来你改变了尺寸,但使用旧的数据缓冲区(旧的尺寸)。你可以看到你看着你的_tilted_图像的底部黑色行 – Miki

+0

哦,不。我没有使用代码调整图像大小。我只是使用gimp并改变了图像大小。 –

回答

3

我想你可能需要指定图像(每行字节数)在第四个参数QImage的创建时的步骤:

QImage image((const uchar*) tmp.data, tmp.cols, tmp.rows, tmp.step, QImage::Format_RGB888); 
+0

哇,这工作!非常感谢你!!你能解释一下这个参数的作用吗? –

+2

我会尝试...进行优化,opencv将图像存储在每行不等于图像宽度的确定数量的像素中(您可能需要14像素宽度的图像,但opencv会创建16像素宽度)。 Step参数告诉16,但cols告诉14。 – ikaro