国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

2021-12-03 10:33傷心兮 Python

最近嘗試做一個(gè)python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè),記錄一下過(guò)程,稍微整理精簡(jiǎn)一下做下分享,需要的小伙伴可以參考下

一、開(kāi)發(fā)環(huán)境

python 3.6.6

opencv-python 4.5.1

二、設(shè)計(jì)要求

1、使用opencv-python對(duì)人臉口罩進(jìn)行檢測(cè)

三、設(shè)計(jì)原理

設(shè)計(jì)流程圖如圖3-1所示,

python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

圖3-1 口罩檢測(cè)流程圖

首先進(jìn)行圖片的讀取,使用opencv的haar鼻子特征分類器,如果檢測(cè)到鼻子,則證明沒(méi)有戴口罩。如果檢測(cè)到鼻子,接著使用opencv的haar眼睛特征分類器,如果沒(méi)有檢測(cè)到眼睛,則結(jié)束。如果檢測(cè)到眼睛,則把RGB顏色空間轉(zhuǎn)為HSV顏色空間。進(jìn)行口罩區(qū)域的檢測(cè)。口罩區(qū)域檢測(cè)流程是首先把距離坐標(biāo)原點(diǎn)的較近的橫坐標(biāo)作為口罩區(qū)域開(kāi)始橫坐標(biāo),離坐標(biāo)原點(diǎn)較遠(yuǎn)的橫坐標(biāo)作為口罩區(qū)域結(jié)束橫坐標(biāo)。離坐標(biāo)原點(diǎn)較遠(yuǎn)的縱坐標(biāo)作為口罩區(qū)域開(kāi)始縱坐標(biāo),離坐標(biāo)原點(diǎn)較遠(yuǎn)的縱坐標(biāo)與眼睛高度2倍的和作為口罩區(qū)域結(jié)束縱坐標(biāo)。在此敘述的可能不是很清楚,可以見(jiàn)圖3-2,

python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

圖3-2 口罩區(qū)域檢測(cè)圖

最后,知道口罩區(qū)域時(shí),只需對(duì)像素點(diǎn)進(jìn)行判斷就可以判斷出是否佩戴口罩。

四、程序代碼

"""
# File       : mask_check.py
# Time       :2021/6/10 15:02
# Author     :Meng
# version    :python 3.6
# Description:
"""
import cv2          # 導(dǎo)入opencv
import time         # 導(dǎo)入time
 
"""實(shí)現(xiàn)鼻子檢測(cè)"""
def nose_dection(img):
    img = cv2.GaussianBlur(img,(5,5),0)#高斯濾波
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)                     # 將圖片轉(zhuǎn)化成灰度
    nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml")
    nose_cascade.load("data/haarcascades/haarcascade_mcs_nose.xml")  # 一定要告訴編譯器文件所在的具體位置
    """此文件是opencv的haar鼻子特征分類器"""
    noses = nose_cascade.detectMultiScale(gray, 1.3, 5)  # 鼻子檢測(cè)
    for(x,y,w,h) in noses:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 畫(huà)框標(biāo)識(shí)臉部
    flag = 0            # 檢測(cè)到鼻子的標(biāo)志位,如果監(jiān)測(cè)到鼻子,則判斷未帶口罩
    if len(noses)>0:
        flag = 1
    return img,flag
 
""""實(shí)現(xiàn)眼睛檢測(cè)"""
def eye_dection(img):
    img = cv2.GaussianBlur(img,(5,5),0)#高斯濾波
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)                     # 將圖片轉(zhuǎn)化成灰度
    eyes_cascade = cv2.CascadeClassifier("haarcascade_eye_tree_eyeglasses.xml")
    eyes_cascade.load("data/haarcascades/haarcascade_eye_tree_eyeglasses.xml")  # 一定要告訴編譯器文件所在的具體位置
    """此文件是opencv的haar眼鏡特征分類器"""
    eyes = eyes_cascade.detectMultiScale(gray, 1.3, 5)          # 眼睛檢測(cè)
    for (x,y,w,h) in eyes:
        frame = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)  # 畫(huà)框標(biāo)識(shí)眼部
        print("x y w h is",(x,y,w,h))
        # frame = cv2.rectangle(img, (x, y+h), (x + 3*w, y + 3*h), (255, 0, 0), 2)  # 畫(huà)框標(biāo)識(shí)眼部
    return img,eyes
 
def empty(a):
    pass
 
def main():
    image = cv2.imread("images/backgound.png")      # 讀取背景照片
    cv2.imshow("skin", image)                       # 展示
    cv2.createTrackbar("Hmin", "skin", 0, 90, empty)    # 創(chuàng)建bar
    cv2.createTrackbar("Hmax", "skin", 25, 90, empty)
    capture = cv2.VideoCapture(0)               # 打開(kāi)攝像頭,其中0為自帶攝像頭,
    while True:
        ref,img=capture.read()                  # 打開(kāi)攝像頭
        # img = cv2.imread("./images/005.jpg")      # 讀取一張圖片
        img_hsv = img
        image_nose,flag_nose = nose_dection(img)       # 進(jìn)行口罩檢測(cè),返回檢測(cè)之后的圖形以及標(biāo)志位
        if flag_nose == 1:              # 當(dāng)檢測(cè)到鼻子的時(shí)候,判斷未戴口罩
            frame = cv2.putText(image_nose, "NO MASK", (10, 30), cv2.FONT_HERSHEY_COMPLEX, 0.9,(0, 0, 255), 1)  # 在圖片上寫(xiě)字
            cv2.imshow("img", image_nose)       # 展示圖片
        if flag_nose == 0:              # 未檢測(cè)鼻子,進(jìn)行眼睛檢測(cè)
            img_eye,eyes = eye_dection(img)         # 進(jìn)行眼睛檢測(cè),返回檢測(cè)之后的圖形以及標(biāo)志位
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)        # 將圖片轉(zhuǎn)化成HSV格式
            H, S, V = cv2.split(hsv)                          #
            minH = cv2.getTrackbarPos("Hmin", "skin")           # 獲取bar
            maxH = cv2.getTrackbarPos("Hmax", "skin")
            if minH > maxH:
                maxH = minH
            thresh_h = cv2.inRange(H, minH, maxH)       # 提取人體膚色區(qū)域
            if len(eyes) > 1:                           # 判斷是否檢測(cè)到兩個(gè)眼睛,其中eyes[0]為左眼坐標(biāo)
                # 口罩區(qū)域的提取
                mask_x_begin = min(eyes[0][0],eyes[1][0])               # 把左眼的x坐標(biāo)作為口罩區(qū)域起始x坐標(biāo)
                mask_x_end = max(eyes[0][0],eyes[1][0]) + eyes[list([eyes[0][0], eyes[1][0]]).index(max(list([eyes[0][0], eyes[1][0]])))][2]   # 把右眼x坐標(biāo) + 右眼寬度作為口罩區(qū)域x的終止坐標(biāo)
                mask_y_begin = max(eyes[0][1] + eyes[0][3],eyes[1][1] + eyes[1][3]) + 20    # 把眼睛高度最大的作為口罩區(qū)域起始y坐標(biāo)
                if mask_y_begin > img_eye.shape[1]:     # 判斷是否出界
                    mask_y_begin = img_eye.shape[1]
                mask_y_end = max(eyes[0][1] + 3 * eyes[0][3],eyes[1][1] + 3 * eyes[1][3]) + 20  # 同理
                if mask_y_end > img_eye.shape[1]:
                    mask_y_end = img_eye.shape[1]
                frame = cv2.rectangle(img_eye, (mask_x_begin, mask_y_begin), (mask_x_end, mask_y_end), (255, 0, 0), 2)  # 畫(huà)口罩區(qū)域的框
                total_mask_pixel = 0
                total_face_pixel = 0
                # 遍歷二值圖,為0則total_mask_pixel+1,否則total_face_pixel+1
                for i in range(mask_x_begin,mask_x_end):
                    for j in range(mask_y_begin,mask_y_end):
                        if thresh_h[i,j] == 0:
                            total_mask_pixel += 1
                        else:
                            total_face_pixel += 1
                print("total_mask_pixel",total_mask_pixel)
                print("total_face_pixel", total_face_pixel)
                if total_mask_pixel > total_face_pixel:
                    frame = cv2.putText(img_eye, "HAVE MASK", (mask_x_begin, mask_y_begin - 10),cv2.FONT_HERSHEY_COMPLEX, 0.9, (0, 0, 255), 1)  # 繪制
                if total_mask_pixel < total_face_pixel:
                    frame = cv2.putText(img_eye, "NO MASK", (mask_x_begin, mask_y_begin - 10), cv2.FONT_HERSHEY_COMPLEX,0.9, (0, 0, 255), 1)  # 繪制
            cv2.imshow("skin", thresh_h)  # 顯示膚色圖
            cv2.imshow("img", img_eye)  # 顯示膚色圖
            # cv2.imwrite("005_result.jpg",img_eye)     保存圖片
        c = cv2.waitKey(10)
        if c==27:
            break
    capture.release()       #
    cv2.destroyAllWindows() # 關(guān)閉所有窗口
 
 
