OpenCV学习14

来源:互联网 发布:如何查找电脑的mac地址 编辑:程序博客网 时间:2024/06/10 23:02

太久没更新了,这次直接出个人脸识别好了,人脸匹配还没做出来,后续跟进

////  main.cpp//  FaceTrack////  Created by Sean on 16/3/5.//  Copyright © 2016年 Sean. All rights reserved.//#include "objdetect/objdetect.hpp"#include "highgui/highgui.hpp"#include "imgproc/imgproc.hpp"#include "core.hpp"#include "highgui.h"#include "cv.h"#include <iostream>#include <stdio.h>using namespace std;using namespace cv;string face_cascade_name = "/Users/sean/Documents/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml";CascadeClassifier face_cascade;const char name[] = "FaceTrack";typedef string elemtype;typedef struct RStruct{    elemtype sign;    CvRect rect;    RStruct* next;}RectNode;typedef struct{    IplImage* frame;    IplImage* fomer;    CvRect box;    double similar = 0;    bool draw = false;}DrawCount;typedef struct{    IplImage* img;    DrawCount Draw_info;    RectNode Rect_info;    RectNode *head;    RectNode *tail;}newdata;void initialNewdata(newdata &data){    RectNode *u = new RectNode;    u->sign = "First";    u->next = NULL;    data.head = u;    data.tail = data.head;}void reinitialNewdata(newdata &data){    data.Draw_info.frame = cvCreateImage(cvGetSize(data.img), data.img->depth, data.img->nChannels);    data.Draw_info.fomer = cvCreateImage(cvGetSize(data.img), data.img->depth, data.img->nChannels);    cvCopy(data.img, data.Draw_info.frame);}void cvReleaseData(newdata &data){    cvReleaseImage(&data.img);    cvReleaseImage(&data.Draw_info.frame);    cvReleaseImage(&data.Draw_info.fomer);    while(data.tail!=data.head)    {        RectNode*t = data.head;        while(t->next!=data.tail)            t=t->next;        t->next = data.tail->next;        delete data.tail;        data.tail = t;    }}IplImage* doPyrdown(IplImage* src,int filter = CV_GAUSSIAN_5x5){    assert(src->width%2==0 && src->height%2==0);    IplImage* dst = cvCreateImage    (     cvGetSize(src),     src->depth,     src->nChannels     );    cvCopy(src, dst);    src->width = src->width/2;    src->height = src->height/2;    cvPyrDown(dst, src);    cvReleaseImage(&dst);    return src;}int cvGetImage4(IplImage *&src, CvCapture* capture){    if(!(src = cvQueryFrame(capture)))        return -1;    src = doPyrdown(src);    cvFlip(src,src,1);    return 0;}void detectAndDisplay(newdata data){    vector<Rect> faces;    cvCopy(data.img, data.Draw_info.frame);    Mat frame_gray = cvarrToMat(data.Draw_info.frame);    cvtColor(frame_gray, frame_gray, CV_BGR2GRAY);    equalizeHist(frame_gray, frame_gray);    face_cascade.detectMultiScale    (frame_gray,faces,1.1,3,0,Size(30, 30));    for( int i = 0; i < faces.size(); i++ )    {        data.Draw_info.box = cvRect        (         faces[i].x,         faces[i].y,         faces[i].width,         faces[i].height        );        //        RectNode *pt = new RectNode;//        pt->next=NULL;//        pt->rect=data.Draw_info.box;//        data.tail->next = pt;//        data.tail = pt;                cvRectangle        (         data.Draw_info.frame,         cvPoint(data.Draw_info.box.x, data.Draw_info.box.y),         cvPoint         (          data.Draw_info.box.x+data.Draw_info.box.width,          data.Draw_info.box.y+data.Draw_info.box.height         ),         cvScalar(255,0,0),         4        );    }    cvShowImage(name, data.Draw_info.frame);}int main( int argc, char** argv ){    newdata data;    initialNewdata(data);    CvCapture *capture = cvCreateCameraCapture(0);    cvGetImage4(data.img, capture);    reinitialNewdata(data);    if(!data.img)        return -1;    if(!face_cascade.load(face_cascade_name))        return -2;    while(cvWaitKey(24)-27)    {        cvGetImage4(data.img, capture);        if(data.img)            detectAndDisplay(data);    }    cvReleaseCapture(&capture);    cvReleaseImage(&data.img);    cvReleaseImage(&data.Draw_info.frame);    cvReleaseImage(&data.Draw_info.fomer);    cvDestroyAllWindows();}


0 0
原创粉丝点击