1. 程式人生 > 其它 >OpenCV找出圖片中的圓並標註圓心

OpenCV找出圖片中的圓並標註圓心

一、概述

  案例:輸入一張圖片找到圖片中的一個圓,並標註圓心

  實現步驟:

    1.輸入原圖

    2.影象影象灰度化

    3.影象二值化

    4.執行形態學操作去除噪點

    5.邊緣檢測

    6.輪廓發現

    7.根據面積和縱橫比過濾目標輪廓

    8.找出圓心並繪製圓心

    9.在原圖上也繪製圓心並輸出

二、程式碼示例

 //【1】載入影象
    Mat src = imread(filePath);
    Mat src_clone = src.clone();
    if(src.empty()){
        qDebug()<<"
圖片為空"; return; } imshow("src",src); //21】轉灰度圖 Mat gray; cvtColor(src,gray,COLOR_BGR2GRAY); //【3】影象二值化 threshold(gray,gray,0,255,THRESH_BINARY|THRESH_OTSU); imshow("threshold",gray); //【4】執行形態學開操作去除噪點 Mat kernel = getStructuringElement(MORPH_RECT,Size(20,20),Point(-1
,-1)); morphologyEx(gray,gray,MORPH_OPEN,kernel,Point(-1,-1),1); imshow("morphologyEx",gray); //【5】邊緣檢測 Canny(gray,gray,0,255); imshow("canny",gray); //【6】輪廓發現 vector<vector<Point>> contours; vector<Vec4i> her; findContours(gray,contours,her,RETR_TREE,CHAIN_APPROX_SIMPLE); Mat resultImage
= Mat::zeros(gray.size(),CV_8UC3); RNG rng(12345); double area = 0.0; Point pRadius; for(size_t i = 0;i<contours.size();i++){ double area = contourArea(contours[i],false); //【7】根據面積及縱橫比過濾輪廓 if(area>200){ Rect rect = boundingRect(contours[i]); float scale = float(rect.width)/float(rect.height); if(scale<1.1&&scale>0.9){ drawContours(resultImage,contours,i,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),-1); int x = rect.width/2; int y = rect.height/2; //【8】找出圓心並繪製 pRadius=Point(rect.x+x,rect.y+y); circle(resultImage,pRadius,2,Scalar(0,0,255),2); } } } imshow("resultImage",resultImage); //【9】在原圖上繪製圓心,這一步要不要都行,因為座標都找出來了,可以隨便標註 circle(src_clone,pRadius,2,Scalar(0,0,255),2); imshow("src_clone",src_clone);

 

三、圖片示例