使用cv::Mat
可以~
使用cv::bitwise_not
或>
来比较2个矩阵。
但是cv::UMat
似乎没有这些运算符,可以理解的是你可以简单地执行cv::bitwise_not(umat,umat)
(虽然我已经理解从矩阵到自身的复制效率不高,但如果我有正确的话,请更正(我错了),但如何比较2 cv::UMat
矩阵,或cv::UMat
与cv::Scalar
?
答案 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通道,调整标量。
希望它有所帮助!!