Перейти к содержимому
Compvision.ru
macedonez

ConvexityDefects

Recommended Posts

Здравствуйте у меня возникла проблема с использованием функции convexityDefects(), я уже перепробовал все что мог и не могу понять в чем ошибка. Вот код программы:

Hand_HSV.cpp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здесь есть несколько решений:

http://stackoverflow.com/questions/6806637/convexity-defects-c-opencv

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Предложенный вами ответ использует первый стандарт написания, а существует ли возможность использовать convexityDefects по новым стандартам?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не использовал её так.

А covex hull строит нормально? Не могу ваш код погонять, компилятор часа на 3 занят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если за комментировать стоку

convexityDefects( Mat(contours),hull, convDef);

То код отработает нормально, и функция convexHull правильно подсчитывает и выводит. Как мне кажется я неправильно обращаюсь к функции или использую не правильные типы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А так работает?

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не работает потому что:

C++: void convexityDefects(InputArray contour, InputArray convexhull, OutputArray convexityDefects)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, точно, не туда посмотрел, это для с-шной версии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поглумился над Вашей программкой :) , выделяет она, надо сказать все кроме кожи, в основном темные цвета.

Так работает:

post-1-0-05378000-1337720534_thumb.png


#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 работает только с индексным хулом, то есть там должны содержаться индексы точек, а не сами точки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×