前言:最近写一份代码要对手指指根进行检测,即如下图标出指根:
用了多种方法,效果均不佳,最终自己想了个方法,私命名为重力落球法。
1.手指指根检测的常用方法
1.1凸缺陷检测(找凸包)
<<本部分代码引自:引用一>>
opencv函数原型:
//get hull
vector<int>hull;
vector<vector<Point>>hullS(2);
// Convexity defects
vector<vector<Vec4i>> defects(2);
convexHull( Mat(contours[maxIndex]), hullS[0],false);
convexHull( Mat(contours[maxIndex]), hull,false,false);
//注意convexityDefects中要求hull为vector<int>类型
convexityDefects(Mat(contours[maxIndex]),hull, defects[0]);
vector<Vec4i>::iterator d =defects[0].begin();
while( d!=defects[0].end() )
{
Vec4i& v=(*d);
int startidx=v[0];
Point ptStart( contours[maxIndex][startidx] ); // point of the contour where the defect begins
int endidx=v[1];
Point ptEnd( contours[maxIndex][endidx] ); // point of the contour where the defect ends
int faridx=v[2];
Point ptFar( contours[maxIndex][faridx] );// the farthest from the convex hull point within the defect
int depth = v[3] / 256; // distance between the farthest point and the convex hull
if(depth > 2)
{
line( dstImage, ptStart, ptFar, CV_RGB(255,255,255), 2 );
line( dstImage, ptEnd, ptFar, CV_RGB(255,255,255), 2 );
circle( dstImage, ptStart, 4, Scalar(255), 2 );
circle( dstImage, ptEnd, 4, Scalar(255), 2 );
circle( dstImage, ptFar, 4, Scalar(100), 2 );
}
d++;
}
结果:对于图像较为规整的效果好

图像不规整的效果则不好:

结果分析:在图像不规整中最初找凸包时出现了问题,手指上部分为平的,未能找到凸包的点,所以部分指根找不全。
1.2径向距离函数
- 方法:找到手掌中心,得到手掌中心到手掌边缘距离的曲线,之后求得四个极小值点就是手指指根所在。
- 问题:该方法的前提要保证手掌轮廓为光滑的,不能有小的缺陷,不然会找出许多极小值点。
比如下面的图片就存在许多锯齿点:

2.重力落球法
2.1分析
以上问题总结:
- 求图像凸包不准确
- 图像外边缘存在许多小的缺陷,而我们想要的是指关节间的缺陷
于是我们就联想到解决问题的方法类似于现实世界的重力:
- 在三座山峰中,在天上每隔一定距离扔下一个小球,那么最终这些小球都会落在山坡的谷底。我们这个问题就变成了模拟题。


- 在手指指根检测中,我们也可以运用相同的方法,我们只需要检测最终球的落地就可以知道手指根部在哪里.
问:对于小的缺陷如何解决?
答:增大球的"半径";
问:用什么来代替一个小球?
答:用一个像素点代表球心,保证半径范围内没有轮廓点;
问:每个小球的间距如何定?
答:小于最小缺陷间距离的1/2;
问:如何模拟小球在重力下的运动?
答:执行循环,判断半径范围外下方,右下方,左下方是否有轮廓点,没有则向那个方向移动。
2.2模拟规则
- 小球:中心为一像素点,保证小球半径内无轮廓点,最初小球中心在图像上边界,小球中心到达图像左右下边界即判断为出界;
- 小球初始排布:n个小球均匀分布在图像上边界;球间距离小于最小缺陷间距离的1/2;
- 重力规则:小球可以往左,右,下移动,不可以往上移动。
- 移动次序:只要下方可容纳小球,小球向下移动,否则向右移动,若到达右边界不可移动,则向左移动,到左边界不可移动则小球停止移动;
2.3结果

所有图片检测成功

本文介绍了一种新颖的手指根部检测方法——重力落球法。该方法通过模拟小球受重力作用沿手指轮廓移动并最终停留在指根处的过程,解决了传统方法在不规则图像上检测不准的问题。
用了多种方法,效果均不佳,最终自己想了个方法,私命名为重力落球法。
2302

被折叠的 条评论
为什么被折叠?



