C++ 为什么detectMultiScale仅在人脸接近帧中心时检测人脸?

C++ 为什么detectMultiScale仅在人脸接近帧中心时检测人脸?,c++,opencv,face-detection,C++,Opencv,Face Detection,我正在尝试一个非常简单的程序来检测网络摄像头中的人脸。我注意到,当我的脸位于帧的中心时,可以很好地检测到这些脸。当我向两边移动一点时,人脸检测器要么完全没有检测到我的脸,要么没有检测到。 这种偏见是因为我使用函数的方式(代码附加)还是因为HAAR分类器固有的偏见? 请注意,在任何一种情况下(我的脸在框架的近似中心或我的脸在边界附近的某个地方),我的脸都是完全可见的,即侧面轮廓/或脸的切割 //A live face detector Program. Takes feed from the ca

我正在尝试一个非常简单的程序来检测网络摄像头中的人脸。我注意到,当我的脸位于帧的中心时,可以很好地检测到这些脸。当我向两边移动一点时,人脸检测器要么完全没有检测到我的脸,要么没有检测到。 这种偏见是因为我使用函数的方式(代码附加)还是因为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;
 } 
//一个实时人脸检测程序。从摄像机获取反馈并在给定帧中检测人脸
#包括
#包括
#包括
#包括“opencv2/video/video.hpp”
使用名称空间cv;
使用名称空间std;
int main(){
cv::垫架;
cv::视频捕获上限(0);
cv::namedWindow(“框架”);
做{
cap>>框架;
Rect r1,r2;
向量面1,面2;
级联分类器级联1;
级联分类器级联2;
//cascade1.load(“C:/opencv2.4.9/sources/data/lbpcascade/lbpcascade_frontalface.xml”);
cascade1.load(“C:/opencv2.4.9/sources/data/haarcascade/haarcascade_frontalface_alt2.xml”);
cascade2.load(“C:/opencv2.4.9/sources/data/lbpcascade/lbpcascade_profileface.xml”);
级联1.检测多尺度(帧,面1,1.05,6,CV_HAAR_FIND_最大对象,大小(0,0));
级联2.检测多尺度(帧,面2,1.05,6,CV_HAAR_FIND_最大对象,大小(0,0));
如果(面1.size()!=0){

cout您的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);


它会起作用。您已经更改了x,y值。

我建议这与您的训练大小有关,始终尽可能小地训练。如果您在较大的图像上训练,您将无法检测较小(或更远)的图像faces我正在使用openCV打包的xml文件。我没有接受过任何培训。这段代码只是用来检测一张脸。没有识别。在中,他们会找到不在中心的脸。但他们使用的是“haarcascade_frontalface_alt.xml”.你的方法是只找到一张脸,还是只要它们在画面中央,它就能找到更多?@powder:我写的代码总是只提供一次检测。
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);