一、準備作業
1、下載人臉檢測用到的庫檔案,包括Tensorflow模型以及組態檔,如圖,庫檔案可以放在任意位置

2、加入頭檔案

二、函式原型
1、readNetFromTensorflow函式
作用:讀取Tensorflow模型以及組態檔
c++原型:
引數:
- model: Tensorflow模型檔案(.pb檔案)
- config: Tensorflow組態檔(.pbtxt檔案)
回傳值:讀到的dnn::Net型別的網路檔案
2、blobFromImage函式
作用:主要是用來對圖片進行預處理
c++原型:
引數:
- image: 輸入影像
- scalefactor:當我們將圖片減去平均值之后,還可以對剩下的像素值進行一定的尺度縮放,默認值是1.0,如果希望減去平均像素之后的值,全部縮小一半,那么可以將scalefactor設為0.5,
- size:是我們神經網路在訓練的時候要求輸入的圖片尺寸
- mean:需要將圖片整體減去的平均值,如果我們需要對RGB圖片的三個通道分別減去不同的值,那么可以使用3組平均值,如果只使用一組,那么就默認對三個通道減去一樣的值,
- swapRB:是否要進行RB兩個通道的交換,默認false,OpenCV中認為我們的圖片通道順序是BGR,但是我平均值假設的順序是RGB,所以如果需要交換R和G,那么就為true
- crop:是否要進行剪切,默認false
補充引數mean:
減去平均值為了消除同一場景下不同光照的圖片,對我們最終的分類或者神經網路的影響,我們常常對圖片的R、G、B通道的像素求一個平均值,然后將每個像素值減去我們的平均值,這樣就可以得到像素之間的相對值,就可以排除光照的影響,
三、實作思路及效果
1、思路
- 讀取Tensorflow模型以及組態檔
- 加載并讀取視頻
- 對圖片進行預處理
- 把預處理完的資料(NCHW)input到Tensorflow網路模型中去推理
- 獲取推理后的資料并重新構建Mat影像
- 決議結果(繪制矩形)
- 顯示影像
2、效果
2.1讀取攝像頭:實時人臉檢測

2.2讀取視頻,打開以下視頻查看(已上傳至優酷)
四、代碼
void test1::detect_face()
{
String root_dir = "E:/qt-zqw/qt-workplace/opencvDemo1/face_detector/";
//讀取Tensorflow模型以及組態檔
dnn::Net net = dnn::readNetFromTensorflow(root_dir+"opencv_face_detector_uint8.pb",root_dir+"opencv_face_detector.pbtxt");//讀取深度學習Tensorflow模型
VideoCapture capture("E:/images/images/example_dsh.mp4");//加載視頻
Mat frame;
while (true) {
capture.read(frame);
if(frame.empty())
{
break;
}
//讀模型
Mat blob = dnn::blobFromImage(frame,1.0,Size(300,300),Scalar(104,177,123),false,false);
net.setInput(blob);//blob就是 NCHW 多少個 通道數 高度 寬度
//獲取資料
Mat probs = net.forward();//獲取推理后的資料
Mat detectionMat(probs.size[2],probs.size[3],CV_32F,probs.ptr<float>());//構建Mat影像
//決議結果
for(int i=0;i<detectionMat.rows;i++)
{
float con = detectionMat.at<float>(i,2);
if(con>0.5)//大于0.5就是人臉
{
//獲取矩形坐標(第3,4,5,6引數)
int x1 = static_cast<int>(detectionMat.at<float>(i,3)*frame.cols);
int y1 = static_cast<int>(detectionMat.at<float>(i,4)*frame.rows);
int x2 = static_cast<int>(detectionMat.at<float>(i,5)*frame.cols);
int y2 = static_cast<int>(detectionMat.at<float>(i,6)*frame.rows);
Rect box(x1,y1,x2-x1,y2-y1);
rectangle(frame,box,Scalar(0,0,255),2,8,0);
}
}
imshow("detect_face",frame);
int c = waitKey(1);
if(c ==27)
{
break;
}
}
}
VideoCapture capture("E:/images/images/example_dsh.mp4");把引數換成0即為讀取攝像頭
原創不易,轉載請注明出處:
Qt+OpenCV聯合開發(二十九)--實時人臉檢測案例
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423602.html
標籤:AI
下一篇:影像特征—FAST關鍵點


