Qimage转cvMat 64FC3格式
convert Qimage to cvMat 64FC3 format
我在网上搜索了很多,但我只找到了如何将 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 的新手
不确定您所说的不良结果是什么意思,但您假设 QImage 也将图像加载为 OpenCV (BGR
)。在文档中它告诉你他们使用 ARGB
.
所以,知道这一点后,您有 2 个选择:
- 使用函数
convertToFormat
将 Qimage
转换为 QImage::Format_RGB888
,然后不需要此行 cvtColor(tmp, result,CV_BGR2RGB);
,因为它已经在 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;
}
我在网上搜索了很多,但我只找到了如何将 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 的新手
不确定您所说的不良结果是什么意思,但您假设 QImage 也将图像加载为 OpenCV (BGR
)。在文档中它告诉你他们使用 ARGB
.
所以,知道这一点后,您有 2 个选择:
- 使用函数
convertToFormat
将Qimage
转换为QImage::Format_RGB888
,然后不需要此行cvtColor(tmp, result,CV_BGR2RGB);
,因为它已经在 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;
}