我无法摆脱OpenCV中的此错误:



我通过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返回一个1通道蒙版(每个像素的值),因此要执行按位运算,只需将蒙版转换回3通道图像:

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

编辑:正如Berak所说,要更改 channel 数,您必须使用cvtColor,而不是Mat::convertTo。对于那个很抱歉。

关于c++ - OpenCV inRange更改Mat类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28150724/

10-13 08:19