2013-06-27 6 views
1

Я новичок в программировании, поэтому, пожалуйста, помогите мне. Я хочу получить только внешний контур объекта, но проблема в том, что у меня есть другой контур, подобный границе. Как я могу получить единственный внешний контур объекта без какого-либо другого контура?Извлечение внешнего контура объекта

Пример изображения:

enter image description here

Вот код, я сделал:

// cvAutoHeight.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "opencv\cvaux.h" 
#include "opencv\cxmisc.h" 
#include "opencv\highgui.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <stdlib.h> 

using namespace std; 
using namespace cv; 

int main(int, char**) 
{ 
Mat threshold_output; 
int thresh = 100; 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 
RNG rng(12345); 

CvCapture* capture = cvCaptureFromCAM(0); 

cv::Mat frame; cv::Mat src_gray; 

while(1) { 
    frame = cvQueryFrame(capture); 

    cvtColor(frame,src_gray, CV_BGR2GRAY); 
    blur(src_gray, src_gray, Size(3,3)); 

    //Canny(src_gray, threshold_output, 128, 255, 3); 
    threshold(src_gray, threshold_output, 100, 200, THRESH_BINARY); 
findContours(threshold_output, contours, hierarchy,CV_RETR_TREE, 
    CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

    /// Find the rotated rectangles and ellipses for each contour 
    vector<RotatedRect> minRect(contours.size()); 

    for(int i = 0; i < contours.size(); i++) 
    { 
     minRect[i] = minAreaRect(Mat(contours[i])); 
     } 

    /// Draw contours + rotated rects + ellipses 
    Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3); 
    for(int i = 0; i< contours.size(); i++) 
    { 

    Scalar color = Scalar(rng.uniform(0,0), rng.uniform(0,0), rng.uniform(250,250)); 
     // contour 
     drawContours(drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, 
       Point()); 

     // rotated rectangle 
     Point2f rect_points[4]; minRect[i].points(rect_points); 
     for(int j = 0; j < 4; j++) 
      line(frame, rect_points[j], rect_points[(j+1)%4], color, 1, 8); 
    } 


    namedWindow("Contours", CV_WINDOW_AUTOSIZE); 
    imshow("Contours", frame); 

    cvWaitKey(33); 
} 
return 0; 
} 

`

ответ

0

по умолчанию, из границ имеет значение 0 = черный пиксель. после порога вы получаете свой черный кадр с белым фоном. вот почему у вас есть 2 контура. выберите одно из решений:

  • использовать двоичный порог перевернутый.
  • применять canny после порога.
+0

Спасибо, но у меня есть еще одна проблема. Я заметил, что я обнаружил также внутренний контур монеты, но хочу только обнаружить внешний контур и создать прямоугольник. Пожалуйста, дайте мне некоторое решение. – user2529081

+0

размыть ваше изображение больше. – baci

+0

Большое спасибо, и это очень полезно. Я хочу измерить высоту и ширину изображения с помощью прямоугольника. Есть ли идеи или решения? – user2529081