【OpenCV】OpenCV輸入與屬性



OpenCV學習筆記(五十六)——InputArray和OutputArray的那些事core :http://blog.csdn.net/yang_xian521/article/details/7755101

OpenCV之Normalize:http://blog.csdn.net/ljh0600301217/article/details/8767914



OpenCV之channel:channels:通道,矩陣中的每一個矩陣元素擁有的值的個數,比如說 3 * 4 矩陣中一共 12 個元素,如果每個元素有三個值,那麼就說這個矩陣是 3 通道的,即 channels = 3。常見的是一張彩色圖片有紅、綠、藍三個通道。







看過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<>結構,但通常是不需要的。例如:

  1. void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m)  
  2. {  
  3.   
  4.     Mat src = _src.getMat(), m = _m.getMat();  
  5.     CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) );  
  6.     _dst.create(src.size(), src.type());  
  7.     Mat dst = _dst.getMat();  
  8.     forint i = 0; i < src.rows; i++ )  
  9.         forint j = 0; j < src.cols; j++ )  
  10.         {  
  11.             Point2f pt = src.at<Point2f>(i, j);  
  12.             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);  
  13.         }  
  14. }  
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的別名而已

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章