[筆記] opencv / mat::foreach

底下資訊適用於 OpenCV 3.1 版,其他版本請以官方文件說明為主。

OpenCV 的 Mat 類別有一個有趣的 member function, 叫做 forEach.
根據 OpenCV reference 的說法,這個 function 會平行地對所有的 element 進行作用。

Invoke with arguments functor, and runs the functor over all matrix element.
The methods runs operation in parallel. Operation is passed by arguments. Operation have to be a function pointer, a function object or a lambda(C++11).

在 OpenCV 的基礎類別中也只有這一 member function 吃 functor.


Example: (Mat Transpose)

1
2
3
4
5
6
7
8
9
10
Mat origin {100, 300, CV_8UC3};
Mat transp {300, 100, CV_8UC3};


auto trans_op = [origin] (Vec3b& val, const int * pos)
{
val = origin.at<Vec3b>(pos[1], pos[0]);
};

transp.forEach<Vec3b>(trans_op); // i.e, transp = origin.t();

在我自己的環境 (Intel i7-8550U, build with TBB) 裡一張 500 x 395 的圖檔,上述的例子基本上都會比原生的 origin.t() 或是 transpose(origin, transp) 快 150 倍以上。