深入理解OpenCV实用计算机视觉项目解析:OpenCV主要开发者和OpenCV社区的主要贡献者携手,深入解析OpenCV技术在计算机视觉项目中的应用,Amazon广泛好评。通过典型计算机视觉项目,系统讲解使用O...下载前务必先预览,自己验证一下是不是你要下载的文档!
52
2. 标i己位置细化
在找到正确的标记定位后,要旋转它的角点,使其符合标准顺序。
//sort the points so that they are always in the same order
II no matter the camera orientation
std: :rotate( marker.points.begin() . marker.points.begin() + 4 -
nRotations,
marker.points.end());
在检测到标记并对标记ID 解码后,需要细化它的角点。 此操作对下一步在三维空间估
计标记位置很有用。 可通过cv: :comerSubPix 函数按亚像素级精度来查找角点位置。 该函数
的用法为:
std: :vector preciseCorners(4 * good.Markers.size());
for (size_t i •O ; i
Marker& marker= goodMarkers[i];
for (int c=O;c<4;c++)
preciseCorners[i叫+cl = marker.points[c);
cv: :cornerSubPix (grayscale, preciseCorners, cvSize (5 , 5),
cvSize(-1,-1), cvTermCriteria(CV_TERMCRIT_ITER,30,0.1));
//copy back
for (size_ t i=O;i
Marker&marker = good.Markers[il;
for (int c=O;c<:4>
{
marker.points[c] = preciseCorners[i *4+c];
整个代码的第一步是为函数准备输入的数据,即复
制输入数组的顶点列表。 第二步是调用cv::comerSubPix ,
并将实际图像、顶点以及影响位置细化的质量和性能的
参数传递给此函数。 完成之后. 将细化位置复制给标记
角点,如右阁所示。
由于cornerSubPix 函数太复杂,在标记检测的前期
不会使用它。 在顶点较多的情况下,调用该函数的代价
很高,因此只针对有效的标记才调用它。