使用 OpenCV 凸包和凸缺陷函数的手指跟踪/计数
Posted
技术标签:
【中文标题】使用 OpenCV 凸包和凸缺陷函数的手指跟踪/计数【英文标题】:Finger tracking / counting using OpenCV convex hull and Convexity Defect functions 【发布时间】:2012-01-04 14:17:08 【问题描述】:我一直在使用 OpenCV 和 ConvexHull 和 ConvexityDefects 方法编写基本的手/手指跟踪代码。
基本上,我能够创建手部的轮廓。我现在需要能够数出手指的数量。我知道 Convex Hull 的起点和终点是指尖,但我不确定如何计算它们以及如何通过在它们上画圈或其他东西来突出它们。
我希望我的代码执行this 之类的操作。
到目前为止,这是我的代码的示例部分:
cvFindContours( hsv_mask, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
CvSeq* contours2 = NULL;
CvRect rect = cvBoundingRect( contours2, 0 );
cvRectangle( bitImage, cvPoint(rect.x, rect.y + rect.height), cvPoint(rect.x + rect.width, rect.y), CV_RGB(200, 0, 200), 1, 8, 0 );
CvSeq* hull = cvConvexHull2( contours2, 0, CV_CLOCKWISE, 0 );
CvSeq* defect = cvConvexityDefects( contours2, hull, dftStorage );
CvBox2D box = cvMinAreaRect2( contours2, minStorage );
cvDrawContours( bg, contours2, CV_RGB( 0, 200, 0), CV_RGB( 0, 100, 0), 1, 1, 8, cvPoint(0,0));
我已经玩过它,现在我可以使用此代码绘制指尖点
for(;defect;defect = defect->h_next)
int nomdef = defect->total;
if(nomdef == 0)
continue;
defectArray = (CvConvexityDefect*)malloc(sizeof(CvConvexityDefect)*nomdef);
cvCvtSeqToArray (defect, defectArray, CV_WHOLE_SEQ);
for(i=0; i<nomdef;>
cvCircle( bg, *(defectArray[i].end), 5, CV_RGB(255,0,0), -1, 8,0);
cvCircle( bg, *(defectArray[i].start), 5, CV_RGB(0,0,255), -1, 8,0);
cvCircle( bg, *(defectArray[i].depth_point), 5, CV_RGB(0,255,255), -1, 8,0);
j++;
free(defectArray);
但是,我仍然收到很多误报。另外,如果有人能提出任何现在数手指的方法,那就太好了。
【问题讨论】:
你能展示一些运行你拥有的代码的图像吗? 另外,您是否遇到过this question,它处理凸包以将缺陷作为点向量返回?我猜你需要处理这些点以从船体的另一端提取指尖。这将取决于图像的实际显示方式,也许船体延伸到图像边缘,您可以忽略边缘附近的点? 【参考方案1】:您拥有的一种可能性是计算存在的缺陷数量。如果你做得对,缺陷应该位于两个手指之间的底部。http://img27.imageshack.us/img27/6532/herpz.jpg
确保没有任何“不需要的”缺陷,您可以使用 CvConvexityDefect() 中的“深度”参数;过滤低长度缺陷的功能。可以在此处找到对“深度”参数的更好描述: opencv.itseez.com defect description
【讨论】:
以上是关于使用 OpenCV 凸包和凸缺陷函数的手指跟踪/计数的主要内容,如果未能解决你的问题,请参考以下文章