值得注意的OpenCV数据类型问题

来源:互联网 发布:营收数据分析 ppt模板 编辑:程序博客网 时间:2024/06/05 17:46

矩阵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 copyMat_<double> roiMap; tempMap.copyTo(roiMap);

函数形参

经实践发现,OpenCV中的部分库函数形参类型对float 类型比较“专情”,而不支持double类型。这里所说的不支持是指编译时不报错,而运行报错。逐步调试至OpenCV源码中相应位置,就可发现原因是这些函数对double类型不支持。我所遇到的此类函数总结如下:

1 solvePnPRansac 以及 solvePnP

solvePnPRansac 函数原型如下,空间点输入objectPoints 和图像点输入imagePoints 的数据类型必须要是float 型(Point2fPoint3f ),而不能是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 samplesMat_<float> samples = Mat(PtNum, 3, CV_32F);inputSamples(samples);  //! fill samples with sample datacv::flann::Index_<float> flannIndex(samples, cvflann::KDTreeIndexParams(4));//! index query : to find the closest pointMat_<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相关类型,程序运行时就会报错。

0 0
原创粉丝点击