1.使用Mat.ptr访问
这种方式在访问深度图中某个像素位置的深度很常用。由于一般深度图都是16位的,也就是unsigned short 的数据类型。如果访问的像素的坐标为(x, y) ,深度图的Mat 变量为depthImg ,那么访问方式如下:
ushort d = depthImg.ptr<ushort>(y)[x];
首先depthImg.ptr 得到的是访问每个像素的指针,但是由于内存中存储是以字节为单位,所以这个指针后面加了<ushort> 的模板,也就是声明了指针的访问单位是ushort ,也就是16位两个字节,这样在指针移动一个位置的时候就是指向 下一个像素的深度值了。
然后后面(y)[x] 这种写法其实没有见过,这里可以理解为先找到指向第y 行的行头的指针,然后[x] 找到这一行的偏移x 列的位置。
2.直接用Mat.at访问
比如在使用OpenCV中的PnP求解问题的时候,得到的是Mat 类型的旋转向量rvec 和平移向量tvec ,最后要通过这两个向量转化成Sophus::SE3 ,程序如下:
T_c_r_estimated_ = SE3(
SO3(rvec.at<double>(0,0), rvec.at<double>(1,0), rvec.at<double>(2,0)),
Vector3d( tvec.at<double>(0,0), tvec.at<double>(1,0), tvec.at<double>(2,0))
);
注意这种访问方式,模板中的double很重要,原因同上面1中讲的一样,因为这指明了其背后访问数据的指针每次移动一个位置在内存中移动的字节数,从而保证访问到正确像素位置的数据。
3.生成一个存储不同数据类型的Mat矩阵并赋初值
比如要生成相机的内参矩阵,相机的内存这些参数都已经存在fx 、fy 等这些变量中了,要使用这些变量生成一个Mat 内参矩阵。写法如下:
Mat K = ( cv::Mat_<double>(3,3)<<
ref_->camera_->fx_, 0, ref_->camera_->cx_,
0, ref_->camera_->fy_, ref_->camera_->cy_,
0,0,1
);
暂时记住吧,其中最重要的是cv::Mat_<double>(3,3) 这种写法。
|