OpenCV學習筆記(五十六)

看過OpenCV源代碼的朋友,肯定都知道很多函數的介面都是InputArray或者OutputArray型的,這個介面類還是很強大的,今個就來說說它們的那些事。

InputArray這個介面類可以是Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>、vector<Mat>。也就意味著當你看refman或者源代碼時,如果看見函數的參數類型是InputArray型時,把上訴幾種類型作為參數都是可以的。

有時候InputArray輸入的矩陣是個空參數,你只需要用cv::noArray()作為參數即可,或者很多代碼里都用cv::Mat()作為空參。

這個類只能作為函數的形參參數使用,不要試圖聲明一個InputArray類型的變數

如果在你自己編寫的函數中形參也想用InputArray,可以傳遞多類型的參數,在函數的內部可以使用_InputArray::getMat()函數將傳入的參數轉換為Mat的結構,方便你函數內的操作;必要的時候,可能還需要_InputArray::kind()用來區分Mat結構或者vector<>結構,但通常是不需要的。例如:

[cpp] view plaincopy

  1. voidmyAffineTransform(InputArray_src,OutputArray_dst,InputArray_m)
  2. {
  3. Matsrc=_src.getMat(),m=_m.getMat();
  4. CV_Assert(src.type()==CV_32FC2&&m.type()==CV_32F&&m.size()==Size(3,2));
  5. _dst.create(src.size(),src.type());
  6. Matdst=_dst.getMat();
  7. for(inti=0;i<src.rows;i++)
  8. for(intj=0;j<src.cols;j++)
  9. {
  10. Point2fpt=src.at<Point2f>(i,j);
  11. 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);
  12. }
  13. }

至於有的源代碼里使用InputArrayOfArrays作為形參,不用慌張,其實它和InputArray是一樣一樣一樣的。

OutputArray是InputArray的派生類。使用時需要注意的問題和InputArray一樣。和InputArray不同的是,需要注意在使用_OutputArray::getMat()之前一定要調用_OutputArray::create()為矩陣分配空間。可以用_OutputArray::needed()來檢測輸出的矩陣是否需要被計算。有時候傳進去的參不是空就不需要計算

還有就是OutputArrayOfArrays、InputOutputArray、InputOutputArrayOfArrays都是OutputArray的別名而已

推薦閱讀:

新手如何學習UG NX
古典吉他技巧輪指學習―相關樂譜集合與練習指導
蒼燃九宮盲派命理學習之回復精編(4)
無量壽經科注第四回學習班  (第二一八集)

TAG:學習 | 筆記 | OpenCV |