我正在使用 ( 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;
来纠正这种效果,但我更愿意了解它的来源。
另外,还有第二个小问题:如果我删除 redraw()
中的 static
声明,当方法退出时图像会立即从内存中删除。这是解决此问题的最佳方法吗?如果我显示多个帧,是否会产生任何意想不到的副作用?
最佳答案
我不知道。首先为我设置一个数组听起来像是一种更简洁的方法,请参阅 https://stackoverflow.com/a/3387400/1705967 ,这可以给你一些想法。
虽然我也使用 Ypnos 的解决方案,并在彩色图像上取得了巨大成功。 :)
啊,至于第二个问题,不用担心 QPixmap。正如我所经历的那样,它将图像数据设为私有(private)(必要时进行克隆),因此您不会错误地覆盖它。
关于c++ - cv::Mat 到 QImage 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435210/