OpenCV中,使用C++类的构造函数进行定义转换

OpenCV中采用了很多类似下面方式,在类的构造函数中动态进行定义转换

#include "stdafx.h"

class Mat {
public:
	int val;
	void init() {
		val = 100;
	}
};

class holder{
public:
	Mat* pMat;
	holder(Mat& test) {
		test.val = 101;
		pMat = &test;
	}
};

void testholder(holder hd) {
	hd.pMat->val = 200;
}

int main()
{
	Mat mat;
	mat.init(); 
	testholder(mat);

	return 0;
}

注意那个testholder(mat)函数,这里本来需要的是一个holder的对象,而实际我们传入了一个Mat的对象,holder在构造时,需要一个Mat对象的引用,于是定义的转换就发生了,一个新的holder的对象被构造出来,并且接收了mat作为其参数。

在OpenCV的源码中,这样的例子比比皆是,典型的如copyTo,他的定义是这样的,

void Mat::copyTo( OutputArray _dst ) const
{
    。。。
}

这里要求输入的参数是一个OutputArray,而实际上,我们是这样使用copyTo的,

Mat source = imread("image.jpg", 1);
...
Mat destination;
source.copyTo(m);
...

嗯,是不是想起c++中也有大量这样预定义的类,比如string这个模板类?其实最早从C++学习编程我们就开始应用了。

posted @ 2018-08-10 14:26  SpaceVision  阅读(34)  评论(0编辑  收藏  举报