如何根据opencv中的某些条件修改Mat的值?

how to modify values of Mat according to some condition in opencv?

在 Matlab 中 a(a>50)=0 可以将 a 中大于 50 的所有元素替换为 0。我想在 OpenCV 中对 Mat 做同样的事情。怎么做?

你想要的是用cv::threshold截断图像。

以下应该满足您的要求:

cv::threshold(dst, dst, 50, 0, CV_THRESH_TOZERO_INV);

这是函数定义

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)

http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#threshold

有时阈值不起作用,因为您可以使用不同种类的垫子。如果你的 Mat 类型支持 double,threshold 将会崩溃(至少在我的 android 工作室)。

你可以在这里找到比较: http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html

所以我使用函数比较:

Mat mask = new Mat(yourMat.rows(), yourMat.cols(), CvType.CV_64FC1);
Mat ones = org.opencv.core.Mat.ones(yourMat.rows(), yourMat.cols(), CvType.CV_64FC1);
Scalar alpha = new Scalar(50, CvType.CV_64FC1);
Core.multiply(ones, alpha, ones);

Core.compare(yourMat, zeros, mask, Core.CMP_LT);

这里我创建了一个所有点都只有 50 的矩阵。之后我将它与 yourMat 进行比较,使用 CMP_LT(小于)。因此,所有小于 50 的像素将在您的蒙版中变为 255,如果更大则变为 0。这是一个面具。所以你可以:

yourMat.copyTo(yourMat, mask);

现在所有大于 50 的像素都将为零,所有其他像素都有自己的值。

不行。为此,只需一行:

cv::Mat img = imread('your image path');
img.setTo(0,img>50);

就这么简单。