91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何基于Opencv實現人臉口罩檢測

發布時間:2021-06-17 14:44:00 來源:億速云 閱讀:247 作者:小新 欄目:開發技術

這篇文章主要介紹python如何基于Opencv實現人臉口罩檢測,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一、開發環境

python 3.6.6

opencv-python 4.5.1

二、設計要求

1、使用opencv-python對人臉口罩進行檢測

三、設計原理

設計流程圖如圖3-1所示,

python如何基于Opencv實現人臉口罩檢測

圖3-1 口罩檢測流程圖

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

python如何基于Opencv實現人臉口罩檢測

圖3-2 口罩區域檢測圖

最后,知道口罩區域時,只需對像素點進行判斷就可以判斷出是否佩戴口罩。

四、程序代碼

"""
# File       : mask_check.py
# Time       :2021/6/10 15:02
# Author     :Meng
# version    :python 3.6
# Description:
"""
import cv2          # 導入opencv
import time         # 導入time
 
"""實現鼻子檢測"""
def nose_dection(img):
    img = cv2.GaussianBlur(img,(5,5),0)#高斯濾波
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)                     # 將圖片轉化成灰度
    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)  # 鼻子檢測
    for(x,y,w,h) in noses:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 畫框標識臉部
    flag = 0            # 檢測到鼻子的標志位,如果監測到鼻子,則判斷未帶口罩
    if len(noses)>0:
        flag = 1
    return img,flag
 
""""實現眼睛檢測"""
def eye_dection(img):
    img = cv2.GaussianBlur(img,(5,5),0)#高斯濾波
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)                     # 將圖片轉化成灰度
    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)          # 眼睛檢測
    for (x,y,w,h) in eyes:
        frame = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)  # 畫框標識眼部
        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)  # 畫框標識眼部
    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)    # 創建bar
    cv2.createTrackbar("Hmax", "skin", 25, 90, empty)
    capture = cv2.VideoCapture(0)               # 打開攝像頭,其中0為自帶攝像頭,
    while True:
        ref,img=capture.read()                  # 打開攝像頭
        # img = cv2.imread("./images/005.jpg")      # 讀取一張圖片
        img_hsv = img
        image_nose,flag_nose = nose_dection(img)       # 進行口罩檢測,返回檢測之后的圖形以及標志位
        if flag_nose == 1:              # 當檢測到鼻子的時候,判斷未戴口罩
            frame = cv2.putText(image_nose, "NO MASK", (10, 30), cv2.FONT_HERSHEY_COMPLEX, 0.9,(0, 0, 255), 1)  # 在圖片上寫字
            cv2.imshow('img', image_nose)       # 展示圖片
        if flag_nose == 0:              # 未檢測鼻子,進行眼睛檢測
            img_eye,eyes = eye_dection(img)         # 進行眼睛檢測,返回檢測之后的圖形以及標志位
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)        # 將圖片轉化成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)       # 提取人體膚色區域
            if len(eyes) > 1:                           # 判斷是否檢測到兩個眼睛,其中eyes[0]為左眼坐標
                # 口罩區域的提取
                mask_x_begin = min(eyes[0][0],eyes[1][0])               # 把左眼的x坐標作為口罩區域起始x坐標
                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坐標 + 右眼寬度作為口罩區域x的終止坐標
                mask_y_begin = max(eyes[0][1] + eyes[0][3],eyes[1][1] + eyes[1][3]) + 20    # 把眼睛高度最大的作為口罩區域起始y坐標
                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)  # 畫口罩區域的框
                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() # 關閉所有窗口
 
 
if __name__ == '__main__':
    main()

五、結果展示

檢測結果如下:

python如何基于Opencv實現人臉口罩檢測

圖5-1 HSV轉換結果圖

python如何基于Opencv實現人臉口罩檢測

圖5-2 口罩檢測結果圖

python如何基于Opencv實現人臉口罩檢測

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

以上是“python如何基于Opencv實現人臉口罩檢測”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

错那县| 长阳| 射阳县| 乐都县| 晋宁县| 县级市| 大方县| 江都市| 青铜峡市| 金华市| 海淀区| 湘潭市| 涞源县| 石城县| 封开县| 巴楚县| 鄂尔多斯市| 柘荣县| 含山县| 黎川县| 阜南县| 武义县| 通化市| 修水县| 曲阳县| 仁怀市| 清丰县| 阿拉善盟| 怀来县| 游戏| 西充县| 平度市| 民和| 乌拉特中旗| 启东市| 攀枝花市| 电白县| 焉耆| 库尔勒市| 廉江市| 区。|