从数组给cv::Mat 赋值的坑

从数组给cv::Mat 赋值的坑

最近做一个项目,需要在一个类里对一个cv::Mat的对象进行初始化。

于是写了一个init函数,如下:

void KalmanFilter1::init(cv::Rect &realRectBox) {
	//initial kalman filter
	this->kalmanFilter = cv::KalmanFilter(4, 2, 0,CV_32F);

	//
	float fltTransitionMatrixValues[4][4] = {
			{1,0,1,0},
			{0,1,0,1},
			{0,0,1,0},
			{0,0,0,1} };
        //set Transition Matrix	
	kalmanFilter.transitionMatrix = cv::Mat(4, 4, CV_32F, fltTransitionMatrixValues); 
        ...
}

然后又在其他地方输出kalmanFilter.transitionMatrix,

void KalmanFilter1::testShow(cv::Rect &rectBox) {
	std::cout << kalmanFilter.transitionMatrix << std::endl;
}

发现是乱数据:

最后发现原因是,cv::Mat用数组进行初始化时,拿到的是数组的指针。所以出了init()函数作用域,数组fltTransitionMatrixValues就被delete掉了。所以,如果硬是要用数组赋值的话,数组应该在整个区域都有效,则可以直接写成类属性。

class KalmanFilter1 {
public:
	cv::KalmanFilter kalmanFilter;  //cv kalman filter
	float fltTransitionMatrixValues[4][4] = {
			{1,0,1,0},
			{0,1,0,1},
			{0,0,1,0},
			{0,0,0,1} };
	...
};

然后,在init()函数里才可以赋值。

总结,cv::Mat用数组初始化是拿到了数组的指针,需要注意变量的作用域问题。

posted @ 2021-09-16 10:48  存敌存戒  阅读(615)  评论(0)    收藏  举报