OpenCV Mat数据类型指针ptr的使用
2016-06-19 02:53
1041 查看
OpenCV Mat
数据类型指针ptr
的使用
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.ptr指针,并且出现了下面这样的错误:(假设你使用的软件是Visual Studio 201x)
某某.exe中的 0x75065b68 处有未经处理的异常:Microsoft C++ 异常; 内存位置0x85e790处的cv::Exception。
这可能是因为你不理解image.ptr这个指针,犯了这样的错误:image.ptr(1);指的不是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];
所以要注意这一点:如果程序可以正常编译,但是运行时出错,很有可能是你给指针赋值的时候,索引值溢出指定范围,指针乱指,导致程序跑偏,所以只有在运行时才能发现错误。
cv::Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片 uchar * data000 = image.ptr<uchar>(0); uchar * data100 = image.ptr<uchar>(1); uchar * data001 = image.ptr<uchar>(0)[1]; uchar * data
cv::Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片 cv::Vec3b * data000 = image.ptr<cv::Vec3b>(0); cv::Vec3b * data100 = image.ptr<cv::Vec3b>(1); cv::Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1]; cv::Vec3b * data
相关文章推荐
- 关于指针的一些事情
- C# Pointer指针应用实例简述
- C和指针小结(推荐)
- C++智能指针实例详解
- 浅谈C++指针(必看)
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅谈c/c++中使用指针需要注意的问题
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- 深入理解c++指针的指针和指针的引用
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法