if __name__ == "__main__":
    main()

五、結(jié)果展示

檢測(cè)結(jié)果如下:

python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

圖5-1 HSV轉(zhuǎn)換結(jié)果圖

python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

圖5-2 口罩檢測(cè)結(jié)果圖

python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)

圖5-3 口罩檢測(cè)結(jié)果圖(竟然把耳朵誤判為鼻子)

六、結(jié)論

本實(shí)驗(yàn)使用了opencv-python進(jìn)行了人臉口罩檢測(cè)。進(jìn)行鼻子、眼睛檢測(cè)使用的時(shí)opencv自帶的.xml文件。從結(jié)果來(lái)看,這種方法是可行的。是可以應(yīng)用在地鐵站、火車站出入口進(jìn)行人臉口罩檢測(cè)的。

本實(shí)驗(yàn)也有一定局限性,例如圖片中有兩個(gè)人、眼睛被遮擋等特殊情況。如果感興趣可以自己訓(xùn)練.xml文件。當(dāng)然,也可以使用基于深度學(xué)習(xí)的目標(biāo)檢測(cè)模型例如R-CNN系列、YOLO系列、SSD等進(jìn)行模型的訓(xùn)練。

到此這篇關(guān)于python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)的文章就介紹到這了,更多相關(guān)Opencv 人臉口罩檢測(cè)內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/qq_43717870/article/details/117733341

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本视频免费高清一本18 | 欧美国产高清 | 自拍视频在线观看 | 日韩在线观看中文字幕 | 国产一区二区三区免费在线观看 | 亚洲一区亚洲二区 | 91中文在线观看 | 欧美精品一二区 | 99久久免费精品国产男女性高好 | 天天干天天操 | 亚洲中午字幕 | 免费成人在线观看视频 | 91精品久久久久久久久久久 | 视频在线一区二区三区 | 国产精品欧美一区二区三区 | 最新黄网 | 欧美国产精品 | 国产精品亚洲第一区在线暖暖韩国 | 久久亚洲国产 | 欧美一级在线 | 91精品国产91久久久久久吃药 | 在线免费黄色网址 | 欧美一级片在线 | 亚洲第一se情网站 | 日韩一区中文字幕 | 久久久久99啪啪免费 | 亚洲一区 中文字幕 | 一区二区三区免费 | 一区二区日韩 | 精品一区二区在线观看 | 久久久久久久久久久免费av | 欧美日韩中文字幕 | 99爱视频| 最新毛片在线观看 | 久久一区视频 | 一区二区三区免费 | 精品久久精品 | 在线激情网站 | 国产免费一区二区三区 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲精品中字 |