我一直在为opencv项目中的一些断言而苦苦挣扎。
首先我要转换Mat对象以确定它们的类型:
gray_im.convertTo(gray_im, CV_8U);
diff_im.convertTo(diff_im, CV_8U);
然后我做一个减法。这行是我得到断言的地方:
diff_im = gray_im - prev_im;
以下是断言:
OpenCV Error: Bad argument (When the input arrays in add/subtract/multiply/divide functions have different types, the output array type must be explicitly specified) in arithm_op, file /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/arithm.cpp, line 1313
当我打印有关我在减法中使用的图像的信息时;
diff_im. type: 5 rows: 600 cols 800
gray_im. type: 5 rows: 600 cols 800
prev_im. type: 0 rows: 600 cols 800
我认为我明确指定输出数组(如果我是正确的,这里diff_im是输出数组,对吗?)通过将其转换为CV_8U。另外,当我在运行时打印diff_im的类型信息时,它表示它是“5”,这意味着我已经明确指定了“diff_im”的类型。
我错了吗?有什么建议吗?
OpenCV版本:2.4.8 提前谢谢。
答案 0 :(得分:1)
gray_im
的类型为5,prev_im
的类型为0.您可能忘记正确初始化prev_im
,即:
prev_im = cv::Mat::zeros(gray_im.size(), gray_im.type());
更新#1:
好吧,dst = src1 - src2
相当于subtract(dst, src1, dst)
。参数dst
为OutputArray
,仅用于输出函数参数。 dst
无法定义operator-
的类型仅subtract()
通过其参数dtype
为其提供了可能性,请参阅here。
如果未给出dtype
并且两个输入参数都是数组,则src1.type()
必须等于src2.type()
,请参阅here。
所以你应该覆盖operator-
,如下所示:
cv::Mat src1(600, 800, CV_8U);
cv::Mat src2(600, 800, CV_32F);
cv::Mat dst;
//dst = src1 - src2; // --> this will give the same assert
cv::subtract(src1, src2, dst, cv::noArray(), CV_32F); // type of dst is CV_32F