簡體   English   中英

在輪廓中搜索輪廓/ OpenCV C ++

[英]Search for contours within a contour / OpenCV c++

我試圖跟蹤圖像中的自定義圓形標記,並且需要檢查一個圓是否包含最少數量的其他圓/對象。 我的尋找圈子的代碼如下:

void findMarkerContours( int, void* )
{   
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
vector<Point> approx;

cv::Mat dst = src.clone();

cv::Mat src_gray;
cv::cvtColor(src, src_gray, CV_BGR2GRAY);
//Reduce noise with a 3x3 kernel
blur( src_gray, src_gray, Size(3,3));

//Convert to binary using canny
cv::Mat bw;
cv::Canny(src_gray, bw, thresh, 3*thresh, 3);

imshow("bw", bw);


findContours(bw.clone(), contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

Mat drawing = Mat::zeros( bw.size(), CV_8UC3 );

for (int i = 0; i < contours.size(); i++)
{
    Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
    // contour
    drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );

    //Approximate the contour with accuracy proportional to contour perimeter
    cv::approxPolyDP(cv::Mat(contours[i]), approx, cv::arcLength(cv::Mat(contours[i]), true) *0.02, true);

    //Skip small or non-convex objects
    if(fabs(cv::contourArea(contours[i])) < 100 || !cv::isContourConvex(approx))
        continue;
    if (approx.size() >= 8) //More than 6-8 vertices means its likely a circle
    {
            drawContours( dst, contours, i, Scalar(0,255,0), 2, 8);
    }


    imshow("Hopefully we should have circles! Yay!", dst);

}

namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
imshow( "Contours", drawing );

}

如您所見,檢測圓的代碼效果很好:

但是現在我需要過濾掉我不想要的標記。 我的標記是最下面的一個。 因此,一旦我找到一個圓的輪廓,我想檢查第一個圓的區域內是否存在其他圓形輪廓,最后檢查最小圓的顏色。

如果(圓形包含3個以上的小圓圈||最小的圓圈是[color])->做東西,我該怎么說?

看看有關的文檔

findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())

您會看到有一個可選的hierarchy輸出向量,應該可以方便地解決您的問題。

等級 –可選的輸出向量,包含有關圖像拓撲的信息。 它具有與輪廓數量一樣多的元素。 對於每個第i個輪廓輪廓[i],將元素層次結構[i] [0],hiearchy i ,hiearchy i和hiearchy i設置為同一層次級別下一個和上一個輪廓的輪廓中基於0的索引,分別是第一個子輪廓和父輪廓。 如果對於輪廓i,沒有下一個,上一個,父級或嵌套的輪廓,則hierarchy [i]的相應元素將為負。

使用CV_RETR_TREE調用findCountours您將獲得找到的每個輪廓的完整層次。

文檔很好地解釋了hierarchy格式。

您已經在搜索特定大小的圈子

//Skip small or non-convex objects
if(fabs(cv::contourArea(contours[i])) < 100 || !cv::isContourConvex(approx))
    continue;

因此,您可以使用它來查找比您所獲得的圓更小的圓,而不用尋找<100的輪廓。

我想顏色也一樣...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM