2012-08-01 3 views
1

OpenCv를 사용하여 손끝을 감지하지만 이제 장애물이 있습니다! findContours & convexHull & convexityDefects 메서드가 내 프로젝트에서 작동하지 않습니다. 질문을하는 것은 이번이 처음입니다. 감사합니다 여러분!OpenCV CvConvexityDefects가 작동하지 않아 손가락을 감지 할 수 없습니다!

내 코드는 다음과 같습니다 :

int main() 
{ 
CvScalar white = cvRealScalar(255); 
CvScalar black = cvRealScalar(0); 

CvSeq* contours = 0; 
CvMemStorage* storage = cvCreateMemStorage(0); 
IplImage* img = cvLoadImage("h.jpg"); 
IplImage* imgGray = cvCreateImage(cvGetSize(img), img->depth, 1); 
IplImage* contoursImg = cvCreateImage(cvGetSize(img), img->depth, 1); 
cvZero(contoursImg); 
int nWidth = contoursImg->width; 
int nHeight = contoursImg->height; 
int nChannels = contoursImg->nChannels; 
int nStep = contoursImg->widthStep; 
for (int i=0; i<nHeight; i++) 
    for(int j=0; j<nWidth; j++) 
     contoursImg->imageData[i*nStep + j*nChannels] = 255 - contoursImg->imageData[i*nStep + j*nChannels]; 

cvCvtColor(img, imgGray, CV_BGR2GRAY); 
cvThreshold(imgGray, imgGray, 230, 255, CV_THRESH_BINARY); 
cvSmooth(imgGray, imgGray); 

cvFindContours(imgGray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 
contours = cvApproxPoly(contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 35, 1); 
cvDrawContours(contoursImg, contours, CV_RGB(0, 0, 0), CV_RGB(0, 0, 0), 1, 1, 8, cvPoint(0, 0)); 

CvSeq* hull = cvConvexHull2(contours, 0, CV_CLOCKWISE, 0); 
CvSeq* defect = cvConvexityDefects(contours, hull, NULL); 
for(; defect; defect = defect->h_next) 
{ 
    int nomdef = defect->total; 
    if(!nomdef) 
     continue; 
    CvConvexityDefect* defectArray = (CvConvexityDefect*)malloc(sizeof(CvConvexityDefect)*nomdef); 
    cvCvtSeqToArray(defect, defectArray, CV_WHOLE_SEQ); 
    for(int i = 0; i < nomdef; i++) 
    { 
     cvCircle(contoursImg, *(defectArray[i].end), 5, CV_RGB(255, 0, 0), -1, 8, 0); 
     cvCircle(contoursImg, *(defectArray[i].start), 5, CV_RGB(0, 255, 0), -1, 8, 0); 
     cvCircle(contoursImg, *(defectArray[i].depth_point), 5, CV_RGB(0, 0, 255), -1, 8, 0); 
    } 
    free(defectArray); 
} 

cvNamedWindow("image", 1); 
cvShowImage("image", contoursImg); 

cvWaitKey(0); 
cvReleaseMemStorage(&storage); 
cvReleaseImage(&img); 
cvReleaseImage(&imgGray); 
cvReleaseImage(&contoursImg); 
cvDestroyWindow("image"); 

return 0;  
} 

이 내 손의 사진입니다 :

http://www.billwang.net/bbs/oldattach/2006/12/29/billwang_5315954-038-embed.jpg

+0

내 게시물을 편집 해 주셔서 감사합니다 ~ vasile – Chien

+0

코드는 이미지의 매력처럼 작동합니다. 컨투어 이미지를 생성 할 수 있습니다. 어떤 오류가 발생하고 있습니까? – go4sri

+0

고맙습니다. go4sri. 코드는 윤곽선 이미지를 생성 할 수 있습니다. 그러나 손가락 끝에 작은 검정색 원이 생겨야합니다. 불행하게도 그 결과는 내가 원하는 것이 아닙니다. – Chien

답변

3

방법 노력하고 있습니다 좋은. 이미지 외부에 하나의 직사각형 윤곽이 감지되었습니다. 전체 이미지를 다루기 때문에 결함이 없으므로 아무 것도 감지되지 않습니다. 첨부 된 이미지를 참조하십시오. Look at the cyan box on the outside of the image

+0

글쎄, 나는 또한 오늘 아침 (중국에서) 전체 이미지를 덮고있는 윤곽을 발견했다. 그리고 convexhull & convexityDefects fncitons를 사용하기 전에 외부 윤곽선을 지우고 손의 윤곽선을 유지하는 코드를 추가했습니다. 내 담당자 핵심이 하나이기 때문에 귀하의 답변에 투표 할 수 없다는 점에 유감입니다. 대단히 감사합니다, @ go4sri! – Chien

+0

아주 좋은 대답은 ...이 동료의 대답에 대해 투표했습니다.이 스레드 자체에서 openCV의이 함수에 대해 더 많은 지식을 공유 할 수 있다면 매우 도움이 될 것입니다. –