我正在使用OpenCV函数,该函数从两个单通道矩阵中获取匹配元素,并为您提供仅包含该元素的结果数组。该函数称为compare
cv::compare(maskMat, cv::GC_FGD, result, cv::CMP_EQ);
maskMat
是我的矩阵,其中包含0
,1
,2
或3
的任何值。
cv::GC_FGD
只是一个矩阵,每个元素都等于1。
cv::CMP_EQ
是一个标志,用于检查两个元素是否相等。
我还想采用cv::GC_PR_FGD
的任何值,即3
。所以基本上,我希望我做(cv::GC_FGD || cv::GC_PR_FGD)
之类的事情,为我的新结果矩阵取任何值为1
或3
的元素。
有一种简单的方法吗?感谢
答案 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
是一个矩阵表达式,它通过对两个输入矩阵执行逐位运算来计算输出矩阵。由于两个输入矩阵仅由0
和255
值组成,因此可以有效地创建所需的输出。
你也可以用适当的矩阵表达式替换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);
希望有所帮助!