macedonez 0 Жалоба Опубликовано May 22, 2012 Здравствуйте у меня возникла проблема с использованием функции convexityDefects(), я уже перепробовал все что мог и не могу понять в чем ошибка. Вот код программы:Hand_HSV.cpp Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 22, 2012 Здесь есть несколько решений: http://stackoverflow.com/questions/6806637/convexity-defects-c-opencv Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
macedonez 0 Жалоба Опубликовано May 22, 2012 Предложенный вами ответ использует первый стандарт написания, а существует ли возможность использовать convexityDefects по новым стандартам? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 22, 2012 Я не использовал её так. А covex hull строит нормально? Не могу ваш код погонять, компилятор часа на 3 занят. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
macedonez 0 Жалоба Опубликовано May 22, 2012 Если за комментировать стоку convexityDefects( Mat(contours),hull, convDef); То код отработает нормально, и функция convexHull правильно подсчитывает и выводит. Как мне кажется я неправильно обращаюсь к функции или использую не правильные типы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 22, 2012 А так работает? convexityDefects( Mat(contours[i]),hull[i], NULL); storage – Container for the output sequence of convexity defects. If it is NULL, the contour or hull (in that order) storage is used. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
macedonez 0 Жалоба Опубликовано May 22, 2012 не работает потому что: C++: void convexityDefects(InputArray contour, InputArray convexhull, OutputArray convexityDefects) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 22, 2012 Да, точно, не туда посмотрел, это для с-шной версии. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 22, 2012 Поглумился над Вашей программкой , выделяет она, надо сказать все кроме кожи, в основном темные цвета. Так работает: #include <stdlib.h> #include <stdio.h> #include <iostream> #include <ctype.h> #include <time.h> #include <opencv2\imgproc\imgproc.hpp> #include <opencv2\video\tracking.hpp> #include <opencv2\highgui\highgui.hpp> using namespace cv; using namespace std; String window_name = "Hand_HSV"; Mat frame,copyFrame; // Detect Skin from YCrCb Mat DetectYCrCb(Mat img,Scalar min, Scalar max){ Mat skin; cvtColor(img, skin, CV_RGB2YCrCb); inRange(skin, min, max, skin); Mat rect_12 = getStructuringElement(CV_SHAPE_RECT, Size(12,12) , Point(6,6)); erode(skin, skin, rect_12,Point(),1); Mat rect_6 = getStructuringElement(CV_SHAPE_RECT, Size(6,6) , Point(3,3)); dilate(skin,skin,rect_6,Point(),2); return skin; } void DetectContour(Mat img){ Mat drawing = Mat::zeros( img.size(), CV_8UC3 ); vector<vector<Point> > contours; vector<vector<Point> > bigContours; vector<Vec4i> hierarchy; findContours(img,contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, Point()); if(contours.size()>0) { vector<cv::vector<int> >hull( contours.size() ); vector<vector<Vec4i>> convDef(contours.size() ); vector<vector<Point>> hull_points(contours.size()); vector<vector<Point>> defect_points(contours.size()); for( int i = 0; i < contours.size(); i++ ) { if(contourArea(contours[i])>5000) { convexHull( contours[i], hull[i], false ); convexityDefects( contours[i],hull[i], convDef[i]); // start_index, end_index, farthest_pt_index, fixpt_depth for(int k=0;k<hull[i].size();k++) { int ind=hull[i][k]; hull_points[i].push_back(contours[i][ind]); } for(int k=0;k<convDef[i].size();k++) { if(convDef[i][k][3]>20*256) { int ind_0=convDef[i][k][0]; int ind_1=convDef[i][k][1]; int ind_2=convDef[i][k][2]; defect_points[i].push_back(contours[i][ind_2]); cv::circle(drawing,contours[i][ind_0],5,Scalar(0,255,0),-1); cv::circle(drawing,contours[i][ind_1],5,Scalar(0,255,0),-1); cv::circle(drawing,contours[i][ind_2],5,Scalar(0,0,255),-1); cv::line(drawing,contours[i][ind_2],contours[i][ind_0],Scalar(0,0,255),1); cv::line(drawing,contours[i][ind_2],contours[i][ind_1],Scalar(0,0,255),1); } } drawContours( drawing, contours, i, Scalar(0,255,0), 1, 8, vector<Vec4i>(), 0, Point() ); drawContours( drawing, hull_points, i, Scalar(255,0,0), 1, 8, vector<Vec4i>(), 0, Point() ); } } } namedWindow( "Hull demo", CV_WINDOW_AUTOSIZE ); imshow( "Hull demo", drawing ); } int main( int argc, char** argv ) { VideoCapture capture(0); //VideoCapture capture("Video_Hand.MPG"); namedWindow( window_name, CV_WINDOW_AUTOSIZE ); if (capture.isOpened()){ while(true) { //capture.read(frame); //flip(frame,frame,1); capture >> frame; imshow( window_name, frame); Mat skinYCrCb = DetectYCrCb(frame,Scalar(0, 100, 80), Scalar(255, 185, 135)); imshow("Result",skinYCrCb); DetectContour(skinYCrCb); int c = waitKey(10); if( (char)c == 27 ) { break; } } } return 0; } [/code] прикол в том, что convexityDefects работает только с индексным хулом, то есть там должны содержаться индексы точек, а не сами точки. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
macedonez 0 Жалоба Опубликовано May 23, 2012 Спасибо большое за помощь!!! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах