我正在尝试将两个Mat对象添加在一起,但是遇到错误。
这是工作代码:
Mat src1, src2, dst;
/// Read image ( same size, same type )
src1 = imread("lion.png");
src2 = imread("bluebell.png");
dst = src1 + 0.5 * src2;
imshow("Blend", dst);
waitKey(0);
return 0;
src1
和src2
都具有与CV_8UC3
相同的类型。但是当我尝试这个时:
Mat src1, src2, src3, dst;
/// Read image
src1 = imread("lion.png");
src2 = imread("bluebell.png", IMREAD_GRAYSCALE);
src2.convertTo(src3, COLOR_GRAY2RGB);
cout << "src1.type " << src1.type() << endl;
cout << "src2.type " << src2.type() << endl;
cout << "src3.type " << src3.type() << endl;
dst = src1 + 0.5 * src3;
imshow("Blend", dst);
waitKey(0);
return 0;
这不起作用。因为src2
和src3
都具有0
类型,即CV_8U
。但我希望src3
具有类型16
,即CV_8UC3
(根据here)。此代码带来此错误:
OpenCV错误:输入参数的大小不匹配(该操作既不是'array op array'(其中数组具有相同的大小和相同的通道数),也不是'array op scalar',也不是'scalar op array' )in cv :: arithm_op
如何将灰度图像转换为精确类型为CV_8UC3
的彩色图像?
您无法通过调用convertTo
更改频道数。根据reference:
所需的输出矩阵类型,或者更确切地说,由于数量的深度通道与输入的通道相同;如果rtype为负,则输出矩阵将具有与输入相同的类型。
[当矩阵具有一个灰度通道时,可以通过将[BGR]通道的这一分量放在新矩阵中,使用cv::merge
创建3个通道图像:
src1 = imread("lion.png");
src2 = imread("bluebell.png", IMREAD_GRAYSCALE); // one channel
src2.convertTo(src3, COLOR_GRAY2RGB);
cv::merge(std::vector<cv::Mat>{src3, src3, src3}, src3);
// blue, green,red as output 3-channels mat
dst = src1 + 0.5 * src3;