OpenCV 實作

講者:ㄇㄒ

日期:2020/12/27

臉部位置標示

Outline

  • 前置作業
  • 正式實作
  • 參考資料

前置作業

安裝OpenCV

$ pip install opencv-python

上次有安裝過的就可以不用裝了~

找到安裝位置

不熟悉安裝位置的話下面指令幫助您

$ pip show opencv-python

依序打開cv2 → data資料夾

選擇等等要用的模組

  • 人臉:haarcascade_frontalface_default.xml
  • 貓臉:haarcascade_frontalcatface.xml

把整個路徑記下來

尋找、下載想要辨識的圖片

But 不要太刁難他找側臉的

正式實作

開啟特徵檔

import cv2

face_cascade = cv2.CascadeClassifier('檔案路徑')

開啟圖片、啟用辨識

img = cv2.imread('圖片路徑')

faces = face_cascade.detectMultiScale(img, scaleFactor=1.05, minNeighbors=3, minSize=(10, 10))
  • scaleFactor:預設為1.1,前後兩次相繼的掃描中,搜索範圍的比例係數
  • minNeighbors:預設為3,控制誤檢率的參數
  • minSize:設定最小辨識區塊大小
  • maxSize:設定最大辨識區塊大小
  • flags:設定檢測模式

進行標示 ( 畫框框 )

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)

cv2.rectangle(圖片, 起始座標, 結束座標,

顏色(B,G,R), 粗細)

結果顯示

cv2.imshow('結果顯示', img)
cv2.waitKey(0)

完整程式碼

import cv2
face_cascade = cv2.CascadeClassifier('特徵檔路徑')

img = cv2.imread('圖片路徑')
faces = face_cascade.detectMultiScale(img, scaleFactor=1.08, minNeighbors=5, minSize=(15, 15))

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)

cv2.imshow('img', img)
cv2.waitKey(0)

補充:臉部儲存圖片

Text

from PIL import Image

count = 1
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2) # (Blue,Green,Red)
    filename = "find" + str(count) + ".jpg"
    i1 = Image.open('原始圖片名稱')
    i2 = i1.crop((x, y, x + w, y + h))
    i3 = i2.resize((200, 200), Image.ANTIALIAS)
    i3.save(filename)
    count += 1

補充:比較圖片差異

import math, operator
from PIL import Image
from functools import reduce

# 以i1為基準比較
i1 = Image.open('圖片路徑')
i2 = Image.open('圖片路徑')
h1 = i1.histogram()
h2 = i2.histogram()
diff = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1))

print(diff) # 數值越大差異越大

非連貫程式

Reference

  • 文淵閣工作室(2019). Python初學特訓班(第四版):從快速入門到主流應用全面實戰. 台北市: 碁峰.
  • Old Siao(2020). [2020鐵人賽Day30]糊裡糊塗Python就上手-體驗 OpenCV 人臉辨識. Retrieved from: https://reurl.cc/9XMGRO.
  • Neil Ye(2017). [ OpenCV ] 利用 OpenCV抓取相片中的臉部數據. Retrieved from: https://ppt.cc/fgY2ox.

感謝聆聽(ノ◕ヮ◕)ノ*:・゚✧

Made with Slides.com