C++ OpenCV c++;断言

C++ OpenCV c++;断言,c++,opencv,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 fun

我一直在为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 = 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 
我认为我通过将输出数组转换为CV_8U来明确指定它(如果我是正确的,这里diff_im是输出数组,对吗?)。另外,当我在运行时打印diff_im的类型信息时,它会显示为“5”,这意味着我已经明确指定了“diff_im”的类型

我错了吗?有什么建议吗

OpenCV版本:2.4.8
提前感谢。

gray\u im
的类型为5,而
prev\u im
的类型为0。您可能忘记正确初始化
prev\u im
,即:

prev_im = cv::Mat::zeros(gray_im.size(), gray_im.type());

更新#1:

那么,
dst=src1-src2
相当于
subtract(dst,src1,dst)
。参数
dst
OutputArray
,仅用于输出功能参数。
dst
的类型不能由
运算符定义-
subtract()
通过其参数
dtype
提供了这种可能性,请参阅

如果未给出
dtype
,并且两个输入参数都是数组,则
src1.type()
必须等于
src2.type()
,请参阅

因此,您应该覆盖
操作符-
,如下所示:

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

然而,断言指出,当加法/减法/乘法/除法函数中的输入数组具有不同类型时,必须显式指定输出数组类型,这意味着(我认为)我可以处理不同类型的输入,但在这种情况下,您必须指定我将编写的类型。。如果我是正确的,在本例中,输出是diff_im,它的类型是显式指定的(在本例中是5)。对吧?好的,我试试看。我会在今天结束前告诉你结果。此外,是否有任何原因需要不间断地更改图像类型?不,没有任何原因,它将与
dtype=CV_8U
一起工作,但我不确定
subtract
是否会处理溢出,或者对延迟回复表示歉意。似乎解决了这个问题。提前谢谢。