疲労検出
#导入工具包 DISTとしてscipy.spatialインポート距離から コレクションからOrderedDictインポート NPとしてインポートnumpyのを インポートargparseの インポート時間 インポートDLIBの インポートCV2 FACIAL_LANDMARKS_68_IDXS = OrderedDict([ ( "口"、(48、68))、( "right_eyebrow"、 (17、22))、 ("left_eyebrow"、(22、27))、 ("right_eye"、(36、42))、 ("left_eye"、(42、48))、 ("鼻"、(27 、36))、 ("ジョー"、(0、17)) ]) #http://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdf DEF eye_aspect_ratio(眼): #计算距离、竖直的 A = dist.euclidean(目[1]、眼[5]) B = dist.euclidean(目[2]眼[4])眼[4]) #のレベルを距離を計算します Dist.euclidean = C([3]アイ[0]、アイ) #値のEAR EAR =(A + B)/(2.0 * C) リターンEAR #入力パラメータ AP = argparse.ArgumentParser() ap.add_argument(「 - p型"" "= Trueの場合、必要に応じ、--shape-予測 ひげランドマーク予測へのパスヘルプ=は" ") ap.add_argument(" - 「 "=タイプ= strの、デフォルトの、" V "" --video、 ヘルプ= "入力された映像ファイルへのパス") 引数= VARS(ap.parse_args()) #設定決意パラメータ EYE_AR_THRESH = 0.3 EYE_AR_CONSEC_FRAMES。3 = #は、カウンタを初期化する カウンタ= 0 TOTAL = 0 #検出および局在ツール プリント(「[INFO]ローディングランドマーク予測...ひげ") 検出器= dlib.get_frontal_face_detector() = dlib.shape_predictor予測(引数[ "shape_predictor"]) #取られた2つの目の領域 各フレームを通して位 真つつ。 #前処理 (LSTART、貸す)= FACIAL_LANDMARKS_68_IDXS [ "left_eye"] (RSTART、レンド)= FACIAL_LANDMARKS_68_IDXS [ "right_eye"] #读取视频 プリント( "[INFO]ビデオストリームスレッドを開始...") = cv2.VideoCapture(引数対【 "ビデオ"]) #vs = FileVideoStream(引数[ "ビデオ"])開始()。 time.sleep(1.0) DEF shape_to_np(形状、DTYPE = "INT"): * 2#创建68 COORDSの=のnp.zeros ((shape.num_parts、2)、DTYPE = DTYPE)# 遍历每一个关键点 #得到坐标 Iの範囲内(0、shape.num_parts)用: COORDS [I] =(shape.part(I).X、形状.part(I).Y) リターンCOORDSの フレーム= vs.read()[1] フレームがNone場合: ブレーク (H、W)= frame.shape [。2] 幅= 1200 R&LT =幅/フロート(W) 薄暗い=(幅、INT(* R&LT H)) フレーム= cv2.resize(フレーム、薄暗い、補間= CV2。 INTER_AREA) グレー= cv2.cvtColor(フレーム、cv2.COLOR_BGR2GRAY) #顔検出 rects =検出器(グレー、0) 各検出された顔を介し# rectsでRECT用: #1を取得する座標 形状=予測(灰色、RECTを) 形状= shape_to_np(形状) #耳値を算出する 左眼用=シェイプ[LSTART:LEND] rightEye =シェイプ[RSTART:REND] leftEAR = eye_aspect_ratio(左眼用) rightEAR = eye_aspect_ratio(rightEye) #カウント平均 耳=(leftEAR + rightEAR)/ 2.0 #描画目領域 leftEyeHull = cv2.convexHull(左眼用) rightEyeHull = CV2。凸包(rightEye) cv2.drawContours(フレーム、[leftEyeHull] -1、(0、255、0),. 1) cv2.drawContours(フレーム、[rightEyeHull]、 - 1は、(0、255、0)、1) #をチェックするかどうかのしきい値 IF EAR <EYE_AR_THRESH: COUNTER + 1 = 他: いくつかの連続したフレームは、合計とを、目を閉じている場合は# COUNTER IF> = EYE_AR_CONSEC_FRAMES: TOTAL + = 1 #リセット カウンタ= 0 #表示 cv2.putText(フレーム、 "[点滅:{}"形式(TOTAL)、(10、30)、 cv2.FONT_HERSHEY_SIMPLEX、0.7、(0、0、255)、2) cv2.putText(フレーム、 "EAR:{:}。.2f"フォーマット(EAR)、(300、30)、 cv2.FONT_HERSHEY_SIMPLEX、0.7、(0、0、255)、2) cv2.imshow( "フレーム"、フレーム) キー= cv2.waitKey(10)&0xFFで あれば、キー== 27: ブレーク vs.release() cv2.destroyAllWindows()
OpenCVのコンピュータビジョンの戦闘
非常に良いの話はもちろん唐ゆうディ先生は少し高価です
コースカタログ
01コースの概要と環境設定
02基本操作イメージ
03しきい値スムージング
04画像形態学的処理
画像勾配05を算出します
06エッジ検出
07画像ピラミッドと輪郭検出
08ヒストグラムとフーリエ変換します
09プロジェクトの戦闘 - クレジットカード番号を識別するために、
10プロジェクトの戦闘 - ドキュメントスキャンOCR認識
11画像特徴-harris
12画像特徴-sift
実際の戦闘の13例 - パノラマ画像ステッチ
14プロジェクトの戦闘 - 認識のための駐車場
15プロジェクトの戦闘 - 解答用紙年生を識別するために、
16背景モデリング
17オプティカルフロー推定
DNNモジュールの18Opencv
19プロジェクトの戦闘 - ターゲット追尾
操作の20原則、コンボリューション
21プロジェクトの戦闘 - 疲労検出
#导入工具包scipy.spatialインポート距離からdistfromコレクションはnpimport argparseimport timeimport dlibimport CV2としてOrderedDictimportのnumpyのをインポートするよう
FACIAL_LANDMARKS_68_IDXS = OrderedDict([( "口"、(48、68))、( "right_eyebrow"、(17、22)) 、( "left_eyebrow"、(22、27))、( "right_eye"、(36、42))、( "left_eye"、(42、48))、( "鼻"、(27、36))、( "ジョー"、(0、17))])
#Http://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdfdef eye_aspect_ratio(眼):#距離を計算し、垂直A = dist.euclidean(目[1] 、眼[5 】)B = dist.euclidean(目[ 2]、眼[4])#は、C = dist.euclidean(眼[0]のレベルの距離を計算する 、眼[3])#耳値耳=(+ B)を/(2.0 * C)リターン耳 #の入力パラメータAP = argparse.ArgumentParser()ap.add_argument( " - P"、 "--shape予測器"、必須= trueの場合、ヘルプ= "顔のランドマーク予測パス")AP .add_argument( " - V"、 " --video"、タイプ= STR、デフォルト= ""、ヘルプ= ""入力された映像ファイルのパス)引数=のVARS(ap.parse_args())#の設定決意パラメータEYE_AR_THRESH = 0.3 =。3 EYE_AR_CONSEC_FRAMESの
位カウンタ0TOTAL = 0 =を初期化カウンタ
#検出および局在ツールプリント( "[INFO]ローディング顔ランドマーク予測...")検出器= dlib.get_frontal_face_detector()予測= dlib.shape_predictor(引数[ "shape_predictor"])
#取られた2つの目の領域(LEND LSTART)FACIAL_LANDMARKS_68_IDXS = [ "left_eye"](RSTART、REND)FACIAL_LANDMARKS_68_IDXS = [ "right_eye"]
#読み取りビデオ印刷( "[INFO]ビデオ出発ストリームスレッドを...") = cv2.VideoCapture VS(引数[ "ビデオ"])#VS = FileVideoStream(引数[ "ビデオ"])スタート()time.sleep(1.0)。
DEF shape_to_np(形状、DTYPE = "INT"):#68を作成します* = 2coordsのnp.zeros((shape.num_parts、 2)、DTYPE = DTYPE)#の各キーポイントを介し位に範囲(0、shape.num_partsでIの座標を取得する ):COORDS [I] =は(shape.part( I).X、shape.part(I).Y)COORDSリターン
真ながら、各フレームを介し番号:#前処理フレーム= vs.read()[1]ブレーク(H、W)=フレーム:フレームはどれもない場合.shapeは:[2]幅= 1200Rグレー= cv2.cvtColor(W)DIM =(幅、INT(時間*の商標))フレーム= cv2.resize(フレーム、DIM、補間= cv2.INTER_AREA)=幅/フロート( フレーム、CV2。COLOR_BGR2GRAY)
#)は、ヒトの顔rects =検出器(灰色、0を検出
#rectsにRECT各検出された顔を横断します。#取得は、形状=予測(グレー、RECT)シェイプ= shape_to_np(形状)座標
[:貸すLSTART]#耳値左眼用=形状を算出 rightEye =形状[RSTARTました: REND] leftEAR = eye_aspect_ratio(左眼用)rightEAR = eye_aspect_ratio(rightEye)
#=平均EAR(leftEAR rightEAR +)/ 2.0計算
#描画目領域leftEyeHull = cv2.convexHull(左眼用)rightEyeHull = cv2.convexHull(rightEye)CV2。 drawContours(フレーム、[leftEyeHull] -1、(0、255、0),. 1)cv2.drawContours(フレーム、[rightEyeHull] -1、(0、255、0),. 1)
閾値があれば満たされているかどうかチェック# EAR <EYE_AR_THRESH:+ = COUNTER 1。
他:#いくつかの連続したフレームが閉じている場合は、目、合計およびCOUNTER IF> = EYE_AR_CONSEC_FRAMES:TOTAL = 1 +
#COUNTER = 0にリセット
#1显示のcv2.putText(フレーム、 "点滅:{}"形式(TOTAL)、(10、30)、cv2.FONT_HERSHEY_SIMPLEX、0.7、(0、0、255)、2)cv2.putText(フレーム、「EAR :{:.2f}」形式(耳)、(300、30)、cv2.FONT_HERSHEY_SIMPLEX、0.7、(0、0、255)、2)
cv2.imshow( "フレーム"、フレーム)キー= cv2.waitKey (10)&0xFFであれば、キー== 27:ブレーク
vs.release()cv2.destroyAllWindows()