實驗環境
opencv-contrib-python 4.5.4.60
opencv-python 4.5.4.60
python 3.8.8
numpy 1.20.3
time
主要利用opencv 的cv.matchTemplate()函式對源圖形進行匹配,
# -*- coding: utf-8 -*-
# 匯入cv模塊
import cv2 as cv
import time
import matplotlib.pyplot as plt
import numpy as np
def window_Show(window_name,win_img):
cv.namedWindow(window_name,cv.WINDOW_NORMAL)
cv.imshow(window_name,win_img)
#cv.waitKey(0)
def template_compare(src_path,dst_pth,save_path):
if isinstance(src_path,str):#判斷是否是圖片
src=cv.imread(src_path)
else:
if isinstance(src_path,np.ndarray):#判斷是否是視頻
src=src_path
else:
print('資料型別傳輸錯誤')
dst=cv.imread(dst_pth)
h,w=dst.shape[:2]
print('dst.h={},dst.w={}'.format(h,w))
method=5#方法取值范圍0-5
ret=cv.matchTemplate(src,dst,method)#方法取值范圍0-5
print('ret.shape=',ret.shape)#(A-a+1,B-b+1)
minval,maxval,minloc,maxloc=cv.minMaxLoc(ret)
print('minval,maxval,minloc,maxloc={};{};{};{}'.
format(minval,maxval,minloc,maxloc))
if method<=1:#0,1兩種方法最準確的匹配效果為最小值
top_left=minloc
else:#大于1方法最準確的匹配效果為最大值
top_left=maxloc
bottom_right=(top_left[0]+w,top_left[1]+h)
src_copy=src.copy()#防止rectangle修改原圖
template_res=cv.rectangle(src_copy,top_left,bottom_right,(0,255,0),2)
window_Show('template',template_res)
#single_picture_show(src,dst,template_res)
def video_template(dst_path):
cap = cv.VideoCapture(0,cv.CAP_DSHOW) #cap_dshow 會降低fps?
save_path='img_save'
while True:
# capture frame-by-frame
ret, frame = cap.read()
print('ret=',ret)
#print(type(frame)) #查詢視頻幀的型別,以提供給instance判斷
# our operation on the frame come here
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
gray=cv.flip(gray,1)
gray=cv.Canny(gray,50,200)
# 展示結果
cv.imshow('src',frame)
template_compare(frame,dst_path,'img_save\save.jpg')
key=cv.waitKey(10)
if key == ord('q'): # 按q鍵退出
cap.release()
cv.destroyAllWindows()
break
else :
if key==ord('c'):#c保存圖片
t=time.localtime()
cv.imwrite(save_path+'\{}{}{}{}{}{}.jpg'.
format(t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec),frame)
if __name__=='__main__':
img_path='img_save\\2021121510470.jpg'
dst_path='img_save\\dst.jpg'
savepath='img_save\\template_res.jpg'
video_template(dst_path) #以視頻形式模板檢測代碼
#template_compare(img_path,dst_path,savepath) #以圖片形式模板匹配
#mask_func(img_path)
#histogram_cal(img_path)
有些注釋掉的代碼是我自己寫的其他程式代碼,懶得刪掉了,
主要是檢測輸入的是圖片還是視頻,隨后選擇6種模板匹配的方式,一般情況下后面的幾種匹配演算法精度比較高,但是不同演算法歸一化后的回傳值結果不同,有的是maxval是最好的匹配效果,minval是最好的匹配效果,文中給出了一個判斷,然后利用回傳值maxloc或者minloc結果繪制矩形框,

注意dst.jpg是待檢測物件,把自己的一張人臉圖貼進去就好,
下面貼一張運行圖
(反正也沒人看隨便貼一張)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/390508.html
標籤:其他
上一篇:2,vue播放視頻之—問題。引入多個視頻,視頻大小不一樣要求鋪滿全屏問題,停止視頻
下一篇:JavaCV音視頻開發寶典:使用javacv讀取GB28181、海康大華平臺和網路攝像頭sdk回呼視頻碼流并轉碼推流rtmp流媒體服務
