OpenCV inRange 改变 Mat 类型

OpenCV inRange changes Mat type

我无法摆脱 OpenCV 中的这个错误:

OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array')

我发现 Mat.type(); 我的所有 Mat(img) 都有类型 16 但在函数 inRange 之后我的 img3 将类型更改为 0。然后我不能使用函数 bitwise_and 因为它没有相同的类型。

如何将其转换为相同类型?

Mat img1 = imread(argv[1], 1);
Mat img2, img3, img4;

cvtColor(img1, img2, CV_BGR2HSV);
GaussianBlur(img2, img2, Size(15,15), 0); 
inRange(img2, Scalar(h_min_min,s_min_min,v_min_min), Scalar(h_max_min,s_max_min,v_max_min), img3); // now img3 changed type to 0
bitwise_and(img1, img3, img4); // img1.type()=16, img3.type()=0 ERROR

这是正常的,因为 inRange returns 一个 1 通道蒙版(每个像素一个值),因此要执行按位操作,只需将蒙版转换回 3 通道图像:

cvtColor(img3,img3,CV_GRAY2BGR);
bitwise_and(img1, img3, img4);// now both images are CV_8UC3 (=16)

编辑:如 Berak 所说,要更改频道数量,您必须使用 cvtColor,而不是 Mat::convertTo。抱歉。