1

OpenCv を使用して指先を検出していますが、いくつか障害があります。私のプロジェクトでは、findContours、convexHull、convexityDefects メソッドが機能しません。質問するのは初めてです。みんなありがとう!

私のコードは以下の通りです:

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

4

1 に答える 1

3

メソッドは正常に機能しています。画像の外側で1つの長方形の輪郭が検出されました。これは画像全体をカバーしているため、欠陥はなく、検出されません。添付画像をご覧ください。画像の外側にあるシアンのボックスを見てください

于 2012-08-02T11:15:47.820 に答える