我的名字叫布迪。 我是图像处理的新手,最近我一直在尝试学习有关opencv和visual studio的知识。 由于一些DIY网站中的示例,我已经成功检测到面部,然后在检测到的面部周围绘制圆圈。 我的问题是,如何检测到围绕面部的圆? 因此我可以将其用于“如果”条件,例如

如果(条件)//框架中至少有一个圆圈{bla bla bla}

这是我使用的代码:

#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ocl/ocl.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/opencv_modules.hpp>
#include <opencv2/videostab/deblurring.hpp>

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <sstream>
#include <string>

using namespace std;
using namespace cv;


const static Scalar colors[] =  { CV_RGB(0,0,255),
                              CV_RGB(0,128,255),
                              CV_RGB(0,255,255),
                              CV_RGB(0,255,0),
                              CV_RGB(255,128,0),
                              CV_RGB(255,255,0),
                              CV_RGB(255,0,0),
                              CV_RGB(255,0,255)
                            } ;



void Draw(Mat& img, vector<Rect>& faces, double scale);


int main(int argc, const char** argv)
{
    // Setup serial port connection and needed variables.
    HANDLE hSerial = CreateFile(L"COM8", GENERIC_READ | GENERIC_WRITE, 0, 0,     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    if (hSerial !=INVALID_HANDLE_VALUE)
    {
        printf("Port opened! \n");

        DCB dcbSerialParams;
        GetCommState(hSerial,&dcbSerialParams);

        dcbSerialParams.BaudRate = CBR_9600;
        dcbSerialParams.ByteSize = 8;
        dcbSerialParams.Parity = NOPARITY;
        dcbSerialParams.StopBits = ONESTOPBIT;

        //CvMemStorage* p_strStorage;

        char incomingData[256] = "";            // don't forget to pre-allocate memory
    //printf("%s\n",incomingData);
    int dataLength = 256;
    int readResult = 0;

        SetCommState(hSerial, &dcbSerialParams);
        }
    else
    {
        if (GetLastError() == ERROR_FILE_NOT_FOUND)
        {
            printf("Serial port doesn't exist! \n");
        }

        printf("Error while setting up serial port! \n");
    }
    char outputChars[] ="c" ;
    DWORD btsIO;

//void Draw(Mat& img, vector<Rect>& faces, double scale);

Mat frame, frameCopy, image;



    //int i;                                // loop counter
    //char charCheckForEscKey;          // char for checking key press (Esc exits program)



    //create the cascade classifier object used for the face detection
    CascadeClassifier face_cascade;
    //use the haarcascade_frontalface_alt.xml library
    face_cascade.load("haarcascade_frontalface_alt.xml");

//setup video capture device and link it to the first capture device
VideoCapture captureDevice;
captureDevice.open(0);

if(captureDevice.open(0) == NULL) 
{                                       // if capture was not successful . . .
    printf("error: capture error \n");  // error message to standard out . . .
    getchar();                              // getchar() to pause for user see message . . .
    return(-1);
}


//setup image files used in the capture process
Mat captureFrame;
Mat grayscaleFrame;

//create a window to present the results
namedWindow("FaceDetection", 1);


//int servoPosition = 90;
//int servoOrientation = 0;
//int servoPosition1=90;
//int servoOrientation1=0;
//create a loop to capture and find faces
while(true)
{
    //p_imgOriginal = captureFrame;
    //capture a new image frame
    captureDevice>>captureFrame;

    //convert captured image to gray scale and equalize
    cvtColor(captureFrame, grayscaleFrame, CV_BGR2GRAY);
    imshow("Grayscale", grayscaleFrame);
    equalizeHist(grayscaleFrame, grayscaleFrame);

    //p_strStorage = cvCreateMemStorage(0);

    //create a vector array to store the face found
    std::vector<Rect> faces;

    //find faces and store them in the vector array
    face_cascade.detectMultiScale(grayscaleFrame, faces, 1.1, 3, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, Size(30,30));

    //draw a circle for all found faces in the vector array on the original image
    //for(int i = 0; i < faces.size(); i++)
    int i = 0;

     //for( int i = 0; i < faces.size(); i++ )
    for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
    {
        Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
        Scalar color = colors[i%8];
        center.x = cvRound((r->x + r->width*0.5));
        center.y = cvRound((r->y + r->height*0.5));
        Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
        Point pt2(faces[i].x, faces[i].y);
        int radius;
        int X = faces[i].x;
        int Y = faces[i].y;
        radius = cvRound((faces[i].width + faces[i].height)*0.25);
        //ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );
        //rectangle(captureFrame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);
        circle(captureFrame,center,radius,cvScalar(0, 255, 0, 0), 1, 8, 0);
        cout << "X:" << faces[i].x  <<  "  Y:" << faces[i].y  << endl;



        if (radius >= 85)
        {
        outputChars[0] = 'a';
            WriteFile(hSerial, outputChars, strlen(outputChars), &btsIO, NULL);

            cout <<  "radius >= 85, advertising begin" << endl;

            //FlushFileBuffers(hSerial);
        }

        else if (radius <= 84)
        {
        outputChars[0] = 'b';
        WriteFile(hSerial, outputChars, strlen(outputChars), &btsIO, NULL);

            //cout <<  "radius >= 85, advertising begin" << endl;
        }
        /*else if (radius >= 85 | X<=164 && X>=276)
        {
            outputChars[0] = 'z';
            WriteFile(hSerial, outputChars, strlen(outputChars), &btsIO, NULL);

            cout <<  "radius >= 85, advertising begin" << endl;

            //FlushFileBuffers(hSerial);
        }

        else if (radius < 85) 
        {
            outputChars[0] = 'b';
            WriteFile(hSerial, outputChars, strlen(outputChars), &btsIO, NULL);

            cout << "radius:  " << radius << "radius < 85, advertising end!" << endl;

            //FlushFileBuffers(hSerial);
        }

        /*if (X>=165 | X<=275)
        {
            outputChars[0]='u';
            WriteFile(hSerial, outputChars, strlen(outputChars), &btsIO, NULL);

            cout <<"Face in the middle of the frame" << endl;

            FlushFileBuffers(hSerial);
        }

        /*if (X<=164 | X>=276)
        {
            outputChars[0]='y';
            WriteFile(hSerial, outputChars, strlen(outputChars), &btsIO, NULL);

            cout <<"no face in the middle of the frame" << endl;

            //FlushFileBuffers(hSerial);

        }*/

    }

    //print the output
    imshow("FaceDetection", captureFrame);

    //pause for 200ms
    waitKey(60);
}

cvDestroyWindow("FaceDetection");
cvDestroyWindow("Grayscale");

FlushFileBuffers(hSerial);

// This closes the Serial Port
CloseHandle(hSerial);


return 0;

}

请帮助我,谢谢大家的关注。

  ask by budi permana translate from so

本文未有回复,本站智能推荐:

1回复

C ++ OpenCV人脸检测

我正在编写一个小脚本,该脚本应该使用C ++来检测人脸,我是在Visual Studio 2010上开发的。 附带了相关的方法,并且出现了以下我不理解的异常: 任何帮助将非常感激。
3回复

使用 opencv dnn 人脸检测器检测检测到的人脸图像中的人脸标志

我试图检测人脸的 68 个面部标志。 我使用 OpenCV dnn 人脸检测器检测到人脸,如https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/ 人脸检测过程成功完成,这是我的代码
1回复

OpenCV-人脸检测:人脸周围的矩形

我从OpenCV开始,想测试一些样本。 我使用的示例在屏幕上的面孔周围放置了一个矩形。 但是最终的检测结果比较杂乱,如何改善代码以使检测更平滑? 我使用haarcascade_frontalface_alt.xml。
1回复

姿势独立的人脸检测

我正在一个项目中,我需要检测非常凌乱的视频中的人脸(从自我中心的角度记录下来,因此可以想象..)。 脸部的偏航角可以在-90到+90之间变化,俯仰角几乎具有相同的变化(很好,由于人体的限制而略微偏低。),也可能有些侧倾变化。 我花了很多时间寻找一些独立于姿势的面部检测器。 在我的项目中
1回复

实际检测到的人脸宽度

我一直都在进行研究,但是找不到答案。 我正在使用OpenCV来检测人脸,现在我想计算到人脸的距离。 当我检测到一张脸时,我会得到一个matofrect(可以用矩形可视化)。 到目前为止很清楚。 但是现在:如何获得现实世界中矩形的宽度? 必须有一些代表人脸宽度的平均值。 如果我具有该值
2回复

如何找出检测到的人脸是真的还是假的

我正在开发一个与安全相关的项目,需要检查是否检测到任何人脸,如果检测到人脸,则执行一些操作,如果未检测到人脸,则关闭应用程序。 一切都很完美,我正在使用SurfaceView ,它实现了SurfaceHolder.Callback并且在那个打开的相机和相机中有一个方法名称是startFaceDet
1回复

从数据库OpenCV中搜索检测到的人脸

我正在使用此代码: 程序样本 上面的链接已经在此页面上进行了编程: 伺服杂志 该代码可以提取面部,学习面部并将学习的面部保存在带有标签的数据库中(例如:chris_laughing.bmp或chris_sad.bmp)。 可以识别出用户保存在数据库中的面部。 如果“个人
1回复

opencv 代码不会检测人脸的数量,也不会在人脸周围放一个圆圈

我的代码: 首先打开笔记本电脑的摄像头。 然后拍摄视频。 然后分配垫帧。然后转换为灰度图像,调整其大小。 分配一个人脸向量,与 xml 文件匹配。 使用 face.size() 查找面数。 使用 cout.Draw 在 face 周围绘制圆圈在命令行上打印面数(faces.size())。 但是
1回复

通过摄像头进行人脸检测[重复]

这个问题已经在这里有了答案: 什么是未定义的引用/未解决的外部符号错误,如何解决? 32个答案 我想从相机输入中检测到脸部。 我首先尝试使用图像检测面部。 我尝试了文档中的代码和博客中提供的面部识别代码,但是它们都不适合我。 我正在使用OpenCV 2.4.
1回复

人脸检测,未检测到人脸

我正在尝试进行人脸检测,但是它无法检测到任何人脸。 这是我为人脸检测创建的​​功能 这用于 但是当我运行此脚本时,它不会显示任何检测到的面孔,只需给出输出即可 faces_detected:() 而且图像周围没有盒子