用opencv 對指標儀表進行讀數識別,
1. 先模板匹配,然後邊緣檢測 + 霍夫直線
2. 按輪廓大小過濾,然後邊緣檢測 + 霍夫直線
兩種方式對光線都非常敏感
其中第一種的應用範圍更廣,背景複雜一點也能識別到
個人比較喜歡這種方式
第二種的限制多一點,對背景、光線條件要求比較高
對於固定位置,且明暗變化不大的情況下,這種方式還是很有效的
先說第乙個方案,第二個方式就不說了
if __name__ ==
"__main__"
:# 載入模板
)# 初始化
am = c_ammerter(template)
# 執行
am.am_run(
)# 結束
am.close(
)
模板圖 001.jpg
下面給出def am_run(self)函式的處理流程(整體比較亂~~~需要完整**留下位址)
其中邊緣檢測之前需要對影象做一些處理:
def
am_run
(self)
:while
true
: ret, frame = self.cap.read(
)if frame is
none
:print
('video picture is none --continue '
)continue
gray = frame.copy(
)# cv2.imshow('origin', gray)
# 匹配模板 框出匹配區域
image = gray.copy(
) maxval,t_left, b_right = self.get_match(gray)
if maxval <
16000000000
:# 對匹配程度做判斷
print
("---------------------------------------"
)print
('matchtemplate is not enough --continue'
)print
("---------------------------------------"
) result =frame
image=frame
else
: cv2.rectangle(image, t_left, b_right,
255,2)
# 高斯除噪
kernel = np.ones((6
,6), np.float32)/36
gray_cut_filter2d = cv2.filter2d(image[t_left[1]
:t_left[1]
+ self.h, t_left[0]
:t_left[0]
+ self.w],-
1, kernel)
# 灰度圖 二值化
gray_img = cv2.cvtcolor(gray_cut_filter2d, cv2.color_bgr2gray)
ret, thresh1 = cv2.threshold(gray_img,
180,
255, cv2.thresh_binary)
# 二值化後 分割主要區域 減小干擾 模板圖尺寸371*369
tm = thresh1.copy(
) test_main = tm[50:
319,50:
321]
# 邊緣化檢測
edges = cv2.canny(test_main,50,
150, aperturesize=3)
# 霍夫直線
lines = cv2.houghlines(edges,
1, np.pi /
180,60)
if lines is
none
:continue
result = edges.copy(
)for line in lines[0]
: rho = line[0]
# 第乙個元素是距離rho
theta = line[1]
# 第二個元素是角度theta
print
('distance:'
+str
(rho)
,'theta:'
+str((
(theta / np.pi)
*180))
) lbael_text =
'distance:'
+str
(round
(rho))+
'theta:'
+str
(round
((theta / np.pi)
*180-90
,2))
cv2.puttext(image, lbael_text,
(t_left[0]
,t_left[1]
-12),cv2.font_hershey_******x,1,
(0,255,0
),2)
if(theta >3*
(np.pi /3)
)or(theta <
(np.pi /2)
):# 從影象邊界畫出延長直線
# 該直線與第一行的交點
pt1 =
(int
(rho / np.cos(theta)),
0)# 該直線與最後一行的焦點
pt2 =
(int
((rho - result.shape[0]
* np.sin(theta)
)/ np.cos(theta)
), result.shape[0]
)# 繪製一條白線
cv2.line(result, pt1, pt2,
255,1)
# print('theat >180 theta<90')
else
:# 水平直線
# 該直線與第一列的交點
pt1 =(0
,int
(rho / np.sin(theta)))
# 該直線與最後一列的交點
pt2 =
(result.shape[1]
,int
((rho - result.shape[1]
* np.cos(theta)
)/ np.sin(theta)))
# 繪製一條直線
cv2.line(result, pt1, pt2,
255,
1)
cv2.imshow(
'result'
, result)
cv2.imshow(
'rectangle'
, image)
if cv2.waitkey(1)
&0xff
==ord
('q'):
break
OpenCV Python模糊處理
import cv2 as cv import numpy as np 均值模糊 defblur demo img dst cv.blur img,5 5 cv.imshow blur image dst import cv2 as cv import numpy as np 中值模糊 defmed...
OpenCV Python 人臉檢測
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!例項總結 下午的時候,配好了opencv的python環境,opencv的python環境搭建。於是迫不及待的想體驗一下opencv的人臉識別,如下文。haar like百科釋義。通俗的來講,就是作為人臉特徵即可。haar特徵值反映了影象的灰度變化...
Opencv python 人臉檢測
import numpy as np import cv2 as cv cv.namedwindow face detected cap cv.videocapture 0 success,frame cap.read 載入opencv識別器 face cascade cv.cascadeclass...