Trouver des Contours dans OpenCV?

lorsque vous récupérez les contours d'une image, vous devriez obtenir 2 contours par blob - un intérieur et un extérieur. Considérez le cercle ci - dessous - puisque le cercle est une ligne avec une largeur de pixel supérieure à un, vous devriez être en mesure de trouver deux contours dans l'image-un de la partie interne du cercle et un de la partie externe.

en utilisant OpenCV, je veux récupérer les contours intérieurs. Cependant, quand j'utilise findContours (), Je ne vois que les contours externes. Comment pourrais-je récupérer les contours intérieurs d'un blob en utilisant OpenCV?

j'utilise L'API C++, donc pas c propose seulement des fonctions qui utilisent l'API C++. (c'est à dire findContours () plutôt que cvFindContours ())

Merci.

enter image description here

13
demandé sur fdh 2011-12-09 21:28:45

3 réponses

j'ai lancé ce code sur votre image et il a retourné un contour intérieur et extérieur.

#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;
}

Voici les contours il a trouvé:

findContour result image

22
répondu SSteve 2011-12-11 20:15:56

je pense que ce que Farhad demande est de recadrer le contour de l'image originale.

Pour cela, vous aurez besoin de trouver le contour comme expliqué ci-dessus, puis utiliser un masque pour obtenir l'intérieur de l'original, et puis de recadrer le résultat en une image à la même taille que le contour.

3
répondu Kacem Boufelliga 2012-11-03 21:56:29

la fonction findcontours stocke tous les contours dans différents vecteurs, dans le code étant donné que tous les contours sont dessinés, il vous suffit de dessiner le contour correspondant au contour intérieur, idx est la variable qui indique quel contour est dessiné.

0
répondu Dangelo Guanipa 2016-01-03 22:01:03