在OpenCV中,有两个代理类是经常出现的:InputArray和OutputArray,它巧妙地利用了C++的定义转换,辅助完成对矩阵的管理。
定义
typedef const _InputArray& InputArray;
typedef InputArray InputArrayOfArrays;
typedef const _OutputArray& OutputArray;
typedef OutputArray OutputArrayOfArrays;
typedef const _InputOutputArray& InputOutputArray;
typedef InputOutputArray InputOutputArrayOfArrays;
说明
InputArray是一个代理类,用于将只读输入数组传递到OpenCV函数中。
其中,输入数组是可以`Mat`, `Mat_`, `Matx`, `std::vector`, `std::vector`, `std::vector`, `std::vector`,`UMat`, `std::vector` or `double`。它也可以由矩阵表达式构造。
关于这个类,有一些关键点要注意:
(1)作为可选的输入参数,当需要输入数组或矩阵为空时,传递cv::noArray()即可,或者简单的使用cv::Mat() ,就像我们常做过的那样;
(2)该类仅用于传递参数。也就是说,我们通常不应该声明此类类型的本地成员和本地变量或全局变量;
(3)在函数内部, 我们可以通过_InputArray::getMat()方法构造一个数组(矩阵)的信息头(这不会拷贝数据);
(4)可以使用_InputArray::kind() 来对数据进行类别区分,比如到底是矩阵Mat 还是向量`vector`等.
同样,OutputArray有类似InputArray的性质,所以也不应该单独定义此类的成员,如果不需要计算某些输出数组,传入cv::noArray()即可,在应用上,可以用_OutputArray::needed()检查某些数组是否需要计算并输出。
下面是一个OpneCV源码注释中使用InputArray, OutputArray的例子,
void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m)
{
// 从输入数组(矩阵)中得到 Mat headers
Mat src = _src.getMat(), m = _m.getMat();
// CV_Assert(src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2));
CV_Assert(src.type() == CV_32FC2);
CV_Assert(m.type() == CV_32F);
CV_Assert(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(i, j);
dst.at(i, j) = Point2f(m.at(0, 0)*pt.x +
m.at(0, 1)*pt.y +
m.at(0, 2),
m.at(1, 0)*pt.x +
m.at(1, 1)*pt.y +
m.at(1, 2));
}
}
int main()
{
float m[3][2] = {
1,0,0,
0,1,0,
};
Mat mt(2, 3, CV_32F);
for (int i = 0; i
关注
打赏
- 对CSDN网站关于抄袭的投诉的处理建议
- Tesseract OCR训练时碰到的问题和解决方案
- VSCODE在Jetson Nano上打不上断点,无法调试python源码
- ROS2进阶:在windows10上用vs2019编译rviz2
- ROS2 ERROR: OpenGL 1.5 is not supported in GLRenderSystem::initialiseContext at C:\ci\ws\build...
- ROS2 error: can‘t find examples_rclcpp_minimal_subscriber/Release/wait_set_subscriber_library.lib
- 在windows上安装 chocolatey.1.1.0.nupkg
- Qt开发高级进阶:如何在显示时适合视窗宽度和高度(fitWidth+fitHeight)
- PySpark ERROR: Python in worker has different version 3.9 than that in driver 3.8
- cv2.imshow error: The function is not implemented. Rebuild the library with Windows...