web-dev-qa-db-ja.com

OpenCVで輪郭を見つける?

画像から等高線を取得すると、ブロブごとに2つの等高線が得られるはずです。下の円について考えてみましょう。円はピクセル幅が1より大きい線なので、画像内で2つの輪郭を見つけることができるはずです。1つは円の内側から、もう1つは外側からです。

OpenCVを使用して、INNER輪郭を取得します。ただし、findContours()を使用すると、外側の輪郭のみが取得されるようです。 OpenCVを使用してblobの内部輪郭を取得するにはどうすればよいですか?

CではなくC++ APIを使用しているため、C++ APIを使用する関数のみを提案しています。 (つまり、cvFindContours()ではなくfindContours())

ありがとう。

enter image description here

16
fdh

このコードを画像で実行したところ、内側と外側の輪郭が返されました。

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

int main(int argc, const char * argv[]) {

    cv::Mat image= cv::imread("../../so8449378.jpg");
    if (!image.data) {
        std::cout << "Image file not found\n";
        return 1;
    }

    //Prepare the image for findContours
    cv::cvtColor(image, image, CV_BGR2GRAY);
    cv::threshold(image, image, 128, 255, CV_THRESH_BINARY);

    //Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten
    std::vector<std::vector<cv::Point> > contours;
    cv::Mat contourOutput = image.clone();
    cv::findContours( contourOutput, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE );

    //Draw the contours
    cv::Mat contourImage(image.size(), CV_8UC3, cv::Scalar(0,0,0));
    cv::Scalar colors[3];
    colors[0] = cv::Scalar(255, 0, 0);
    colors[1] = cv::Scalar(0, 255, 0);
    colors[2] = cv::Scalar(0, 0, 255);
    for (size_t idx = 0; idx < contours.size(); idx++) {
        cv::drawContours(contourImage, contours, idx, colors[idx % 3]);
    }

    cv::imshow("Input Image", image);
    cvMoveWindow("Input Image", 0, 0);
    cv::imshow("Contours", contourImage);
    cvMoveWindow("Contours", 200, 0);
    cv::waitKey(0);

    return 0;
}

見つけた輪郭は次のとおりです。

findContour result image

28
SSteve

Farhadが求めているのは、元の画像から輪郭をトリミングすることです。

これを行うには、上記で説明したように輪郭を見つける必要があります。次に、マスクを使用して元から内部を取得し、結果を輪郭と同じサイズの画像にトリミングします。

3

関数findcontoursはすべての等高線を異なるベクトルに格納し、すべての等高線が描画されるコードでは、内側の等高線に対応する等高線を描画するだけです。idxは、どの等高線が描画されるかを示す変数です。

0
Dangelo Guanipa