11

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

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ましたが、どうすればいいのかよくわかりません。この機能には、元の+2水平および+2垂直とMat同じサイズのマストが必要です。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

つまり、基本的に私の質問は、最大の面積を持つ輪郭を見つけた後、それを「強調表示」するにはどうすればよいかということです。他のすべてを黒にし、輪郭を白にします

ありがとう!

4

1 に答える 1

10

OpenCVでDrawContours関数を使用できます:http ://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight = drawcontours#drawcontours

または、この実装をC ++で使用することもできます(Javaで同等のものをOpenCVドキュメントで見つけることができます。OpenCV+ googleで関数の名前を入力するだけです)

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]...を試して最大のものを見つけてください

これは輪郭を表示するためのものです:

namedWindow("Contour",CV_WINDOW_AUTOSIZE);
imshow("Contour", mask);
于 2012-11-23T12:09:14.270 に答える