iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 16
0
Software Development

Emacs 來寫程式系列 第 16

[Emacs-16] 用 Emacs 來寫 Python 人臉判別

OpenCV

OpenCV 是由 Intel 公司發起,BSD 授權模式,可以在商業及研究領域中免費使用的一個電腦視覺函式庫,可以用在

  • 擴增實境
  • 人臉,手勢判別
  • 動作辨識及追蹤
  • 物件辨識
    等等很多電腦視覺相關的領域

OpenCV 安裝

  • OpenCV官網提供了 Windows, iOS 跟 Andriod 的套件,

  • 至於 Mac OS,可以使用 $brew install opencv 來安裝 3.4 版

  • Linux 的比較新的版本則需要自己編譯,Ubuntu 的編譯請看官網 Ubuntu 10.04

  • Fedora/CentOS 7 可以參考以下

  • 一些 yum 的套件

$yum groupinstall "Development tools"
$yum install numpy python36-numpy python36-devel gtk2-devel pkgconfig libdc1394-devel
$yum install libv4l-devel gstreamer-plugins-base-devel
  • 使用 Python 的話,要先安裝 numpy 套件
$pip install numpy
  • 編譯 opencv
$git clone https://github.com/opencv/opencv
$cd opencv
$mkdir build
$cd build
$cmake -D WITH_OPENCL=OFF 
    -D WITH_CUDA=OFF 
    -D CMAKE_BUILD_TYPE=RELEASE 
    -D CMAKE_INSTALL_PREFIX=/usr/local 
    -D BUILD_opencv_python3=yes 
    -D PYTHON3_EXECUTABLE=/opt/rh/rh-python36/root/usr/bin/python3 
    -D PYTHON3_INCLUDE_DIR=/opt/rh/rh-python36/root/usr/include/python3.6m 
    -D PYTHON3_LIBRARY=/opt/rh/rh-python36/root/usr/lib64/libpython3.6m.so.rh-python36-1.0 
    -D PYTHON3_NUMPY_INCLUDE_DIRS=/opt/rh/rhpython36/root/usr/lib64/python3.6/sitepackages/numpy/core/include 
-D WITH_FFMPEG=OFF ..
$make -j 2
$sudo make install
$cd /opt/rh/rh-python36/root/usr/lib64/python3.6/site-packages
$sudo ln -s /usr/local/lib/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so cv2.so  
  • 加入 C/C++ ldconfig
    /etc/ld.so.conf.d/ 下,建立 opencv.conf
/usr/local/lib64

執行

$ldconfig

增加以下到 ~/.bash_profile

PKG_CONFIG_PATH=PKG_CONFIG_PATH:/usr/local/lib64/pkgconfig
export PKG_CONFIG_PATH
  • 檢查安裝結果,在 Python 下 import cv2
    Imgur

寫一個簡單的人臉判別 Python 程式

  • import cv2 跟 sys,把 haarcascade_frontalface_default.xml 設到字串
    Imgur
  • 建立判別器 Classifier Imgur
  • 使用 cv2.imread 讀進影像檔 Imgur
  • 將影像轉為灰階 Imgur
  • 偵測影像中的人臉 Imgur
  • 偵測完畢,在人臉上畫長方形 Imgur
  • 顯示畫框的影像,等待使用者按任意鍵結束 Imgur

執行

在 Command Line 或者 Emacs shell 執行 python facedetect.py harry-meghan-15.jpg
Imgur

完整程式

import cv2
import sys

# Get user supplied values
imagePath = sys.argv[1]
cascPath = "./haarcascade_frontalface_default.xml"

# 建立判別器 Classifier
faceCascade = cv2.CascadeClassifier(cascPath)

# 讀進影像
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 偵測影像中的人臉
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30)
)

print("Found {0} faces!".format(len(faces)))

# 在人臉上畫一個長方形
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# show 影像
cv2.imshow("Faces Found", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

相關影片,請看 Yes

相關簡報,請看 簡報

相關程式,請看 Github

相關資料,請看我的部落格


上一篇
[Emacs-15] 用 Emacs 來寫 Python 設定篇
下一篇
[Emacs-17] 用 Emacs 來寫 HTML, CSS 設定篇
系列文
Emacs 來寫程式30

尚未有邦友留言

立即登入留言