C++ 将Qimage转换为cvMat 64FC3格式
我在互联网上搜索了很多,但我只找到了如何将Qimage转换为RGB格式,我想将Qimage转换为cv mat格式cv_64FC3。 当我使用CV_8UC3时,我的结果非常糟糕 这是我的密码: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 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;
}