2016-08-20 3 views
1

Я работаю над домашней работой для своего класса обработки цифровых изображений, и я использую OpenCV с QT Framework.QWidget рисует искаженный угловой QImage

Я создал класс ImageDisplay, который является подклассом класса QWidget.

Я использую OpenCV для управления полутоновым изображением, а затем создаю объект QImage объекта Mat. После этого я использую QWidget::drawImage(), чтобы нарисовать изображение. Но иногда это показывает искаженное, угловатое изображение.

Я экспериментировал и обнаружил, что он имеет какое-то отношение к размерам изображения.

Например, это изображение с 320x391 пикселей визуализируется обычно The image with 320x391 pixels is rendered normally

Но если изменение размерности к 321x391 (с помощью Gimp), он показывает, как это: 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_ image – 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