从数组给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用数组初始化是拿到了数组的指针,需要注意变量的作用域问题。

浙公网安备 33010602011771号