我正在使用(how to convert an opencv cv::Mat to qimage)中建议的代码在我的Qt应用程序中显示cv::Mat
。但是,我得到了奇怪的结果。黑色部分显示为黑色,但所有其他值都反转。
转换代码:
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()
声明,当方法退出时,图像会立即从内存中删除。这是解决这个问题的最佳方法,如果我显示多个帧,我是否会产生任何意想不到的副作用?
答案 0 :(得分:1)
我不知道。首先为我设置数组听起来更简洁,请参阅https://stackoverflow.com/a/3387400/1705967,它可以为您提供想法。
虽然我也使用Ypnos的解决方案在彩色图像上取得了巨大成功。 :)
啊,至于第二个问题,不要担心QPixmap。它使我的图像数据变得私密(必要时克隆),所以你不会错误地覆盖它。
答案 1 :(得分:0)
如果有人遇到此问题,我会通过将像素值减去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;
}
这会稍微破坏图像,但是将其修改为亮度。我的目的是可视化,因此差异对于眼睛来说可以忽略不计,但是对于图像处理中的某些应用,这种损坏可能是至关重要的。我无法找到为什么会发生这种情况,因为我很匆忙,所以我没有再看了。