2013-10-24 133 views
0

我正在使用OpenCV 2.4.6。 我想要獲得最大輪廓的所有凸性缺陷depth_points。但我正在逐漸波紋管例外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)提到,爲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(輪廓[largest_contour_index],船體[0],缺陷);錯誤是用於缺陷的數據結構,我認爲 –

+0

我得到以下錯誤「OpenCV Error:Assertion failed(mtype == type0 ||(CV_MAT_CN(mtype)== CV_MAT_CN (type0)&&((1 << type0 )&fixedDepthMask)!= 0))in unknown function「 –

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 >'傳遞給'convexityDefects'。幹得好! – mescarra