1. 程式人生 > >opencv 讀取本機攝像頭畫面並實現人臉框的檢測

opencv 讀取本機攝像頭畫面並實現人臉框的檢測

先放程式碼,在一一解釋

#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 類讀取視訊或呼叫本地攝像頭

  1. 讀取視屏

VideoCapture capture(“1.avi”);

  1. 呼叫攝像頭
    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向量裡面。