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是待检测对象,把自己的一张人脸图贴进去就好。

下面贴一张运行图

(反正也没人看随便贴一张)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值