【发布时间】:2015-01-26 13:10:19
【问题描述】:
我无法摆脱 OpenCV 中的这个错误:
OpenCV 错误:输入参数的大小不匹配(操作是 既不是“数组操作数组”(其中数组具有相同的大小和类型), 也不是'array op scalar',也不是'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
【问题讨论】:
-
出于所有意图和目的,OpenCV 中的
inRange为您提供阈值二值图像。CV_8U类型,如果我没记错的话。尝试使用img3.convertTo(img3, CV_16U)或您需要的任何内容将其转换回所需的类型。 -
感谢您的快速响应,但在 img3.convertTo(img3, CV_16U) 之后类型为 2,在 img3.convertTo(img3, 16) 之后类型仍为 0
-
你想达到什么目的?将所有不在范围内的元素设置为零?而不是 bitwise_ 并尝试
img1.copyTo(img4,img3);并尝试imshow("img3", img3); cv::waitKey(0);来测试inRange是否给出了您想要的结果。 -
关于你之前的评论:
img3.convertTo(img3, CV_16U)只转换类型,不转换通道数。你需要的是 CV_16UC3 但你不能用.convertTo得到它,它不会做你所期望的。所以如果你真的想在所有 3 个通道上使用bitwise_and,你必须cv::merge一个向量,它是你的 img3 的 3 倍 16U 版本...
标签: c++ opencv mat bitwise-and