C++ 如何在检测到面opencv后展开矩形

C++ 如何在检测到面opencv后展开矩形,c++,opencv,C++,Opencv,我写代码,我想知道如何在检测到人脸后将矩形扩展到人类的头部和颈部 #include <opencv2/imgproc/imgproc.hpp> //this code detetced faces /// #include <opencv2/objdetect/objdetect.hpp>/////////// #include <opencv2/highgui/highgui.hpp> //////////////////

我写代码,我想知道如何在检测到人脸后将矩形扩展到人类的头部和颈部

    #include <opencv2/imgproc/imgproc.hpp>  //this code detetced faces ///
    #include <opencv2/objdetect/objdetect.hpp>///////////
    #include <opencv2/highgui/highgui.hpp>
     ////////////////////
    using namespace cv;
    using namespace std;

    int main()
    {

        CascadeClassifier cascade;

        if (!cascade.load("haarcascade_frontalface_alt2.xml"))  //load harcascade xml
            return -1;

         Mat src = imread("11.jpg");  //read image 

        if (src.empty())
            return -1;
    cv::resize(src,src,cv::Size(600,600));  resize image 
        Mat gray;
        cvtColor(src, gray, CV_BGR2GRAY);
        equalizeHist(gray, gray);

        vector<Rect> faces;
        cascade.detectMultiScale(gray, faces, 1.2, 3,0,Size(30,30));

        for (size_t i = 0; i < faces.size(); i++)
        {
     /////////////////////////////
            Rect r = faces[i];
    //////////////////////////////       

              Mat faceROI = gray( faces[i] );
          int x = faces[i].x;
          int y = faces[i].y;
          int h =0.3*y+faces[i].height;
          int w = faces[i].width;
          printf("Orig dimensions after h * w crop 1: %dx%d\n",h,w);
            printf("Orig dimensions after  x* y crop 2: %dx%d\n",x,y);

           rectangle(src,Point (x,y),Point(x + w,y +h),Scalar(255,0,255),1,4,0);
             imshow("mmmmmmmmmmm.jpg",src );  //show image in windows 
        }
    ///////////////////////////////

        waitKey(0);

        return 0;
    }

您需要适当调整高度和起始y坐标

简单看一下,我觉得盒子的顶部和底部两侧的高度都应该增加0.3倍。所以我从y中减去0.3*h,再加上0.3*2*h,即0.6*h

这只是我的粗略计算。对于精细调整,您可以针对不同的面进行分析,并得出最适合您的目的的测量值

以下是更改后的代码:

int x = faces[i].x;
int h_temp = faces[i].height;    // storing original height
int y = faces[i].y - h_temp*0.3; // y is reduced by 0.3*h
int w = faces[i].width;
int h = h_temp*1.6;              // height is increases by 60%
下面是我得到的结果,例如。绿色显示了我得到的原版。蓝色是修改后的:


记住,你想选择多少取决于你自己。对上述值进行调整以获得所需的结果。

若要展开OpenCV faces矩形,还可以使用以下运算符对cv::Rect类执行操作

将面矩形扩展10%的示例如下

cv::Size deltaSize( faces[i].width * 0.1f, faces[i].height * 0.1f ); // 0.1f = 10/100
cv::Point offset( deltaSize.width/2, deltaSize.height/2);
faces[i] += deltaSize;
faces[i] -= offset;

非常欢迎。对你有用吗?如果是,您可以通过单击“我的答案”附近的勾号接受此答案并关闭此会话。如果没有解决,你可以在这里评论你的问题。我从你的个人资料中看到,你是SOF的新手。这就是我提醒你的原因。
cv::Size deltaSize( faces[i].width * 0.1f, faces[i].height * 0.1f ); // 0.1f = 10/100
cv::Point offset( deltaSize.width/2, deltaSize.height/2);
faces[i] += deltaSize;
faces[i] -= offset;