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
。抱歉。
我无法摆脱 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
。抱歉。