opencv python 對指標儀表讀數識別

2021-10-25 13:12:07 字數 3942 閱讀 1360

用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...