我是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 的文档:



因此,由于您说croppedDifferenceImageCV_32FC1类型,因此mask输出变量将被重新分配并也变为CV_32FC1类型(无论您之前对其进行了初始化,因为它是错误的类型)。

接下来,将此掩码传递给cv::mean,它(根据断言)需要掩码:

  • 不能为空
  • 类型为CV_8U(该特定检查本身与通道数无关)。

  • 因此,为了解决此问题,您需要在阈值化之后转换(使用 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的建议。

    07-27 19:57