我是 OpenCV 的新手,所以我想我犯了一些愚蠢的错误。
首先,我创建了一个 CV_8U
类型的空 cv::mat
矩阵,mask
并用零填充它。然后,我通过检查 CV_32FC1
类型 cv::mat
矩阵 croppedDifferenceImage
中的值,用 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
的文档:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
Parameters:
- src – input array (single-channel, 8-bit or 32-bit floating point).
- dst – output array of the same size and type as src.
因此,由于您说 croppedDifferenceImage
是 CV_32FC1
类型,因此 mask
输出变量将被重新分配并成为 CV_32FC1 类型
以及(不管你之前初始化它,因为它是一个不正确的类型)。
接下来,您将此掩码传递给 cv::mean
,它(根据断言)需要掩码:
- 不能为空
- 为 CV_8U 类型(该特定检查与 channel 数无关)。
因此,为了解决这个问题,您需要转换(使用 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
的建议。
我是一名优秀的程序员,十分优秀!