VScode结合OPenCV-pyhton实现视频流人脸检测
Posted master_wang22327
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VScode结合OPenCV-pyhton实现视频流人脸检测相关的知识,希望对你有一定的参考价值。
实验环境
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是待检测对象,把自己的一张人脸图贴进去就好。
下面贴一张运行图
(反正也没人看随便贴一张)
以上是关于VScode结合OPenCV-pyhton实现视频流人脸检测的主要内容,如果未能解决你的问题,请参考以下文章
vscode使用vscode多源文件结合opencv编译调试 C/C++