簡體   English   中英

在cv :: mat和Qimage之間進行轉換會使程序崩潰

[英]Convert between cv::mat and Qimage would make the program crash

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"    

#include <QtGui>

//make QImage point to the contents of cv::Mat
inline QImage const mat_to_qimage_ref(cv::Mat &mat)
{
  return QImage((unsigned char*)(mat.data), mat.cols, mat.rows, mat.step1(), QImage::Format_RGB32);
}

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QImage img("lena2.jpg");
  cv::Mat mat(img.height(), img.width(), CV_8UC4, img.bits(), img.bytesPerLine());
  QImage img = mat_to_qimage_ref(mat); //#1
  //QImage img2((unsigned char*)(mat.data), mat.cols, mat.rows, mat.step, QImage::Format_RGB32); #2

  QLabel label;
  label.setPixmap(QPixmap::fromImage(img)); //crash at here
  label.show();

  return a.exec();
}

(#2)沒關系,但#1會出現未定義的行為?(我的情況是崩潰)

此外,如果你使用它作為下面的代碼,它沒關系

 cv::Mat img = cv::imread("lena2.jpg");
 QLabel label;
 label.setPixmap(QPixmap::fromImage(mat_to_qimage_ref(img)));
 label.show();

不知道發生了什么,與周期依賴有關的事情?

你的功能應該是這樣的:

    QImage mat_to_qimage_ref(const cv::Mat3b &src) {
        QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
        for (int y = 0; y < src.rows; ++y) {
                const cv::Vec3b *srcrow = src[y];
                QRgb *destrow = (QRgb*)dest.scanLine(y);
                for (int x = 0; x < src.cols; ++x) {
                        destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
                }
        }
        return dest;
    }

如果您不想復制圖像數據,只需為數據創建新的QImage標頭,請嘗試以下操作:

Mat mat = Mat(...);

QImage qImage = QImage(
    (const uchar*)(mat.data),
    mat.cols,
    mat.rows,
    mat.step1(),
    QImage::Format_ARGB32); // if you have no alpha channel (CV_8UC3),
                            // you can use Format_RGB888

另請注意,OpenCV通常使用BGR通道順序,您可以使用rgbSwapped()來解決此問題,但我不知道是否通過此函數調用復制了數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM