2017-01-09 4 views
2

С cv::Mat можно использовать ~ для cv::bitwise_not или >, чтобы сравнить 2 матрицы.Операторы OpenCV UMat

Но cv::UMat, похоже, не имеет этих операторов, понятно, что вы могли бы просто сделать cv::bitwise_not(umat,umat) (хотя я понял, что копирование из матрицы само по себе не очень эффективно, исправьте меня, если я ошибаюсь), но как можно сравнить 2 cv::UMat матрицы, или cv::UMat с cv::Scalar?

ответ

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); 
0

Не очень эффективный ответ возможно, но с верхней части моей головы ...

Сравнить два резюме :: UMAT вы можете преобразовать их к мату, а затем использовать резюме :: bitwisenot.

Сравнить резюме :: UMAT с резюме :: скаляра, вы можете преобразовать UMAT в циновки, а затем использовать это:

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 канал , отрегулируйте свой Скаляр.

Надеюсь, это поможет!

+0

так что нет никакого способа сделать это без копирования на нормальный Мат тогда? Я надеялся максимально использовать ускорение OpenCL, поэтому я думал, что операции с матрицами будут поддерживаться –

+0

кажется, что с помощью [getMat()] (https://software.intel.com/en-us/articles/opencv-30 -architecture-guide-for-intel-inde-opencv) более эффективен, чем копирование в целое другое Mat –

+0

Да, использование getMat() с UMat более эффективно, однако я не использовал OpenCL, поэтому не могу сказать много , –

Смежные вопросы