OpenCV c ++断言

时间:2016-01-25 15:26:36

标签: c++ opencv

我一直在为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 提前谢谢。

1 个答案:

答案 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)。参数dstOutputArray,仅用于输出函数参数。 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