{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 引入人臉識別庫dlib\n", "import dlib" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 引入影象處理庫OpenCV\n", "import cv2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Cascade path\n", "cascPath = \"data/haarcascades/haarcascade_eye.xml\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Create the haar cascade\n", "eye_cascade = cv2.CascadeClassifier(cascPath)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 使用dlib庫提供的人臉提取器\n", "detector = dlib.get_frontal_face_detector()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 檔名流水號\n", "face_filename = 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 讀取影片,並抓取幀畫面圖片中的人臉部位圖,將其轉為pgm格式,儲存於指定位置\n", "def videoToPng(videoPath, saveDir):\n", " \n", " # 讀取影片\n", " cap = cv2.VideoCapture(videoPath)\n", " \n", " # 影片幀技術間隔頻率\n", " timeF = 10 \n", " \n", " # 計數器\n", " c=1\n", " \n", " # 循環讀取影片\n", " while(True):\n", " \n", " # 從VideoCapture擷取一張影像\n", " ret, frame = cap.read() \n", " \n", " # 每隔頻率進行操作\n", " if(c%timeF == 0):\n", " detectFaceAndSave(frame, saveDir)\n", " \n", " # 計數器遞增\n", " c = c + 1\n", " \n", " # 刷新\n", " cv2.waitKey(1)\n", " \n", " # 當最後讀取不到幀時,跳出迴圈\n", " if ret == False:\n", " print('videoToPng job finish')\n", " break\n", " \n", " # 釋放攝影機\n", " cap.release()\n", " \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 抓取圖片中的人臉部位圖,將其轉為pgm格式,儲存於指定位置\n", "def detectFaceAndSave(img, saveDir):\n", " \n", " # 將來源圖轉為灰度圖\n", " gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)\n", " \n", " # 返回臉的資訊\n", " faces = detector(gray)\n", " \n", " # 當人臉有一個以上時,則進入條件式\n", " if len(faces) > 0:\n", " \n", " # 遍尋每張人臉\n", " for face in faces:\n", " \n", " # 擷取圖片中,人臉的部位圖片\n", " crop_img_gray = gray[face.top():face.bottom(),face.left():face.right()]\n", " \n", " # 偵測人臉的眼睛\n", " eyes = eye_cascade.detectMultiScale(\n", " crop_img_gray,\n", " scaleFactor=1.1, #表示在前後兩次相繼的掃描中,搜索窗口的比例係數。默認為1.1即每次搜索窗口依次擴大10%\n", " minNeighbors=5, #表示構成檢測目標的相鄰矩形的最小個數(默認為3個)\n", " minSize=(30, 30),#限制得到的目標區域的最小範圍 \n", " )\n", " \n", " # 使用全域變數\n", " global face_filename\n", " \n", " # 當人臉有兩個眼睛時,則進入條件式\n", " if(len(eyes) == 2):\n", " \n", " # 字串格式化處理儲存位置以及檔案名稱\n", " name = '{}{}.pgm'.format(saveDir, face_filename)\n", " print(name)\n", " \n", " # 統一圖片大小\n", " crop_img_gray = cv2.resize(crop_img_gray, (400, 400))\n", " \n", " # 寫入圖片\n", " cv2.imwrite(name, crop_img_gray)\n", " \n", " # 檔名流水號遞增\n", " face_filename+= 1\n", " \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 程式進入點\n", "if __name__ == '__main__':\n", " \n", " # 影片檔來源路徑\n", " # videoPath = 'data/video/Obama.mp4'\n", " videoPath = 'data/video/TT_TZUYU.mp4'\n", " \n", " # 儲存圖片檔路徑\n", " # saveDir = 'data/image/train/Obama/'\n", " saveDir = 'data/image/train/TZUYU/'\n", "\n", " videoToPng(videoPath, saveDir)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }