一、概述
案例:輸入一張圖片找到圖片中的一個圓,並標注圓心
實現步驟:
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);
三、圖片示例