昨天在使用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 | 1 | 2 | 3 | 4 |
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 通道