iT邦幫忙

0

OPENCV人臉辨識

  • 分享至 

  • xImage

在執行
import cv2
import os
camema = cv2.VideoCapture(0) #對應/dev/video0的攝影機
camema.set(3, 640) # 設定影片寬度
camema.set(4, 480) # 設定影片高度
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
id = input('\n請輸入id?')
print("\n 初始化錄影機,請等待")
count = 0
while(True):
ret, img = camema.read()
img = cv2.flip(img, 1) #設定影像左右互換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #轉換成灰階
faces = detector.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5) #辨識影像
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) #加上綠框
count += 1
cv2.imwrite("images/User." + str(id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w]) #儲存影像到dataset資料夾
cv2.imshow('image', img)
k = cv2.waitKey(100) & 0xff #等待0.1秒,偵測鍵盤按鍵是否按下
if k == 27:#按下ESC按鍵,中斷while迴圈
break
elif count >= 30: # 偵測30張臉後,中斷while迴圈
break
print("\n 偵測完成")
camema.release()
cv2.destroyAllWindows()

時最終結果跑出
Traceback (most recent call last):
File "C:/Users/ADMIN/PycharmProjects/pythonProject2/images/1.py", line 13, in
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #轉換成灰階
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
想請問要怎麼解決

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
hokou
iT邦好手 1 級 ‧ 2022-07-11 19:51:26

錯誤13行往前一行加

print(img.shape)

如果是空或是錯誤,代表沒讀到圖,甚至是鏡頭沒抓到(沒開?)

請再往前找問題

看更多先前的回應...收起先前的回應...
u09127104 iT邦新手 5 級 ‧ 2022-07-12 09:40:32 檢舉

沒讀到圖 鏡頭有開 但是沒跳出來

hokou iT邦好手 1 級 ‧ 2022-07-12 09:59:10 檢舉

所以建議要往上查鏡頭相關的設定是否有錯誤
例如攝影機編號錯誤之類的(開錯開到第 n 個鏡頭)

有抓到影像就不會跳轉換失敗的錯誤了

參考:OpenCV 擷取網路攝影機串流影像,處理並寫入影片檔案教學

u09127104 iT邦新手 5 級 ‧ 2022-07-12 10:49:42 檢舉

for i in range(1,31):
# 依序開啟每一張蔡英文的照片
img = cv2.imread(r"C:\Users\ADMIN\PycharmProjects\pythonProject2\opencv\faces")
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
是這段沒辦法讀到圖片

Traceback (most recent call last):
File "C:/Users/ADMIN/PycharmProjects/pythonProject2/opencv/as.py", line 11, in
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 色彩轉換成黑白
cv2.error: OpenCV(4.1.2) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

我把圖片位置改成絕對位置 這樣還是沒辦法

hokou iT邦好手 1 級 ‧ 2022-07-12 13:24:17 檢舉
img = cv2.imread(r"C:\Users\ADMIN\PycharmProjects\pythonProject2\opencv\faces")

這個路徑看起來是一個資料夾,不是一張圖,所以讀不到

u09127104 iT邦新手 5 級 ‧ 2022-07-13 10:50:46 檢舉

我的圖片都放在這個資料夾裡面 那我該如打才會讀到圖片

u09127104 iT邦新手 5 級 ‧ 2022-07-13 11:00:48 檢舉

如果要依序開啟圖片的話我程式該如何打

u09127104 iT邦新手 5 級 ‧ 2022-07-13 11:07:39 檢舉

img = cv2.imread(r'C:\Users\ADMIN\PycharmProjects\pythonProject2\opencv\faces\1.png')
目前改成這樣
cv2.error: OpenCV(4.1.2) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

hokou iT邦好手 1 級 ‧ 2022-07-13 11:56:06 檢舉

有些資訊不足,只能推測(猜)

跑 for 迴圈讀圖應該代表你的圖片名稱應該是 1.png~30.png
所以你要在路徑那邊加入變數 i
路徑那邊怕解讀錯誤,所以反斜線 \ 我改成 \\

for i in range(1,31):
    img = cv2.imread(f'C:\\Users\\ADMIN\\PycharmProjects\\pythonProject2\\opencv\\faces\\{i}.png')

另外建議程式碼要包起來(</>),不然 python 是靠空格,會解讀困難

u09127104 iT邦新手 5 級 ‧ 2022-07-13 13:58:40 檢舉

照著你的方式跑一次了

Traceback (most recent call last):
File "C:/Users/ADMIN/PycharmProjects/pythonProject2/opencv/as.py", line 12, in
face = detector.detectMultiScale(gray) # 擷取人臉區域
cv2.error: OpenCV(4.1.2) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

目前是這行出問題

hokou iT邦好手 1 級 ‧ 2022-07-13 14:22:57 檢舉

其實以你這樣的資訊提供是有點問題的

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# detector = cv2.CascadeClassifier('xml檔案所在路徑')

確認一下這個 haarcascade_frontalface_default.xml 檔案所放的放的路徑吧

u09127104 iT邦新手 5 級 ‧ 2022-07-13 14:39:04 檢舉
hokou iT邦好手 1 級 ‧ 2022-07-13 16:10:32 檢舉

https://steam.oxxostudio.tw/category/python/ai/ai-face-dectection.html
可以看到需要下載人臉特徵模型,然後放到跟你的py檔同一個資料夾內
就可以用以下讀取

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

我要發表回答

立即登入回答