将Qimage转换为cvMat 64FC3格式

convert Qimage to cvMat 64FC3 format

本文关键字:64FC3 格式 cvMat Qimage 转换      更新时间:2023-10-16

我在互联网上搜索了很多,但我只找到了如何将Qimage转换为RGB格式,我想将Qiimage转换为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

不确定坏结果是什么意思,但您假设QImage也将图像加载为OpenCV(BGR)。在文档中,它告诉您他们使用ARGB

所以,知道这一点,你有两个选择:

  1. 使用函数convertToFormatQimage转换为QImage::Format_RGB888,然后不需要这行cvtColor(tmp, result,CV_BGR2RGB);,因为它已经是RGB
  2. 创建cv::Mat时使用CV_8UC4,然后使用split and join或mixchannels丢弃第一个通道(通道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; 
}