OpenCV CV_32FC1类型Mat通过data指针访问取值异常如何解决
OpenCV cv::Mat通过data指针遍历取值异常问题
声明的Mat对象如下:cv::Mat matr(src.rows, src.cols, CV_32FC1);
直接通过cout << matr打印时所有数据都在0-255区间,输出正常。
错误写法1
float* matrF= (float*)matr.data; for (int r=0; r<matrF.rows; r++) { for (int c=0; c<matrF.cols; c++) { std::cout<<matrF[r*matr.cols+c]<<std::endl; } }
问题:输出大量类似4.684e-42、2.223e-22的异常值。
错误写法2
for (int r=0; r<matrF.rows; r++) { for (int c=0; c<matrF.cols; c++) { std::cout<<matr.data[r*matr.cols+c]<<std::endl; } }
问题:输出随机乱码字符,无法得到正确数值。
需求
不使用OpenCV自带的元素访问方法,通过遍历matr.data获取cout << matr打印的正确元素值,禁止使用mat.at<float>和.step1()接口。
可行解决方案
修正遍历逻辑即可,实现代码如下:
for (int r=0; r<matr.rows; r++) { for (int c=0; c<matr.cols; c++) { float val = *((float*)matr.data + r * matr.cols + c); std::cout << val << std::endl; } }
问题原因
cv::Mat的data成员是uchar*类型,直接使用[]偏移时每次仅移动1字节,而CV_32FC1类型的每个元素占4字节,直接偏移会读取到错误的内存地址,导致乱码或异常浮点值- 之前的写法错误将
float*类型的matrF当成Mat对象调用rows/cols成员,实际行数和列数要从原Mat对象matr获取
内容的提问来源于stack exchange,提问作者0abc0cba0
相关产品推荐
相关产品推荐

