Поиск контуров в OpenCV?
когда вы извлекаете контуры из изображения, вы должны получить 2 контура на blob - один внутренний и один внешний. Рассмотрим окружность ниже - поскольку окружность представляет собой линию с шириной пикселя больше единицы, вы должны быть в состоянии найти два контура на изображении - один из внутренней части круга и один из внешней части.
используя OpenCV, я хочу получить внутренние контуры. Однако, когда я использую findContours (), мне кажется, что я получаю только внешние контуры. Как бы я получить внутренние контуры blob с помощью OpenCV?
Я использую API C++, а не C, поэтому предлагаю только функции, использующие API c++. (т. е. findContours () а не cvFindContours ())
спасибо.
3 ответов
Я запустил этот код на вашем изображении, и он вернул внутренний и внешний контур.
#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;
}
вот контуры, которые он нашел:
Я думаю, что Фархад просит обрезать контур из исходного изображения.
для этого вам нужно будет найти контур, как описано выше, затем использовать маску, чтобы получить внутреннюю часть от оригинала, а затем обрезать результат в изображение с тем же размером, что и контур.
функция findcontours хранит все контуры в разных векторах, в коде заданы все контуры, вы просто рисуете контур, соответствующий внутреннему, idx-это переменная, которая указывает, какой контур рисуется.