圖形辨識筆記-OPEN CV (haarcascades )

閱讀時間約 17 分鐘

Haar Cascade classifier

pip install opencv-python
資料來源:
https://steam.oxxostudio.tw/category/python/ai/ai-face-dectection.html
https://github.com/opencv/opencv/tree/4.x/data/haarcascades
https://www.instructables.com/Real-time-Face-Recognition-an-End-to-end-Project/

偵測人臉

import cv2
def detectFace(img):
    filename = img.split(".")[0] # 取得檔案名稱(不添加副檔名)
    img = cv2.imread(img) # 讀取圖檔
    grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 透過轉換函式轉為灰階影像
    color = (0, 255, 0)  # 定義框的顏色
    
    # OpenCV 人臉識別分類器
    face_classifier = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
    
    # 調用偵測識別人臉函式
    faceRects = face_classifier.detectMultiScale(
        grayImg, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    
    # 大於 0 則檢測到人臉
    if len(faceRects):  
        # 框出每一張人臉
        for faceRect in faceRects: 
            x, y, w, h = faceRect
            cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
    
    # 將結果圖片輸出
    cv2.imwrite(filename + "_face.jpg", img)
    
detectFace('123.jpg')

import cv2
img = cv2.imread('a.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # 將圖片轉成灰階
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")   # 載入人臉模型
faces = face_cascade.detectMultiScale(gray)    # 偵測人臉
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)    # 利用 for 迴圈,抓取每個人臉屬性,繪製方框
cv2.imshow('test', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()

偵測多人臉

import cv2
name=input("輸入圖片檔案:")
def detect(filename):
    face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #傳遞引數是scaleFactor和minNeighbors,分別表示人臉檢測過程中每次迭代時影象的壓縮率以及每個人臉矩形保留近鄰數目的最小值
    #檢測結果返回人臉矩形陣列
    face = face_cascade.detectMultiScale(gray)
    for (x, y, w, h) in face:
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    cv2.namedWindow("Face Detected!")
    cv2.imshow("Face Detected!", img)
    cv2.imwrite("./images/Face.jpg", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
detect(name)

即時偵測

import cv2
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
#faces = face_cascade.detectMultiScale(gray)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    ret, frame = cap.read()
    if not ret:
        print("Cannot receive frame")
        break
    frame = cv2.resize(frame,(540,320))              # 縮小尺寸,避免尺寸過大導致效能不好
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)   # 將鏡頭影像轉換成灰階
    faces = face_cascade.detectMultiScale(gray)      # 偵測人臉
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)   # 標記人臉
    cv2.imshow('oxxostudio', frame)
    if cv2.waitKey(1) == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

模型訓練

import cv2
import numpy as np
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')  # 載入人臉追蹤模型
recog = cv2.face.LBPHFaceRecognizer_create()      # 啟用訓練人臉模型方法
faces = []   # 儲存人臉位置大小的串列
ids = []     # 記錄該人臉 id 的串列
for i in range(1,5):
    img = cv2.imread(f'D:\\test\\face01\\{i}.jpg')           # 依序開啟每一張第一位的照片
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 色彩轉換成黑白
    img_np = np.array(gray,'uint8')               # 轉換成指定編碼的 numpy 陣列
    face = detector.detectMultiScale(gray)        # 擷取人臉區域
    for(x,y,w,h) in face:
        faces.append(img_np[y:y+h,x:x+w])         # 記錄第一位人臉的位置和大小內像素的數值
        ids.append(1)                             # 記錄第一位人臉對應的 id,只能是整數,都是 1 表示第一位的 id 為 1
for i in range(1,2):
    img = cv2.imread(f'D:\\test\\face02\\{i}.jpg')           # 依序開啟每一張第二位的照片
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 色彩轉換成黑白
    img_np = np.array(gray,'uint8')               # 轉換成指定編碼的 numpy 陣列
    face = detector.detectMultiScale(gray)        # 擷取人臉區域
    for(x,y,w,h) in face:
        faces.append(img_np[y:y+h,x:x+w])         # 記錄第二位人臉的位置和大小內像素的數值
        ids.append(2)                             # 記錄第二位人臉對應的 id,只能是整數,都是 1 表示第二位的 id 為 1
print('camera...')                                # 提示啟用相機
cap = cv2.VideoCapture(0)                         # 啟用相機
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    ret, img = cap.read()                         # 讀取影片的每一幀
    if not ret:
        print("Cannot receive frame")
        break
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 色彩轉換成黑白
    img_np = np.array(gray,'uint8')               # 轉換成指定編碼的 numpy 陣列
    face = detector.detectMultiScale(gray)        # 擷取人臉區域
    for(x,y,w,h) in face:
        faces.append(img_np[y:y+h,x:x+w])         # 記錄自己人臉的位置和大小內像素的數值
        ids.append(3)                             # 記錄自己人臉對應的 id,只能是整數,都是 1 表示川普的 id
    cv2.imshow('TEST', img)                      # 顯示攝影機畫面
    if cv2.waitKey(100) == ord('q'):              # 每一毫秒更新一次,直到按下 q 結束
        break
print('training...')                              # 提示開始訓練
recog.train(faces,np.array(ids))                  # 開始訓練
recog.save('face.yml')                            # 訓練完成儲存為 face.yml
print('ok!')

透過訓練的模型即時辨識

import cv2
recognizer = cv2.face.LBPHFaceRecognizer_create()         # 啟用訓練人臉模型方法
recognizer.read('face.yml')                               # 讀取人臉模型檔
cascade_path = "haarcascade_frontalface_default.xml"  # 載入人臉追蹤模型
face_cascade = cv2.CascadeClassifier(cascade_path)        # 啟用人臉追蹤
cap = cv2.VideoCapture(0)                                 # 開啟攝影機
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    ret, img = cap.read()
    if not ret:
        print("Cannot receive frame")
        break
    img = cv2.resize(img,(540,300))              # 縮小尺寸,加快辨識效率
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 轉換成黑白
    faces = face_cascade.detectMultiScale(gray)  # 追蹤人臉 ( 目的在於標記出外框 )
    # 建立姓名和 id 的對照表
    name = {
        '1':'One',
        '2':'Two',
        '3':'Joker'
    }
    # 依序判斷每張臉屬於哪個 id
    for(x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)            # 標記人臉外框
        idnum,confidence = recognizer.predict(gray[y:y+h,x:x+w])  # 取出 id 號碼以及信心指數 confidence
        if confidence < 60:
            text = name[str(idnum)]                               # 如果信心指數小於 60,取得對應的名字
        else:
            text = '???'                                          # 不然名字就是 ???
        # 在人臉外框旁加上名字
        cv2.putText(img, text, (x,y-5),cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2, cv2.LINE_AA)
    cv2.imshow('oxxostudio', img)
    if cv2.waitKey(5) == ord('q'):
        break    # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
為什麼會看到廣告
40會員
130內容數
獨立遊戲開發紀錄
留言0
查看全部
發表第一個留言支持創作者!
吳佳鑫的沙龍 的其他內容
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
取得掌紋 圖片比對 後續思維... 透過特徵比對+CNN,以YOLO 或 TensorFlow+Keras進行會比較正確。 單靠OpneCV至此是極限,要判斷出各條線,沒模型,則要以numpy陣列加上相似度(哈希算法等)去做,整體上不好進行... 待續...
原碼:https://reurl.cc/bGkxKr 資料庫連線 資料庫的連線建立完成後,要進行相關的操作,需要建立Cursor(指標)物件來執行,這邊使用Python的with陳述式,當資料庫存取完成後,自動釋放連線。 INSERT SELECT Select 取得單筆資料 fetchone()
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
「娜斯佳,可以知道虎嘯山誌的紙本資料放在哪嗎?」我想著若可以知道原始的紙本資料放在哪,那或許就可以知道更完整的資訊了。 「妳可以試著去圖書館找找吧!」娜斯佳背對著我說。 「只是妳可能只會看到一般給市民看的資料,這種有內幕的資訊…」 「可能要到市府內的檔案管理局才有辦法看到。」娜斯佳頓了一頓說。
「學姊~」當我下課,正要上車時,一道聲音從我後方而來。 「好久不見了。」我笑著看向前方奔跑過來的彤羽。 「我就知道學姊會來上課。」彤羽來到我跟前說道。 「我以為,妳會直接去子璇家。」 「本來是想這樣,可是想想我還是先回我住的那,整理好,再來這跟妳一起過去。」 「所以妳自己一個人回來?」 「彤羽?」
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
取得掌紋 圖片比對 後續思維... 透過特徵比對+CNN,以YOLO 或 TensorFlow+Keras進行會比較正確。 單靠OpneCV至此是極限,要判斷出各條線,沒模型,則要以numpy陣列加上相似度(哈希算法等)去做,整體上不好進行... 待續...
原碼:https://reurl.cc/bGkxKr 資料庫連線 資料庫的連線建立完成後,要進行相關的操作,需要建立Cursor(指標)物件來執行,這邊使用Python的with陳述式,當資料庫存取完成後,自動釋放連線。 INSERT SELECT Select 取得單筆資料 fetchone()
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
「娜斯佳,可以知道虎嘯山誌的紙本資料放在哪嗎?」我想著若可以知道原始的紙本資料放在哪,那或許就可以知道更完整的資訊了。 「妳可以試著去圖書館找找吧!」娜斯佳背對著我說。 「只是妳可能只會看到一般給市民看的資料,這種有內幕的資訊…」 「可能要到市府內的檔案管理局才有辦法看到。」娜斯佳頓了一頓說。
「學姊~」當我下課,正要上車時,一道聲音從我後方而來。 「好久不見了。」我笑著看向前方奔跑過來的彤羽。 「我就知道學姊會來上課。」彤羽來到我跟前說道。 「我以為,妳會直接去子璇家。」 「本來是想這樣,可是想想我還是先回我住的那,整理好,再來這跟妳一起過去。」 「所以妳自己一個人回來?」 「彤羽?」
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
如果你不擅長直接編寫原始碼的話,要製作網頁、電子報,一定會非常辛苦,本文介紹的開源網頁神器 GrapesJS 絕對是你在找的工具,強大又免費的特性,可以用 Chrome App 的方式安裝,其它編輯器比起來又簡單很多;還有自訂原始碼……
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
FENDI為2024高級訂服製建構出人類的「未來主義」。 全新「Scatola」(「盒子」之意)廓形開頭到收尾,流動精準的幾何打版工藝創造出嶄新量體:高撚雙紗真絲卻描述了輕盈硬挺的效果。 Super Kid Mohair 幼馬海毛布料、上等羊絨和小羊駝紗線的羅紋針織一吋一釐貼
Thumbnail
扭曲變形或 P 圖的照片看鬼有差嗎? . 網友問的。 . 請參照下圖原圖和扭曲的圖片, 網友問這樣的兩張圖片讓我看鬼的話, 會有差嗎? 普通看不到的人可能以為沒差, 但答案其實是很可能會有差, 假設鬼是在很接近兔兔身邊的話啦, 那鬼的樣子就會 [ 連帶被扭曲變形 ], 所以呢,如果你拍照的時候, 使
Thumbnail
「醫師,這次的超音波檢查還好嗎?」因為B型肝炎帶原,定期在門診追蹤的陳先生問。 「這次檢查發現你的肝臟有一顆腫瘤喔。」醫師指著螢幕上的影像說,「目前腫瘤還不到1公分,接下來要盡快安排治療。」 B型肝炎病毒會增加罹患肝癌的風險,帶原者必須定期追蹤,才有辦法早期發現肝癌。
Thumbnail
這是《哈佛商業評論最有影響力的30篇文章》書中收錄的第七篇文章。​說到約翰.科特,或許並不多人知道。但說到《冰山在融化》這本經典的寓言故事,我想許多人都曾經看過。​​應對變革是現代工作者需要具備的重要技巧,不管你是不是領導者,都有可能隨時被推上這個角色、臨危受命。這時候你會怎麼做?​
Thumbnail
「醫師,我最近常咳嗽,能不能開點咳嗽藥給我?」50多歲的張女士問,她是位類風濕性關節炎患者,長期在門診追蹤治療。 「咳多久了?」醫師問。 「咳了2、3個禮拜,可能有感冒吧。」 「咳嗽遲遲沒好轉可能不是單純感冒,要做檢查喔。」醫師謹慎地說。
Thumbnail
在這篇文章中,我會說明如何從《零規則》這本書中萃取出知識點與概念,並製作為一張全息圖?
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
如果你不擅長直接編寫原始碼的話,要製作網頁、電子報,一定會非常辛苦,本文介紹的開源網頁神器 GrapesJS 絕對是你在找的工具,強大又免費的特性,可以用 Chrome App 的方式安裝,其它編輯器比起來又簡單很多;還有自訂原始碼……
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
FENDI為2024高級訂服製建構出人類的「未來主義」。 全新「Scatola」(「盒子」之意)廓形開頭到收尾,流動精準的幾何打版工藝創造出嶄新量體:高撚雙紗真絲卻描述了輕盈硬挺的效果。 Super Kid Mohair 幼馬海毛布料、上等羊絨和小羊駝紗線的羅紋針織一吋一釐貼
Thumbnail
扭曲變形或 P 圖的照片看鬼有差嗎? . 網友問的。 . 請參照下圖原圖和扭曲的圖片, 網友問這樣的兩張圖片讓我看鬼的話, 會有差嗎? 普通看不到的人可能以為沒差, 但答案其實是很可能會有差, 假設鬼是在很接近兔兔身邊的話啦, 那鬼的樣子就會 [ 連帶被扭曲變形 ], 所以呢,如果你拍照的時候, 使
Thumbnail
「醫師,這次的超音波檢查還好嗎?」因為B型肝炎帶原,定期在門診追蹤的陳先生問。 「這次檢查發現你的肝臟有一顆腫瘤喔。」醫師指著螢幕上的影像說,「目前腫瘤還不到1公分,接下來要盡快安排治療。」 B型肝炎病毒會增加罹患肝癌的風險,帶原者必須定期追蹤,才有辦法早期發現肝癌。
Thumbnail
這是《哈佛商業評論最有影響力的30篇文章》書中收錄的第七篇文章。​說到約翰.科特,或許並不多人知道。但說到《冰山在融化》這本經典的寓言故事,我想許多人都曾經看過。​​應對變革是現代工作者需要具備的重要技巧,不管你是不是領導者,都有可能隨時被推上這個角色、臨危受命。這時候你會怎麼做?​
Thumbnail
「醫師,我最近常咳嗽,能不能開點咳嗽藥給我?」50多歲的張女士問,她是位類風濕性關節炎患者,長期在門診追蹤治療。 「咳多久了?」醫師問。 「咳了2、3個禮拜,可能有感冒吧。」 「咳嗽遲遲沒好轉可能不是單純感冒,要做檢查喔。」醫師謹慎地說。
Thumbnail
在這篇文章中,我會說明如何從《零規則》這本書中萃取出知識點與概念,並製作為一張全息圖?