11

肌の検出を行っていますが、滑らかなものを取得できません。以下の画像には、以下にも添付されているコードを使用した入力 (左) と出力 (右) が含まれています。ここで、目的の出力は、一番下の画像 (エッジが滑らかで、内部に穴がない画像) である必要があります。この出力を達成するにはどうすればよいですか? どこから始めるべきかのサンプルコードは非常に役立ちます。

入力 (左) と間違った出力 (右):

ここに画像の説明を入力

望ましい出力:

ここに画像の説明を入力

Incorect 出力を生成するコード:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main(){
    Mat src = imread("qq.jpg");
    if (src.empty())
        return -1;
    blur( src, src, Size(3,3) );
    Mat hsv;
    cvtColor(src, hsv, CV_BGR2HSV);
    Mat bw;
    inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
    imshow("src", src);
    imshow("dst", bw);
    waitKey(0);
    return 0;
}

変更されたコード (Astor の提案後): (問題は、出力をどのように平滑化するか?)

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int findBiggestContour(vector<vector<Point> >);

int main(){
    Mat src = imread("qq.jpg");
    if (src.empty())
        return -1;
    blur( src, src, Size(3,3) );

    Mat hsv;
    cvtColor(src, hsv, CV_BGR2HSV);

    Mat bw;
    inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
    imshow("src", src);
    imshow("dst", bw);

    Mat canny_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    findContours( bw, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
    int s = findBiggestContour(contours);

    Mat drawing = Mat::zeros( src.size(), CV_8UC1 );
    drawContours( drawing, contours, s, Scalar(255), -1, 8, hierarchy, 0, Point() );

    imshow("drw", drawing);
    waitKey(0);
    return 0;
}

int findBiggestContour(vector<vector<Point> > contours){
    int indexOfBiggestContour = -1;
    int sizeOfBiggestContour = 0;
    for (int i = 0; i < contours.size(); i++){
        if(contours[i].size() > sizeOfBiggestContour){
            sizeOfBiggestContour = contours[i].size();
            indexOfBiggestContour = i;
        }
    }
    return indexOfBiggestContour;
}
4

2 に答える 2

11

を使用findContoursして最大の輪郭を検出し、この描画後にメソッドを使用して塗りつぶしパラメーター -1 で輪郭を作成する必要がありますdrawContours。便利なリンクは次のとおりです

于 2012-10-19T06:38:39.123 に答える
1

出力の滑らかさを改善するには、つまり、検出された領域のブラック ホールを減らすには、結果の画像に対してモルフォロジー操作を実行してみてください。次のドキュメントでは、opencv の侵食関数と拡張関数について説明しています。 http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

于 2014-11-05T18:21:50.833 に答える