pythonはOpencvに基づいて顔マスクの検査を行います。


一、開発環境
python 3.6.6
opencv-python 4.5.1
二、設計要求
1、opencv-pythonを使って人の顔マスクを検査します。
三、設計原理
設計フロー図は図3-1に示すように、

図3-1マスク検出フローチャート
まず写真の読み取りを行います。opencvのhaar鼻特徴分類器を使って鼻を検出したらマスクをしていないことを証明します。鼻が検出されたら、次にopencvのhaar目特徴分類器を使って、目が検出されなければ終了します。目が検出されると、RGB色空間をHSV色空間に変換する。マスク領域の測定を行います。マスク領域検出プロセスは、まず座標原点から近い横座標をマスク領域として開始し、座標原点から遠い横座標をマスク領域として終了します。座標原点から遠い縦軸はマスク領域として縦軸を開始し、座標原点から遠い縦軸は目の高さの2倍とマスク領域として縦軸を終了します。ここで述べたのはよく分からないかもしれません。図3-2を参照してください。

図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()
五、結果の展示
測定結果は以下の通りです。

図5-1 HSV変換結果図

図5-2マスク検査結果図

図5-3マスク検査結果図(耳を鼻と誤判)
六、結論
本実験では、Onecv-pythonを使って顔マスクの検査を行った。鼻・目の検査・使用時のopencvに持参する.xmlファイル。結果から,この方法は実行可能である。地下鉄駅や駅の出入り口で顔マスクの検査ができます。
この実験には一定の限界があります。例えば、写真の中には二人がいます。目が遮られます。興味があれば、自分でトレーニングしてもいいです。xmlファイル。もちろん、深さ学習に基づくターゲット検出モデル、例えばR-NNシリーズ、YOLOシリーズ、SSDなどを用いてモデルのトレーニングを行っても良い。
ここではpythonについてOpencvに基づいて人の顔マスクの検査を行う記事を紹介します。Opencvに関する顔マスクの検査内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。