2013-10-24 2 views
0

Я использую OpenCV 2.4.6. Я пытаюсь получить все глубины дефекта выпуклости самого большого контура. Но я получаю сильфона исключениеOpenCv дефект выпуклости

Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0)) in unknown function 

текущий код вставлен ниже Спасибо за любую помощь

vector<vector<Point> >hulls(1); 
    vector<Point> hull; 
    std::vector<Vec4i> defects; 
    if(contours.size()>1){ 
     convexHull(Mat(contours[largest_contour_index]), hulls[0], false); 
     convexityDefects(contours[largest_contour_index], hulls[0], defects); 
     drawContours(sourceVideo,contours,largest_contour_index,Scalar(255, 0, 0)); 
     drawContours(sourceVideo,hulls,0,Scalar(0, 255, 0)); 
     } 

ошибка в этой строке

convexityDefects(contours[largest_contour_index], hulls[0], defects); 

ответ

0

Вы уверены vector<vector<Point> >hulls верно? Документация (docs.opencv.org) упоминает, для 2-го параметра convexityDefects:

convexhull – Convex hull obtained using convexHull() that should contain indices of the contour points that make the hull.

Так я думаю, что это должно быть довольно vector<vector<int> >hulls

+0

может использоваться. Все работает нормально, если я комментирую convexityDefects (контуры [most_contour_index], корпуса [0], дефекты); Ошибка - это структура данных, используемая для дефектов. Я думаю, что –

+0

я получаю следующую ошибку: «Ошибка OpenCV: утверждение не выполнено (mtype == type0 || (CV_MAT_CN (mtype) == CV_MAT_CN (type0) && ((1 << type0) & fixedDepthMask)! = 0)) в неизвестной функции « –

3

Попробуйте это работает для меня:

#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <ctype.h> 
#include <time.h>  
#include <opencv2/opencv.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::COLOR_RGB2YCrCb); 
    inRange(skin, min, max, skin); 
    Mat rect_12 = getStructuringElement(cv::MORPH_RECT, Size(12,12) , Point(6,6)); 
    erode(skin, skin, rect_12,Point(),1); 
    Mat rect_6 = getStructuringElement(cv::MORPH_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<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 >> 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; 
} 
+0

Очень полезно! Также помогает избежать передачи 'hull' в виде' vector > '' 'выпускиDefects'. Хорошая работа! – mescarra

Смежные вопросы