Я использую код, предложенный в ( как конвертировать OpenCV CV :: Mat в Qimage ) для отображения cv::Mat
в моем приложении Qt. Тем не менее, я получаю странные результаты. Черные части отображаются черным, но все остальные значения инвертированы.
Код конверсии:
QImage ImgConvert::matToQImage(Mat_<double> src)
{
double scale = 255.0;
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const double *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
unsigned int color = srcrow[x] * scale;
destrow[x] = qRgba(color, color, color, 255);
}
}
return dest;
}
Код дисплея:
void MainWindow::redraw()
{
static QImage image = ImgConvert::matToQImage(im);
static QGraphicsPixmapItem item( QPixmap::fromImage(image));
static QGraphicsScene* scene = new QGraphicsScene;
scene->addItem(&item);
ui->graphicsView->setScene(scene);
ui->graphicsView->repaint();
}
Щас пользуюсь if(color>0) color = 255-color;
чтобы исправить этот эффект, но я бы скорее понял, откуда он.
Кроме того, второй мини-вопрос: если я уберу static
декларации в redraw()
изображение удаляется из памяти сразу после выхода из метода. Это лучший способ исправить это, и у меня будут непредвиденные побочные эффекты при отображении нескольких кадров?
Я не знаю. Установка массива в первую очередь для меня звучит как более чистый способ, см. https://stackoverflow.com/a/3387400/1705967 , это может дать вам идеи.
Хотя я также с большим успехом использую решение Ypnos для цветных изображений. 🙂
Ах, а что касается второго вопроса, не беспокойтесь о QPixmap. Это делает данные изображения частными (клонируются, когда это необходимо), как я уже видел, так что вы не перепишите их по ошибке.
В случае, если у кого-то возникла эта проблема, я быстро и грязно исправил ее, вычтя значение пикселя в 256
:
QImage ImgConvert::matToQImage(Mat_<double> src)
{
double scale = 255.0;
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const double *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
unsigned int color = 256 - (srcrow[x] * scale);
destrow[x] = qRgba(color, color, color, 255);
}
}
return dest;
}
Это немного повредит изображение, хотя, изменяя его яркость на 1. Моей целью была визуализация, поэтому разница была незначительной для глаз, однако для некоторых приложений при обработке изображений это искажение могло быть критическим. Я не мог понять, почему это происходит, и, поскольку я спешил, я не смотрел дальше.