2017-01-09 1 views
2

Mit cv::Mat ein ~ für cv::bitwise_not oder > vergleichen 2 Matrizen verwenden können.OpenCV UMAT Betreiber

Aber cv::UMat scheint nicht diese Operatoren zu haben, verständlicherweise könnten Sie einfach cv::bitwise_not(umat,umat) tun (obwohl ich das Kopieren von einer Matrix zu sich selbst verstanden habe, ist nicht sehr effizient, korrigieren Sie mich, wenn ich falsch liege), aber wie Kann man 2 cv::UMat Matrizen oder eine cv::UMat mit einer cv::Scalar vergleichen? wahrscheinlich

Antwort

1

TLDR Verwendung OpenCV compare function

können Sie verwenden .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); 

Aber das ist nicht cv::UMat s'Hardwarebeschleunigung verwenden.

Stattdessen sollten Sie nur OpenCV compare function verwenden

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

Nicht eine sehr effiziente Antwort, aber von der Spitze von meinem Kopf ...

Vergleichen Sie zwei cv :: UMAT Sie sie in eine Matte umwandeln kann und dann cv :: bitwisenot verwenden.

Vergleichen cv :: UMAT mit cv :: Scalar, können Sie die UMAT konvertieren Matte und dann verwenden:

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] 

Je nachdem, ob die Matte 3,2 oder 1 Kanal Passe deinen Skalar an.

Hoffe es hilft !!

+0

so gibt es keine Möglichkeit, es zu tun, ohne dann zu einem normalen Mat zu kopieren? Ich hatte gehofft, das Beste aus der OpenCL-Beschleunigung zu machen, also dachte ich, Matrixoperationen würden unterstützt werden. –

+0

Es scheint, dass [getMat()] (https://software.intel.com/en-us/articles/opencv-30 -architecture-guide-for-intel-inde-opencv) ist effizienter als das Kopieren in eine ganze andere Mat –

+0

Yeah mit getMat() mit dem UMat ist effizienter, aber ich habe nicht wirklich OpenCL verwendet, so kann nicht viel sagen . –