博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cv::Mat ptr 和 at 注意事项
阅读量:4041 次
发布时间:2019-05-24

本文共 1273 字,大约阅读时间需要 4 分钟。

声明了一个cv::Mat cloud(1, 1000, CV_32FC4)

然后Point的定义如下

struct Point    {        union        {            float data[4];            struct { float x, y, z, w; };        };    };

然后我想取第i个point的指针

query = flann::Matrix
(reinterpret_cast
(cloud.ptr
(i)), 1, 3);

结果 是错误的

正确的方式 应该为

query = flann::Matrix
(reinterpret_cast
(cloud.ptr
(0, i)), 1, 3);

原来对于ptr来说只输入1个参数代码取第几行的地址

但是at就不一样了, 其实输入1个参数还是能返回正确的结果, 这是为什么呢?

看看opencv 的源码吧

template
inline _Tp* Mat::ptr(int y){ CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) ); return (_Tp*)(data + step.p[0]*y);}
template
inline _Tp& Mat::at(int i0){ CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)(size.p[0]*size.p[1]) && elemSize() == CV_ELEM_SIZE(DataType<_Tp>::type) ); if( isContinuous() || size.p[0] == 1 ) return ((_Tp*)data)[i0]; if( size.p[1] == 1 ) return *(_Tp*)(data + step.p[0]*i0); int i = i0/cols, j = i0 - i*cols; return ((_Tp*)(data + step.p[0]*i))[j];}

但是为什么第一个错误的调用没有触发

CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) );

很奇怪

另外

cloud.ptr
(i)[j] = cloud.at
(i,j)

转载地址:http://oaxdi.baihongyu.com/

你可能感兴趣的文章
socket编程中select的使用
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>