c++ - OpenCV 均值函数因从 OpenCV 阈值函数创建的掩码而崩溃?

标签 c++ opencv image-processing matrix threshold

我是 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.

因此,由于您说 croppedDifferenceImageCV_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 的建议。

关于c++ - OpenCV 均值函数因从 OpenCV 阈值函数创建的掩码而崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36555485/

相关文章:

python - 用于 OCR 的场景文本图像超分辨率

matlab - 在二值图像中找到给定像素的连通分量

matlab - imshow 不显示相同的图像

C++ OpenCV : Convert mat to base64 and vice versa

c++ - 在哪里放置用于重复程序的 do while 循环?

numpy - 如何计算图像中的 RGB 或 HSV channel 组合?

C++ 使用多个 strtok()

c++ - *绘制* std::vector<double> 的简单/最简单方法是什么?

c++ - 当 `delete` 使用非虚析构函数处理基类时,Clang 和 GCC 会做什么?

c++ - C++结构的字段大小