从一对数组中获取匹配的元素(C ++ / OpenCV)

时间:2015-03-29 04:54:23

标签: c++ arrays opencv

我正在使用OpenCV函数,该函数从两个单通道矩阵中获取匹配元素,并为您提供仅包含该元素的结果数组。该函数称为compare

cv::compare(maskMat, cv::GC_FGD, result, cv::CMP_EQ);

maskMat是我的矩阵,其中包含0123的任何值。

cv::GC_FGD只是一个矩阵,每个元素都等于1。

cv::CMP_EQ是一个标志,用于检查两个元素是否相等。

我还想采用cv::GC_PR_FGD的任何值,即3。所以基本上,我希望我做(cv::GC_FGD || cv::GC_PR_FGD)之类的事情,为我的新结果矩阵取任何值为13的元素。

有一种简单的方法吗?感谢

1 个答案:

答案 0 :(得分:1)

如果相应的比较返回255,则compare函数会生成一个值设置为true的输出数组。

您可以做的是使用两个步骤:
首先,执行两次单独比较,以获得具有相应true值的两个数组。 其次,使用Matrix Expression

组合两个矩阵
cv::Mat result0;
cv::Mat result1;

cv::compare(maskMat, cv::GC_FGD,    result0, cv::CMP_EQ); // Compare for equality to 1.
cv::compare(maskMat, cv::GC_PR_FGD, result1, cv::CMP_EQ); // Compare for equality to 3.

cv::Mat result = cmp0 | cmp1; // Combine the result of the comparisons
                              // by using bit-wise OR.

bit-wise OR是一个矩阵表达式,它通过对两个输入矩阵执行逐位运算来计算输出矩阵。由于两个输入矩阵仅由0255值组成,因此可以有效地创建所需的输出。

你也可以用适当的矩阵表达式替换compare函数,这些表达式只是==

cv::Mat cmp1 = maskMat == 1; // Compare for equality to 1.
cv::Mat cmp3 = maskMat == 3; // Compare for equality to 3.

cv::Mat result = max(cmp0, cmp1); // Combine the result of the comparisons
                                  // by using the max function.

上面使用的max函数与此情况下的按位OR一样有效。

由于矩阵表达式可以任意组合,实际上你可以把它全部放在一行:

cv::Mat result = (maskMat == 1) | (maskMat == 3);

希望有所帮助!