Mat 数据类型指针ptr 的使用
2017-08-29 21:25
232 查看
声明
1)本文为论文阅读记录,主要用于分享和学术交流2)若有错误,欢迎各位大牛吐槽,如有版权问题请联系:874870841@qq.com
这是第二次碰到这个指针
以下代码摘自高博slambook 中project 0.1 关于读取深度数据的函数
double Frame::findDepth ( const cv::KeyPoint& kp ) { int x = cvRound(kp.pt.x); int y = cvRound(kp.pt.y); ushort d = depth_.ptr<ushort>(y)[x]; if ( d!=0 ) { return double(d)/camera_->depth_scale_; } else { // check the nearby points int dx[4] = {-1,0,1,0}; int dy[4] = {0,-1,0,1}; for ( int i=0; i<4; i++ ) { d = depth_.ptr<ushort>( y+dy[i] )[x+dx[i]]; if ( d!=0 ) { return double(d)/camera_->depth_scale_; } } } return -1.0; }
这里的 depth_.ptr(y)[x] 就是指向depth _ 的第y 行的第x个数据,数据类型为无符号的短整型。
参考 博客
这里扩展下,如下代码:
cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600 uchar * data00 = image.ptr<uchar>(0); uchar * data10 = image.ptr<uchar>(1); uchar * data01 = image.ptr<uchar>(0)[1];
解释:
定义了一个Mat变量image。
data00是指向image第一行第一个元素的指针。
data10是指向image第二行第一个元素的指针。
data01是指向image第一行第二个元素的指针。
使用上面的代码举例:image有400行,有400*600个像素。假设现在你想得到第3行第42个像素的指针,如果你写成:
uchar * data = image.ptr<uchar>(3*image.cols + 41);
这样写是错误的,会出现上面的错误。你得到的不是第3行第42个像素的指针,而是第(3×image.cols + 41)行第0个像素的指针,因为没有(3×image.cols + 41)行,所以没有这个指针,所以错误。
正确的写法:
uchar * data = image.ptr<uchar>(3)[41];
相关文章推荐
- OpenCV Mat数据类型指针ptr的使用
- OpenCV Mat数据类型指针ptr的使用
- OpenCV Mat数据类型指针ptr的使用
- OpenCV Mat数据类型指针ptr的使用
- OpenCV Mat数据类型指针ptr的使用
- 访问cv::Mat中的数据时遇到的指针类型问题
- 黑马程序员——C语言中指针与其他数据类型的结合使用
- 一个关于指针+记录数据类型的使用技巧
- 使用void指针给函数传递不同的数据类型
- osg源码中的ref_ptr operator unspecified_bool_type() 指向类数据成员的指针&类转化为另一类型(如自定义的C类转化为int)
- C#中使用指针转换数据类型[C#/unsafe]
- (转)C#中使用指针转换数据类型[C#/unsafe]
- sizeof关于数组、指针、基本数据类型的使用
- Mat中数据指针的使用
- 使用python向C语言的链接库传递数组、结构体、指针类型的数据
- VC下使用OpenCV最好先修改一下结构体IplImage中的数据指针imageData的类型...
- 访问cv::Mat中的数据时遇到的指针类型问题
- C#中使用指针转换数据类型[C#/unsafe]
- memcpy函数 & 使用泛型指针交换任何类型数据
- 【OpenCV学习笔记】之二:Mat使用的潜规则----对数据类型敏感