OpenCV
嘴部检测
"""
嘴部区域检测
1. 静态图像检测嘴部区域创建分类器加载特征文件检测图像绘制嘴部区域显示
2. 切换为摄像头
"""
import cv2
import numpy as npclass FaceDetect : def __init__ ( self) : classifier_face = cv2. CascadeClassifier( ) classifier_mouth = cv2. CascadeClassifier( ) classifier_face. load( './haarcascade_frontalface_alt.xml' ) classifier_mouth. load( './haarcascade_mcs_mouth.xml' ) self. classifier_face = classifier_faceself. classifier_mouth = classifier_mouthself. logo = cv2. imread( './fans.jpg' ) pass def capVideo ( self) : cap = cv2. VideoCapture( 0 ) while cap. isOpened( ) : retval, frame = cap. read( ) if not retval: print ( 'can not read frame' ) break self. detect( frame) cv2. imshow( 'frame' , frame) key = cv2. waitKey( 25 ) if key == ord ( 'z' ) : break cap. release( ) pass def detect ( self, face_img) : face_rects = self. classifier_face. detectMultiScale( face_img) for face_rect in face_rects: x, y, w, h = face_rectcv2. rectangle( face_img, ( x, y) , ( x + w, y + h) , color= ( 0 , 0 , 255 ) , thickness= 2 ) self. detectMouth( face_rect, face_img) def detectMouth ( self, face_rect, face_img) : mouth_rects = self. classifier_mouth. detectMultiScale( face_img) face_min_x, face_min_y, face_w, face_h = face_rectidx = mouth_rects[ : , 1 ] > ( face_min_y + face_h * 0.6 ) mouth_rect = mouth_rects[ idx] for rect in mouth_rect: x, y, w, h = rectcv2. rectangle( face_img, ( x, y) , ( x + w, y + h) , color= ( 0 , 255 , 0 ) , thickness= 2 ) def drawLogo ( self, face_rect, face_img) : x, y, w, h = face_rectlogo = self. logoratio = min ( logo. shape[ : 2 ] ) / max ( logo. shape[ : 2 ] ) scale_logo = cv2. resize( logo, dsize= ( w, round ( w * ratio) ) ) scale_logo_h, scale_logo_w, _ = scale_logo. shapeface_img[ y - scale_logo_h: y, x: x + scale_logo_w] = scale_logodef drawLogo2 ( self, face_rect, face_img) : """1. 找轮廓- 原图:三通道彩色图- 灰度图(0-255)- 黑白二值图(0/255)2. 绘制轮廓- 绘制在背景是白色的图:param face_rect::param face_img::return:""" logo_gray = cv2. cvtColor( self. logo, cv2. COLOR_BGR2GRAY) retval, logo_binary = cv2. threshold( logo_gray, 100 , 255 , cv2. THRESH_OTSU) contours, hierarchy = cv2. findContours( logo_binary, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE) mask = np. zeros_like( self. logo) cv2. drawContours( mask, contours, 1 , color= ( 255 , 255 , 255 ) , thickness= - 1 ) x, y, w, h = face_rectlogo = self. logoratio = min ( logo. shape[ : 2 ] ) / max ( logo. shape[ : 2 ] ) scale_logo = cv2. resize( logo, dsize= ( w, round ( w * ratio) ) ) scale_mask = cv2. resize( mask, dsize= ( w, round ( w * ratio) ) ) scale_logo_h, scale_logo_w, _ = scale_logo. shapeidx = scale_mask == 255 after_mask_logo = scale_logo[ idx] face_img[ y - scale_logo_h: y, x: x + scale_logo_w] [ idx] = after_mask_logopass if __name__ == '__main__' : face_img = cv2. imread( './lyf.png' ) face_detect = FaceDetect( ) face_detect. detect( face_img) cv2. imshow( 'frame' , face_img) cv2. waitKey( 0 ) cv2. destroyAllWindows( )
人脸原图
嘴部检测效果图