2012-11-19 12 views
10

मुझे किसी छवि का सबसे बड़ा समोच्च निकालने की आवश्यकता है। यह वह कोड है जिसका मैं वर्तमान में उपयोग कर रहा हूं। कुछ स्निपेट्स ऑनलाइन एकत्र हुएएंड्रॉइड ओपनसीवी समोच्च खोजें

List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
Imgproc.findContours(outerBox, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); 
double maxArea = -1; 
int maxAreaIdx = -1; 
for (int idx = 0; idx < contours.size(); idx++) { 
    Mat contour = contours.get(idx); 
    double contourarea = Imgproc.contourArea(contour); 
    if (contourarea > maxArea) { 
     maxArea = contourarea; 
     maxAreaIdx = idx; 
    } 
} 

और ऐसा लगता है। हालांकि, मुझे पूरा यकीन नहीं है कि यहां से कैसे जाना है। मैंने Imgproc.floodFill का उपयोग करने का प्रयास किया, लेकिन मुझे पूरा यकीन नहीं है कि कैसे। इस फ़ंक्शन को मूल Mat मूल आकार Mat +2 क्षैतिज और +2 लंबवत के समान मास्ट Mat की आवश्यकता है। जब मैंने इसे contours.get(maxAreaIdx) समोच्च पर चलाया, तो मुझे एक त्रुटि मिली। कोड:

Mat mask = Mat.zeros(contour.rows() + 2, contour.cols() + 2, CvType.CV_8UC1); 
int area = Imgproc.floodFill(contour, mask, new Point(0,0), new Scalar(255, 255, 255)); 

त्रुटि:

11-18 19:07:49.406: E/cv::error()(3117): OpenCV Error: Unsupported format or combination of formats() in void cvFloodFill(CvArr*, CvPoint, CvScalar, CvScalar, CvScalar, CvConnectedComp*, int, CvArr*), file /home/oleg/sources/opencv/modules/imgproc/src/floodfill.cpp, line 621 

तो मूल रूप से मेरे सवाल है, कैसे कर सकते हैं मैं,, सबसे बड़ा क्षेत्र के साथ समोच्च पाने के लिए "आकर्षण" इसके बाद? मैं सबकुछ काला होना चाहता हूं, और समोच्च सफेद होना

धन्यवाद!

उत्तर

10

आप DrawContours समारोह OpenCV में उपयोग कर सकते हैं: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=drawcontours#drawcontours

या आप सी में इस कार्यान्वयन का उपयोग कर सकते ++ (आप OpenCV दस्तावेज़ में जावा में बराबर पा सकते हैं, बस टाइप OpenCV + गूगल पर समारोह के नाम

0:)

Mat src = imread("your image"); int row = src.rows; int col = src.cols; 
    //Create contour 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 
Mat src_copy = src.clone(); 
    findContours(src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); 

// Create Mask 
Mat_<uchar> mask(row,col);  
for (int j=0; j<row; j++) 
    for (int i=0; i<col; i++) 
     { 
      if (pointPolygonTest(contours[0], Point2f(i,j),false) =0) 
      {mask(j,i)=255;} 
      else 
      {mask(j,i)=0;} 
     }; 

आकृति [1], आकृति [2] ... सबसे बड़ी एक

यह आपके समोच्च प्रदर्शित करने के लिए है खोजने की कोशिश

+1

क्या आप जावा में कार्यान्वयन प्रदान कर सकते हैं? मुझे यह नहीं मिल रहा है ... – Marek

+0

@Marek क्या आपको इसका जावा कार्यान्वयन मिला ?? –

+1

जावा/ओपनसीवी 4 एंड्रॉइड खोज रंग-ब्लॉब-डिटेक्शन नमूना में कॉन्टूर उदाहरण है। – Mytheral