我是OpenCV的新手,所以我想我犯了一些愚蠢的错误。
首先,我创建一个空的cv::mat
类型的mask
矩阵CV_8U
,并将其填充为零。然后,通过使用CV_32FC1
检查cv::mat
类型croppedDifferenceImage
矩阵cv::threshold
中的值,以0或255填充矩阵。然后,我将mask
用作cv::mean
函数的参数。
cv::Mat mask = cv::Mat(croppedDifferenceImage.rows, croppedDifferenceImage.cols, CV_8U, cv::Scalar(0));
cv::threshold(croppedDifferenceImage, mask, 3.2, 255, CV_THRESH_BINARY);
double mean = cv::mean(croppedDifferenceImage, mask)[0];
但是我一直在崩溃与消息:
/build/buildd/opencv-2.4.8+dfsg1/modules/core/src/stat.cpp:565: error: (-215) mask.empty() || mask.type() == CV_8U in function mean
我究竟做错了什么?
最佳答案
根据 cv::threshold
的文档:
因此,由于您说croppedDifferenceImage
是CV_32FC1
类型,因此mask
输出变量将被重新分配并也变为CV_32FC1
类型(无论您之前对其进行了初始化,因为它是错误的类型)。
接下来,将此掩码传递给cv::mean
,它(根据断言)需要掩码:
因此,为了解决此问题,您需要在阈值化之后转换(使用
Mat::convertTo
)掩码:cv::threshold(croppedDifferenceImage, mask, 3.2, 255, CV_THRESH_BINARY);
mask.convertTo(mask, CV_8U)
double mean = cv::mean(croppedDifferenceImage, mask)[0];
另请参阅Miki's answer以获取有关仅对
cv::Mat
使用逻辑运算而不是调用cv::threshold
的建议。