標籤: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的圓形檢測