OpenCV中InputArray和OutputArray使⽤⽅法
看过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<>结构,但通常是不需要的。例如:
1void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m)
2 {
3
4 Mat src = _Mat(), m = _m.getMat();
5 CV_Assert( pe() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) );
6 _ate(src.size(), pe());
7 Mat dst = _Mat();
8for( int i = 0; i < ws; i++ )
9for( int j = 0; j < ls; 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 }
⾄于有的源代码⾥使⽤InputArrayOfArrays作为形参,不⽤慌张,其实它和InputArray是⼀样⼀样⼀样的。
rows函数的使用方法及实例OutputArray是InputArray的派⽣类。使⽤时需要注意的问题和InputArray⼀样。和InputArray不同的是,需要注意在使⽤
_OutputArray::getMat()之前⼀定要调⽤_OutputArray::create()为矩阵分配空间。可以⽤_OutputArray::needed()来检测输出的矩阵是否需要被计算。有时候传进去的参不是空就不需要计算
还有就是OutputArrayOfArrays、InputOutputArray、InputOutputArrayOfArrays都是OutputArray的别名⽽已
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论