2012-11-19 88 views
10

画像の輪郭を最大にする必要があります。 これは私が現在使っているコードです。いくつかのスニペットをオンラインで集めましたAndroid OpenCV輪郭を見つける

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 +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

あなたはOpenCVの中DrawContours機能を使用することができます:http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=drawcontours#drawcontours

をそれとも、C++でこの実装を使用することができます(あなたがOpenCVのドキュメントにJavaで同等のものを見つけることができる、ちょうどGoogleで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

を探してみてください

+1

Javaで実装できますか?私はそれを見つけることができません... – Marek

+0

@マレックあなたはこれのJava実装を取得しましたか? –

+1

カラーブロブ検出サンプルにjava/opencv4android findContoursの例があります。 – Mytheral

関連する問題