0x00思路概覽

該程式整體邏輯是,識別你的臉并保存count(計數器)張你的臉的圖片,然后退出,或者在運行中按q,
其中有兩層重要的回圈
1.持續呼叫攝像頭回圈-----while true
2.處理識別函式識別出的每張臉的函式-----for xywh in face
0x01代碼概覽

(分類器是啥?)-------F&A --2
0x02.相機邏輯分析
啟動呼叫
camera = cv2.VideoCapture(0)#表示打開筆記本的內置攝像頭
獲取單個幀
光啟動沒用,需要捕獲每一幀圖片,編程而言,能細化的東西一定會盡量細化,想事情往往不能想的太過簡單
ret, frame = camera.read()
這個ret用來反饋例外,如果截取不到幀則退出
釋放
camera.release()
0x03.識別邏輯分析
轉換
獲取單個幀后,opencv讀取圖片的顏色通道排列時BGR,因此需要轉換,
(深度學習中為什么普遍使用BGR而不用RGB?)----F&A 1
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#將BGR格式轉換成灰度圖片
frame是上文每一幀圖片的載體
第二個引數是圖片格式,更多引數如下
識別函式
這里我們之前用gray接受了BGR格式的當前幀
faces = face_cascade.detectMultiScale(gray, 1.4, 5)
引數1:image--待檢測圖片,一般為灰度影像加快檢測速度;
引數2:objects--被檢測物體的矩形框向量組;
引數3:scaleFactor--表示在前后兩次相繼的掃描中,搜索視窗的比例系數,默認為1.1即每次搜索視窗依次擴大10%;
引數4:minNeighbors--表示構成檢測目標的相鄰矩形的最小個數(默認為3個),
如果組成檢測目標的小矩形的個數和小于 min_neighbors - 1 都會被排除,
如果min_neighbors 為 0, 則函式不做任何操作就回傳所有的被檢候選矩形框,
這種設定值一般用在用戶自定義對檢測結果的組合程式上;
引數5:flags--要么使用默認值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果設定為 CV_HAAR_DO_CANNY_PRUNING,那么函式將會使用Canny邊緣檢測來排除邊緣過多或過少的區域,因此這些區域通常不會是人臉所在區域;
引數6、7:minSize和maxSize用來限制得到的目標區域的范圍,
回傳值
具體函式細節暫時沒看到,但根據下面的代碼可以分析來,會回傳每一張臉的矩形識別角坐標x,y(左下角)w,h即寬高,加上對應x,y就是右上角
框圖反饋
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
rectangle用來繪制矩形框 通常用在圖片的標記上 引數:1.被處理圖片 2.3矩形左上右下角坐標 4.顏色 5.線型
此時,你可以在電腦螢屏面前獲得實時反饋,
frame是當前幀
0x04.存盤邏輯
在整個程式開始前,我們需要給定一個路徑作為引數,如果這個路徑不是目錄,我們就根據這個路徑生成一個目錄
給定引數是否為目錄
if (not os.path.isdir(dirname)):#判斷是否為目錄
os.makedirs(dirname)#如果不是目錄則創建目錄
圖片“格式化”
我們希望存盤的照片格式一致
然后我們在這里要截取指定位置并縮放
文接3-識別函式,我們用gray存盤了灰度圖
f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))
引數1:圖片[位置],引數2:縮放為多大
寫入
cv2.imwrite(dirname + '/%s.pgm' % str(count), f)#寫入檔案zhen
根據迭代器count命名
存照片
代碼
import camera as camera
import cv2
import os
def generate(dirname):
#1.加載人臉分類器
face_cascade = cv2.CascadeClassifier('C:/Users/13956/Desktop/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('C:/Users/13956/Desktop/opencv/sources/data/haarcascades/haarcascade_eye.xml')
# 帶眼鏡的時候可以用下面這個
# eye_cascade = cv2.CascadeClassifier('C:/Users/13956/Desktop/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')
# 創建目錄
if (not os.path.isdir(dirname)):#判斷是否為目錄
os.makedirs(dirname)#如果不是目錄則創建目錄
# 打開攝像頭進行人臉影像采集
camera = cv2.VideoCapture(0)#表示打開筆記本的內置攝像頭
count = 0
while (True):
ret, frame = camera.read()#讀取一幀的圖片,ret獲取回傳值,frame是圖片
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#將BGR格式轉換成灰度圖片
faces = face_cascade.detectMultiScale(gray, 1.4, 5)
#利用訓練好的資料識別,引數:輸入影像 人臉目標序列 每次影像減小的比例 存盤最小真識別認可 最小尺寸 最大尺寸
#最后三個引數都可以降低誤差
for (x, y, w, h) in faces:#x,y是識別到的坐標,w,h是識別到的范圍寬度,高度
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
#rectang用來繪制矩形框 通常用在圖片的標記上 引數:1.被處理圖片 2.3矩形左上右下角坐標 4.顏色 5.線型
# 重設定影像尺寸
#200 * 200
f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))
cv2.imwrite(dirname + '/%s.pgm' % str(count), f)#寫入檔案zhen
print(count)
count += 1#迭代器++
cv2.imshow("camera", frame)
if cv2.waitKey(100) & 0xff == ord("q"):
#為何做掩碼運算是因為已經發現在Linux中的某些情況下(when OpenCV uses GTK as its backend GUI),waitKey()可能回傳超過ASCII的keycode,所以這是為了防止在某些情況下產生bug,
break
# 下面是你想要多少張圖片就停止
elif count > 20:
break
camera.release()#釋放相機
cv2.destroyAllWindows()#釋放視窗
if __name__ == "__main__":
#__name__是python的一個內置類屬性,是標識模塊的名字的一個系統變數,
#如果當前模塊被直接執行(主模塊),__name__存盤的是__main__
#如果當前模塊是被呼叫的模塊(被匯入),則__name__存盤的是py檔案名(模塊名稱)
#在所有代碼執行之前,__name__ 變數值被設定為 '__main__'
generate("C:/Users/13956/Desktop/666") # 你生成的圖片放在的電腦中的地方,呼叫函式
F&A
1.深度學習中為什么普遍使用BGR而不用RGB?
“因為caffe,作為最早最流行的一批庫的代表,用了opencv,而opencv默認通道是bgr的,這是opencv的入門大坑之一,bgr是個歷史遺留問題,為了兼容早年的某些硬體,
其實你自己訓練完全可以用rgb,新庫也基本沒了bgr還是rgb這個問題,就是切換下順序,但如果你要用一些老的訓練好的模型,就得兼容老模型的bgr,
作者:HexUp
鏈接:https://www.zhihu.com/question/264044792/answer/277369496
2.分類器
Haar特征分類器就是一個XML檔案,該檔案中會描述人體各個部位的Haar特征值,包括人臉、眼睛、嘴唇等等,
Haar特征分類器存放目錄:OpenCV安裝目錄中的\data\ haarcascades目錄下,opencv2.4.9版本下的Haar特征分類器如下:
haarcascade_eye.xml haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt_tree.xml haarcascade_frontalface_alt2.xml haarcascade_frontalface_default.xml haarcascade_fullbody.xml haarcascade_lefteye_2splits.xml haarcascade_lowerbody.xml haarcascade_mcs_eyepair_big.xml haarcascade_mcs_eyepair_small.xml haarcascade_mcs_leftear.xml haarcascade_mcs_lefteye.xml haarcascade_mcs_mouth.xml haarcascade_mcs_nose.xml haarcascade_mcs_rightear.xml haarcascade_mcs_righteye.xml haarcascade_mcs_upperbody.xml haarcascade_profileface.xml haarcascade_righteye_2splits.xml haarcascade_smile.xml haarcascade_upperbody.xml
這里我們用的是
haarcascade_frontalface_default.xml特征值檔案
xml里面的資料都是深度學習訓練好的資料,具體需要去看深度學習相關的內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402576.html
標籤:其他
上一篇:#imglab使用指南 imglab.exe資源+讀取.xml檔案
下一篇:【深度學習】目標檢測之評價指標
