нахождение контуров в opencv?

<p>когда вы извлекаете контуры из изображения, вы должны получить 2 контура на блоб - один внутренний и один внешний. рассмотрим круг ниже - поскольку круг - это линия с шириной пикселя больше единицы, вы должны быть в состоянии найти два контура на изображении - один из внутренней части круга и один из внешней части.</p><p>используя opencv, я хочу получить внутренние контуры. однако, когда я использую findcontours (), мне кажется, что я получаю только внешние контуры. как бы я получить внутренние контуры blob-объекта с помощью opencv?</p><p>я использую api c++, а не c, поэтому предлагаю только те функции, которые используют api c++. (то есть findcontours (), а не cvfindcontours ())</p><p>благодарю.</p><p><img src="https://i.stack.imgur.com/ctyf7.jpg" alt="enter image description here"></p>

<p>я запустил этот код на вашем изображении, и он вернул внутренний и внешний контур.</p><pre><code>#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; } </code></pre><p>вот найденные контуры:</p><p><img src="https://i.stack.imgur.com/hrnfi.jpg" alt="findcontour result image"></p>

<p>я думаю, что фархад просит обрезать контур от исходного изображения.</p><p>для этого вам нужно будет найти контур, как описано выше, затем использовать маску, чтобы получить внутреннюю часть оригинала, а затем обрезать результат в изображение того же размера, что и контур.</p>

<p>функция findcontours хранит все контуры в разных векторах, в коде заданы все контуры, вы просто рисуете контур, соответствующий внутреннему, idx - это переменная, которая указывает, какой контур нарисован.</p>