基于opencv的对CV_16U深度图像MAT中某点的像素值提取问题

昨天在使用mc[i] = Point2d(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);//求中心点坐标之后,想提取对应的深度图像中该点的像素值,所以参考了以下博文:

https://blog.csdn.net/thunderstruck/article/details/70209005

https://blog.csdn.net/luxgang/article/details/78063933

使用at:depthin.at<ushort>(x,y)

编译通过,但是运行时候出现了:段错误 (核心已转储)的错误提示。

于是使用了各种方法解决,试过了各种方法,以为是因为我int16_t之类格式定义不对的,最后根据指针自己写了如下程序:

uint16_t *p; //建立指针
p = depthin.ptr<uint16_t>(m);//指针指向depthin图像第m行的开始
p=p+n;//指针+n,即指向此行第n列的格子
uint16_t ixel_val = *p; //获取此指针所指向的数据
cout<< ixel_val<<endl;

然后突然意识到:Mat的排列如下:

0 0 0 0 0
1        
2        

那么行对应的是y,列对应的是x。

所以之前的代码都没有问题,问题只是这里的x\y应该反过来:

所以提取(x,y)正确的方法是:

src.at<uint16_t>(y,x)

终于解决了。

另外记录下大佬分享的格式对应:

Mat每个格子内的数据格式-----------Mat定义
Mat_<uchar>---------CV_8U
Mat<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F
Mat_<double>--------CV_64F

img1.at<vec3b>(i,j)[0]= 3.2f;  // B 通道
img1.at<vec3b>(i,j)[1]= 3.2f;  // G 通道
img1.at<vec3b>(i,j)[2]= 3.2f;  // R 通道

猜你喜欢

转载自blog.csdn.net/qq_23670601/article/details/81351300