opencv 讀取本機攝像頭畫面並實現人臉框的檢測
阿新 • • 發佈:2018-11-01
先放程式碼,在一一解釋
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
VideoCapture capture(0); //呼叫本地攝像頭
String cascadeFilePath = "E:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml"; //opencv訓練好的分類模型
CascadeClassifier face_cascade; //例項化分類器
if (!face_cascade.load(cascadeFilePath)) // 用load函式載入XML分類器檔案
{
printf("could not load the haar data...\n");
return -1;
}
Mat src_img, gray_img;
while (true)
{
//src_img = imread("E:/123.jpg"); //圖片測試
//imshow("原圖", src_img);
capture >> src_img;
cvtColor(src_img, gray_img, COLOR_BGR2GRAY); //將原圖轉化為灰度圖
equalizeHist(gray_img, gray_img); //直方圖均衡化
vector<Rect> faces; // faces是一個容器,用來接收檢測到的人臉
face_cascade.detectMultiScale(gray_img, faces, 1.1, 3, 0); //用分類器尋找人臉
for (auto t = 0; t < faces.size(); ++t)
{
rectangle(src_img, faces[t], Scalar(0 , 0, 255), 2, 8, 0); // 用紅色矩形框出人臉
}
imshow("results", src_img);
waitKey(10); //延時10
}
return 0;
}
一、 VideoCapture 類讀取視訊或呼叫本地攝像頭
- 讀取視屏
VideoCapture capture(“1.avi”);
- 呼叫攝像頭
VideoCapture capture(0);
顯示視訊或攝像頭:
視訊或攝像頭內容讀取到VideoCapture類物件之後,用一個迴圈將每一幀顯示出來
while(1)
{
Mat frame;
capture>>frame;
imshow("results",frame);
waitkey(10);
}
二、分類模型
opencv 已經內建了訓練好的模型,放置在 etc 資料夾下。分別是用haar特徵和lbp特徵訓練的分類模型,兩種特徵具體資訊可以百度。
三、detectMultiScale(InputArray image, CV_OUT std::vector& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() )
其引數解釋如下:
- image:待檢測圖片,一般為灰度影象以加快檢測速度;
- objects:vector型別,為輸出量,表示被檢測物體的矩形框向量組;
- scaleFactor:表示在前後兩次相繼的掃描中,搜尋視窗的比例係數。預設為1.1即每次搜尋視窗依次擴大10%;一般設定為1.1
- minNeighbor:表示構成檢測目標的相鄰矩形的最小個數( 預設值為3)。如果組成檢測目標的小矩形的個數和小於 min_neighbors - 1 都會被排除。
- flags:要麼使用預設值,要麼使用CV_HAAR_DO_CANNY_PRUNING,如果設定為CV_HAAR_DO_CANNY_PRUNING,那麼函式將會使用Canny邊緣檢測來排除邊緣過多或過少的區域,因此這些區域通常不會是人臉所在區域;
- minSize和maxSize:用來限制得到的目標區域的範圍。
detectMultiscale函式為多尺度多目標檢測,多尺度:通常搜尋目標的模板尺寸大小是固定的,但是不同圖片大小不同,所以目標物件的大小也是不定的,所以多尺度即不斷縮放圖片大小(縮放到與模板匹配),通過模板滑動窗函式搜尋匹配;同一副圖片可能在不同尺度下都得到匹配值,所以多尺度檢測函式detectMultiscale是多尺度合併的結果。 多目標:通過檢測符合模板匹配物件,可得到多個目標,均輸出到objects向量裡面。