Ошибка OpenCV C++ cv::convexityDefects

vector<Point> hull;
vector<Point> defects;
convexHull(Mat(largest),hull,false);
convexityDefects(largest,hull,defects);

*самый большой мой самый большой контур на изображении

Но convexityDefects выдает мне эту ошибку «Ошибка утверждения (hull.checkVector (1, CV_32S)> 2)». Кто-нибудь, пожалуйста, помогите мне, я не хочу прибегать к использованию решения C.

ОТРЕДАКТИРОВАНО

vector<int> hull;
vector<Point> defects;
convexHull(Mat(largest),hull,false);

vector<vector<int>> testhull;
testhull.push_back(hull);
convexityDefects(largest,testhull,defects);

Я попытался сделать это с типом vector<vector<int>>, прежде чем передать его в convexityDefects, но convexityDefects по-прежнему выдает мне ошибку «Утверждение не удалось (ptnum> 3)»..».


person XterNalz    schedule 07.08.2012    source источник


Ответы (2)


Второй аргумент convexityDefects должен быть типа vector<vector<int>, а ваш — vector<Point>.

person ArtemStorozhuk    schedule 07.08.2012
comment
Я внес некоторые изменения в свои коды, пожалуйста, проверьте еще раз в первом сообщении. Спасибо. - person XterNalz; 07.08.2012
comment
@user1434759 user1434759 Я очень быстро нашел ответы на все ваши проблемы. Вы пробовали гуглить, прежде чем спрашивать? stackoverflow.com/ вопросы/10620981/ - person ArtemStorozhuk; 07.08.2012

для корпуса вы должны использовать вектор таких векторов:

vector<vector<Point>> hullsP( contours.size() );
vector<vector<int> > hullsI(contours.size());

и передайте тип "int" в covexityDefects. вот так:

vector<vector<Vec4i>> convdefect(contours.size());

for( int i = 0; i < contours.size(); i++ )
{ 
    convexHull( Mat(contours[i]), hullsP[i], false );
    convexHull( Mat(contours[i]), hullsI[i], false );       
    if(hullsI[i].size() > 3 )
        convexityDefects(contours[i],hullsI[i],convdefect[i]);
}
person ABSSH    schedule 03.01.2013