OpenCV中将MAT类型的对象作为InputArray类型的对像传递给函数

Posted NodYoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV中将MAT类型的对象作为InputArray类型的对像传递给函数相关的知识,希望对你有一定的参考价值。

初学OpenCV发现,发现这样一种情况:

void imshow(const string& winname, InputArray mat);

明明是InputArray类型的形参,而我们一般都使用Mat类型的实参来直接传递。
这是怎么回事呢?
说白了,这是一个类型的对象转换为另一个类型的对象。使用C++中的类型转换构造函数来完成,关于类型转换构造函数这里有个链接,仅供参考:(C++数据类型转换以及转换构造函数)http://c.biancheng.net/cpp/biancheng/view/221.html
我们查看OpenCV源码中_InputArray类的定义,也确实是这样,如下:

class CV_EXPORTS _InputArray

public:
 ......

    _InputArray(const Mat& m);//在这里
    _InputArray(const MatExpr& expr);
 ......
    int flags;
    void* obj;
    Size sz;
;

再点进去:

/*********************************\\
       Input/Output Array
\\*********************************/

......

_InputArray::_InputArray(const Mat& m) : flags(MAT), obj((void*)&m) 
_InputArray::_InputArray(const vector<Mat>& vec) : flags(STD_VECTOR_MAT), obj((void*)&vec) 

......

至此,我们已大致了解OpenCV的函数形参中一个类型对象转换为另一个类型对象的方法。
下面再给个小例程:

#include <iostream>
using namespace std;

class B


;
class A

public:
    A(B b)
    
        cout << "Type cnversion constructor" << endl;
    
    A(A& a)//这个是复制构造函数,这里没有使用。
    
        cout << "Copy constructor" << endl;
    
;

int ok(A a)

    cout << "ok" << endl;
    return 0;

int main()

    B b;
    ok(b);//此处将B类型的对象转换为A类型的对象传递给函数了
    return 0;

以上是关于OpenCV中将MAT类型的对象作为InputArray类型的对像传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Opencv 中将数据放入 Mat 对象中

在YUV_420_888中将图像从Android发送到OpenCV Mat中的JNI的最有效方式

OpenCV中各种类型Mat数据读取

如何使用 C# 脚本在 Unity 中将 OpenCV Mat 转换为 Texture2D?

我可以以任何方式从 OpenCV 对象取消引用中将数据分配给双重函数返回检索吗?

opencv中Mat类型数据操作与遍历