C++ 将Qimage转换为cvMat 64FC3格式

C++ 将Qimage转换为cvMat 64FC3格式,c++,qt,opencv,qimage,opencv-mat,C++,Qt,Opencv,Qimage,Opencv Mat,我在互联网上搜索了很多,但我只找到了如何将Qimage转换为RGB格式,我想将Qimage转换为cv mat格式cv_64FC3。 当我使用CV_8UC3时,我的结果非常糟糕 这是我的密码: QImage myImage; myImage.load("C://images//PolarImage300915163358.bmp"); QLabel myLabel; myLabel.setPixmap(QPixmap::fromImage(myImage)); //myLabel.show()

我在互联网上搜索了很多,但我只找到了如何将Qimage转换为RGB格式,我想将Qimage转换为cv mat格式cv_64FC3。 当我使用CV_8UC3时,我的结果非常糟糕

这是我的密码:

QImage myImage;
myImage.load("C://images//PolarImage300915163358.bmp");

QLabel myLabel;
myLabel.setPixmap(QPixmap::fromImage(myImage));

//myLabel.show();

cv::Mat image1 = QImage2Mat(myImage);



Mat img;

image1.convertTo(img, CV_64FC3, 1.0 / 255.0);
下面是我使用的函数:

cv::Mat QImage2Mat(QImage const& src)
{
     cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine());
     cv::Mat result; // deep copy just in case (my lack of knowledge with open cv)
     cvtColor(tmp, result,CV_BGR2RGB);
     return result;
}

请帮助我,我对opencv和Qt都是新手,不知道你的意思是什么,结果不好,但你假设它也会以opencv(
BGR
)的形式加载图像。在文档中,它告诉您他们使用了
ARGB

因此,了解这一点,您有两种选择:

  • 使用函数将
    QImage::Format_RGB888
    转换为
    QImage
    ,然后使用此行
    cvtColor(tmp、result、CV_bgr2; rgb)不需要,因为它已经在RGB中
  • 创建
    CV::Mat
    时使用
    CV_8UC4
    ,然后使用拆分和合并或混合通道删除第一个通道(通道alpha)

  • 我发现了问题所在,事实上,Qimage有第四个通道用于alpha,所以当您读取Qimage数据时,需要将其放入CV_8UC4中

    代码如下:

    Mat QImage2Mat(const QImage& src) { 
        cv::Mat mat = cv::Mat(src.height(), src.width(), CV_8UC4, (uchar*)src.bits(), src.bytesPerLine()); 
        cv::Mat result = cv::Mat(mat.rows, mat.cols, CV_8UC3 ); 
        int from_to[] = { 0,0,  1,1,  2,2 }; 
        cv::mixChannels( &mat, 1, &result, 1, from_to, 3 ); 
        return result; 
    }