python下用OpenCV的圓形檢測

來源:互聯網
上載者:User

標籤:window   waitkey   噪點   www   str   影像處理   調整   調用   round   

 寫在文章前

這些天因為工作需要要學習映像檢測,笨笨的我啥都不會要盯著OpenCV重頭開始學(;′⌒`),甚至查資料能力都很弱弱〒▽〒

誇一下我最好的男票(*^▽^*)  男盆友也不是做影像處理的 但是心疼我的笨(〃‘▽‘〃) 

讓我把要求給他(っ??ω??)っ???  他放下手中的遊戲 花了一兩天給我做出來然後寫了份詳細說明書φ(>ω<*) 

當然是記下來 ?(?????)?

??▽ ???3?? 學習去咯

 

一.簡介:

初次使用python的你一定感受到了python的便捷。作為進階程式設計語言只需調用類庫即可。

對於圓形物體識別問題,opencv提供了大量方法。

(代碼文末附上)

二.檢測步驟: 2.1讀取映像

視窗1(初始映像未經過處理)

 

2.2降噪處理

由於映像中存在大量噪點(什麼是噪點參考https://www.zhihu.com/question/23877970)

利用降噪方法cv2.blur(img, (5,5))

其中兩個參數為橫向縱向的模糊程度,數值越大越模糊

這是5,5的模糊程度

 

這是20,20的模糊程度

 

這裡我們用5,5效果測試下來最佳

2.3灰階化

灰階化常用於色彩豐富的映像,類似ps中的失色操作。

方法:cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)

 

由於原映像就是黑白主色調,所以去色改變不大

2.4霍夫變化圓檢測

之前的降噪和灰階化都是為了這一步的檢測

參考文章http://lib.csdn.net/article/opencv/24037

方法如下:

cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)

參數1 image:傳遞映像

參數2 method:預設,不用理解

參數3 dp:預設,不用理解

參數4 minDist:不同圓心的最小距離,單位為像素

參數5 涉及到Canny演算法,這裡的80為canny演算法的上限,這裡的canny演算法下限自動化佈建為為上限一半,馬上介紹canny演算法

參數6 需要理解上面的參考文章,可以認為是需要達到的累加數量

參數7,8 為最小半徑和最大半徑,避免識別白色的圓圈

那麼什麼是canny演算法呢?簡單來說就是邊緣檢測演算法

具體實現效果可以參考方法:cv2.Canny(img, 27, 54),顯示效果為

 

加大參數邊緣就越少,我們用到的就是這種效果,即設定上限為80

cv2.Canny(img, 40, 80)

最終

circles=cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)

會將所有識別的圓形參數(圓心位置,半徑)儲存到circles

可以認為是一個數組中

2.5標記

根據2.4擷取的映像資訊利用cv2.circle()方法進行圈畫

大功告成,可以調整參數達到滿意的效果。

三.附上代碼
# -*- coding: utf-8 -*-import  cv2#載入並顯示圖片img=cv2.imread(‘1.jpg‘)cv2.imshow(‘1‘,img)#降噪(模糊處理用來減少瑕疵點)result = cv2.blur(img, (5,5))cv2.imshow(‘2‘,result)#灰階化,就是去色(類似老式照片)gray=cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)cv2.imshow(‘3‘,gray)#param1的具體實現,用於邊緣檢測    canny = cv2.Canny(img, 40, 80)   cv2.imshow(‘4‘, canny)  #霍夫變換圓檢測circles= cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)#輸出傳回值,方便查看類型print(circles)#輸出檢測到圓的個數print(len(circles[0]))print(‘-------------我是條分割線-----------------‘)#根據檢測到圓的資訊,畫出每一個圓for circle in circles[0]:    #圓的基本資料    print(circle[2])    #座標行列(就是圓心)    x=int(circle[0])    y=int(circle[1])    #半徑    r=int(circle[2])    #在原圖用指定顏色圈出圓,參數設定為int所以圈畫存在誤差    img=cv2.circle(img,(x,y),r,(0,0,255),1,8,0)#顯示新映像cv2.imshow(‘5‘,img)#按任意鍵退出cv2.waitKey(0)cv2.destroyAllWindows()

python下用OpenCV的圓形檢測

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.