从图像中检索轮廓时,每个斑点应获得2个轮廓 - 一个内部轮廓和一个外部轮廓.考虑下面的圆圈 - 由于圆是一条像素宽度大于1的线,您应该能够在图像中找到两个轮廓 - 一个来自圆的内部,一个来自外部.
使用OpenCV,我想检索INNER轮廓.但是,当我使用findContours()时,我似乎只是在获得外部轮廓.如何使用OpenCV检索blob的内部轮廓?
我使用的是C++ API,而不是C,因此只建议使用C++ API的函数.(即findContours()而不是cvFindContours())
谢谢.

我试图从 opencv c++ 中了解 Hierarchy 和 findContours,但我发现这很困难。
我确实在这里解决了这个问题,但我仍然无法清楚地了解它。我尝试在不同的示例中使用它,使用以下示例图像

对于上图,运行以下代码,
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
void thresh_callback(int, void* );
/** @function main */
int main( int argc, char** argv )
{
src = imread( argv[1], 1 );
cvtColor( src, src_gray, CV_BGR2GRAY );
blur( src_gray, src_gray, Size(3,3) );
String source_window = "Source";
namedWindow( …Run Code Online (Sandbox Code Playgroud) 我需要在下面的图像中找到内孔的数量.我的最终要求是使用opencv中的轮廓层次来检测和找到圆形黑洞的区域.不需要使用任何其他算法.
基于此链接在OpenCV中使用findContours()中的层次结构?我试过但它不起作用.
有没有其他方法可以找到图像中没有孔?
在这里,我已经附加了样本图像和代码.任何人都可以使用层次结构单独找到内部黑洞.我对轮廓层次结构没有太多经验.谢谢.我使用opencv c ++ lib.
cv::Mat InputImage = imread("New Image.jpg");
int Err;
if(InputImage.empty() == 1)
{
InputImage.release();
cout<<"Error:Input Image Not Loaded"<<endl;
return 1;
}
cv::Mat greenTargetImage;
std::vector<cv::Mat> Planes;
cv::split(InputImage,Planes);
greenTargetImage = Planes[1];
cv::Mat thresholdImage = cv::Mat (greenTargetImage.size(),greenTargetImage.type());
cv::threshold(greenTargetImage,thresholdImage,128,255,THRESH_OTSU);
imwrite("thresholdImage.jpg",thresholdImage);
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(thresholdImage,contours,hierarchy,cv::RETR_CCOMP,cv::CHAIN_APPROX_SIMPLE,cv::Point(-1,-1));
cout<<contours.size()<<endl;
cout<<hierarchy.size()<<endl;
int count = 0;
if (!contours.empty() && !hierarchy.empty())
{
for (int i = 0;i<contours.size();i++ )
{
if ( hierarchy[i][3] != -1)
{
cv::drawContours(InputImage,contours,i,CV_RGB(0,255,0),3);
count = count+1;
}
} …Run Code Online (Sandbox Code Playgroud)