InputArray和OutputArray的那些事
阿新 • • 發佈:2018-12-30
看過OpenCV原始碼的朋友,肯定都知道很多函式的介面都是InputArray或者OutputArray型的,這個介面類還是很強大的,今個就來說說它們的那些事。
InputArray這個介面類可以是Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>、vector<Mat>。也就意味著當你看refman或者原始碼時,如果看見函式的引數型別是InputArray型時,把上訴幾種型別作為引數都是可以的。
有時候InputArray輸入的矩陣是個空引數,你只需要用cv::noArray()
這個類只能作為函式的形參引數使用,不要試圖宣告一個InputArray型別的變數
如果在你自己編寫的函式中形參也想用InputArray,可以傳遞多型別的引數,在函式的內部可以使用_InputArray::getMat()函式將傳入的引數轉換為Mat的結構,方便你函式內的操作;必要的時候,可能還需要_InputArray::kind()用來區分Mat結構或者vector<>結構,但通常是不需要的。例如:
-
void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m)
- {
- Mat src = _src.getMat(), m = _m.getMat();
- CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) );
- _dst.create(src.size(), src.type());
- Mat dst = _dst.getMat();
- for( int i = 0; i < src.rows; i++ )
-
for( int j = 0; j < src.cols; j++ )
- {
- Point2f pt = src.at<Point2f>(i, j);
- dst.at<Point2f>(i, j) = Point2f(m.at<float>(0, 0) * pt.x + m.at<float>(0, 1) * pt.y + m.at<float>(0, 2);
- }
- }
至於有的原始碼裡使用InputArrayOfArrays作為形參,不用慌張,其實它和InputArray是一樣一樣一樣的。
OutputArray是InputArray的派生類。使用時需要注意的問題和InputArray一樣。和InputArray不同的是,需要注意在使用_OutputArray::getMat()之前一定要呼叫_OutputArray::create()為矩陣分配空間。可以用_OutputArray::needed()來檢測輸出的矩陣是否需要被計算。有時候傳進去的參不是空就不需要計算
還有就是OutputArrayOfArrays、InputOutputArray、InputOutputArrayOfArrays都是OutputArray的別名而已