OpenCV UMat运营商

时间:2017-01-09 16:12:14

标签: c++ opencv

使用cv::Mat可以~使用cv::bitwise_not>来比较2个矩阵。

但是cv::UMat似乎没有这些运算符,可以理解的是你可以简单地执行cv::bitwise_not(umat,umat)(虽然我已经理解从矩阵到自身的复制效率不高,但如果我有正确的话,请更正(我错了),但如何比较2 cv::UMat矩阵,或cv::UMatcv::Scalar

2 个答案:

答案 0 :(得分:1)

TLDR使用OpenCV compare function

您可以使用.getMat()

cv::UMat A = cv::Mat(1000, 1000, CV_8UC3), B = cv::UMat(1000, 1000, CV_8UC3);
cv::randu(A, Scalar::all(0), Scalar::all(255));
cv::randu(B, Scalar::all(0), Scalar::all(255));
cv::UMat C = A.getMat(cv::ACCESS_READ) > B.getMat(cv::ACCESS_READ);

但是这并没有使用cv::UMat s'硬件加速。

相反,您应该只使用OpenCV compare function

cv::UMat A = cv::Mat(1000, 1000, CV_8UC3), B = cv::UMat(1000, 1000, CV_8UC3);
cv::randu(A, Scalar::all(0), Scalar::all(255));
cv::randu(B, Scalar::all(0), Scalar::all(255));
cv::UMat C;
cv::compare(A, B, C, CMP_GT);

答案 1 :(得分:0)

可能不是一个非常有效的答案,但从我的头脑中......

比较两个 cv :: UMat ,您可以将它们转换为Mat,然后使用 cv :: bitwisenot

cv :: UMat cv :: Scalar 进行比较,您可以将UMat转换为Mat,然后使用它:

Mat_<float> A(3,3); mf << 1,5,5,2,5,5,1,2,3;

// now use a simple MatExpr to get a mask:
Mat mask = (A == 5);

// show results:
cerr << A << endl;
cerr << mask << endl;

------------------------------

[1, 5, 5;
2, 5, 5;
1, 2, 3]
[0, 255, 255;
0, 255, 255;
0, 0, 0]

根据Mat是3,2还是1通道,调整标量。

希望它有所帮助!!