值得注意的OpenCV数据类型问题
2015-12-28 10:40
211 查看
矩阵Mat
OpenCV的数据类型Mat用起来十分方便,但是也有几点应该注意的问题:1 变量赋值
Mat类型变量之间的直接赋值操作,例如:mat_i = mat_j,实际上是一种软拷贝,即C++语法中的引用。两个变量将共享同一块内存,修改其中任意一个的值,另一个变量值也会相应的变化。如果需要硬拷贝,使用
Mat::copyTo()就可以实现。
2 掩膜赋值
Mat变量的眼膜赋值,如下示例代码。这其实也是一种软拷贝,而且更致命地是,若此时对roiMap取数据指针操作:double* data=(double*)roiMap.data,得到的数据内容并非掩膜区域的元素,而是按原始矩阵srcMat 的行列大小在索引矩阵元素。
Mat_<double> roiMap = Mat(srcMap, Rect(x0, y0, endC, width, height)); // soft copy Mat_<double> roiMap; tempMap.copyTo(roiMap);
函数形参
经实践发现,OpenCV中的部分库函数形参类型对float 类型比较“专情”,而不支持double类型。这里所说的不支持是指编译时不报错,而运行报错。逐步调试至OpenCV源码中相应位置,就可发现原因是这些函数对double类型不支持。我所遇到的此类函数总结如下:1 solvePnPRansac 以及 solvePnP
solvePnPRansac 函数原型如下,空间点输入objectPoints 和图像点输入imagePoints 的数据类型必须要是float 型(Point2f 和Point3f ),而不能是double 型。void solvePnPRansac(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec)
void solvePnP(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec)
2 索引系列函数
有时候我们需要对数据进行搜索,比如找最近点,使用KD树搜索或最近邻点搜索技术将大大提高搜索效率。OpenCV中就提供了此类Class和Functions,下面以一段Knn搜索示例代码予以说明://! build index structure of samples Mat_<float> samples = Mat(PtNum, 3, CV_32F); inputSamples(samples); //! fill samples with sample data cv::flann::Index_<float> flannIndex(samples, cvflann::KDTreeIndexParams(4)); //! index query : to find the closest point Mat_<float> queryMat = (Mat_<float>(1,3) <<queryPt.x, queryPt.y, queryPt.z); Mat indice(1,1, CV_32S); Mat dists(1,1, CV_32F); int knn = 1; flannIndex.knnSearch(queryMat, indice, dists, knn, cvflann::SearchParams(64)); int dstNo = indice.at<int>(0); Point3f clostetPoint (samples(dstNo,0),samples(dstNo,1),samples(dstNo,2));
以上就是调用OpenCV函数进行KD树索引结构建立以及执行索引的正确示例,如果将以上代码中所有的float相关类型替换成double相关类型,程序运行时就会报错。
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- 基于C++实现kinect+opencv 获取深度及彩色数据
- OpenCV 2.4.3 C++ 平滑处理分析
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- OpenCV学习笔记(二十五)——OpenCV图形界面设计Qt+VS2008
- 分享一些OpenCV实现立体视觉的经验
- 关于OpenCv图像变换与基本图形检测
- "应用程序正常初始化失败"-0xc0150002 解决办法
- OpenCV->HSV色彩空间
- opencv 内存泄露
- OpenCV函数cvFindContours
- OpenCV 2.3.1图像文件的读入和显示