簡體   English   中英

為什么detectMultiScale僅在人臉靠近框架中心時才檢測人臉?

[英]Why does detectMultiScale detect faces only when they are close to the centre of the frame?

我正在嘗試一個非常簡單的程序來檢測網絡攝像頭中的人臉。 我注意到當我的臉位於畫面中央時,可以很好地檢測到這些臉。 每當我向側面移動一點時,面部檢測器要么會完全錯過我的面部,要么不會提供任何檢測。 這是我使用函數(附加代碼)的方式造成的偏見,還是HAAR分類器中的固有偏見? 請注意,在任何一種情況下(我的臉位於框架的大致中心或臉在邊界附近的某處),我的臉都是完全可見的,即側面輪廓/或臉部的切割。

//A live face detector Program. Takes feed from the camera and detects face in the given frame

#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
#include"opencv2/video/video.hpp"
using namespace cv;
using namespace std;



 int main(){
     cv::Mat frame;
     cv::VideoCapture cap(0);
     cv::namedWindow("Frame");
 do{
        cap >> frame;

        Rect r1,r2;
        vector<Rect> faces1,faces2;
        CascadeClassifier cascade1;
        CascadeClassifier cascade2;
        //cascade1.load("C:/opencv2.4.9/sources/data/lbpcascades/lbpcascade_frontalface.xml");
        cascade1.load("C:/opencv2.4.9/sources/data/haarcascades/haarcascade_frontalface_alt2.xml");
        cascade2.load("C:/opencv2.4.9/sources/data/lbpcascades/lbpcascade_profileface.xml");
        cascade1.detectMultiScale(frame, faces1,1.05, 6, CV_HAAR_FIND_BIGGEST_OBJECT, Size(0, 0));
        cascade2.detectMultiScale(frame, faces2,1.05, 6, CV_HAAR_FIND_BIGGEST_OBJECT, Size(0, 0));
        if (faces1.size()!=0){
            cout << "face1 found";
            r1 = faces1[0];
        }

        if (faces2.size()!=0){
            cout << "face2 found";
            r2 = faces2[0];
        }

            rectangle(frame, Point(r1.y,r1.x), Point(r1.y+r1.height,r1.x+r1.width), Scalar(0,255,0),2, 8);
            rectangle(frame, Point(r2.y,r2.x), Point(r2.y+r2.height,r2.x+r2.width), Scalar(255,0,0),2, 8);
            imshow("Frame",frame);
        }while(waitKey(30) < 0);

 cap.release();
 return 0;
 } 

您的haar分類器代碼運行良好。在您的代碼中更改此

 rectangle(frame, Point(r1.y,r1.x), Point(r1.y+r1.height,r1.x+r1.width), Scalar(0,255,0),2, 8);
        rectangle(frame, Point(r2.y,r2.x), Point(r2.y+r2.height,r2.x+r2.width), Scalar(255,0,0),2, 8);

rectangle(frame, Point(r1.x, r1.y), Point(r1.x + r1.width, r1.y + r1.height), Scalar(0, 255, 0), 2, 8);
    rectangle(frame, Point(r2.x, r2.y), Point(r2.x + r2.width, r2.y + r2.height), Scalar(255, 0, 0), 2, 8);

它會工作。 您已經更改了x,y值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM