前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv_traincascade训练分类器,手势识别。

opencv_traincascade训练分类器,手势识别。

作者头像
MachineLP
发布2022-05-09 14:23:39
1.1K0
发布2022-05-09 14:23:39
举报
文章被收录于专栏:小鹏的专栏小鹏的专栏

opencv_traincascade 训练方法,参考本人的博客:Here

xml和video下载地址:Here

测试代码:

代码语言:javascript
复制
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>


using namespace std;
using namespace cv;

// Global variables
// Copy this file from opencv/data/haarscascades to target folder
string face_cascade_name = "/Users/liupeng/Desktop/my/handDetection/handDetection/hand.xml";
CascadeClassifier *face_cascade;
string window_name = "Capture - Face detection";
int filenumber; // Number of file to be saved
string filename;

// Function Headers
class faceDetection
{
private:
    std::vector<Rect> faces;
public:
    faceDetection();
    ~faceDetection();
    void detectAndDisplay(Mat frame);
};
faceDetection::faceDetection()
{
}
faceDetection::~faceDetection()
{
}

// Function detectAndDisplay
void faceDetection::detectAndDisplay(Mat frame)
{
    // 报错问题所在,。
    // std::vector<Rect> faces;
    
    Mat frame_gray;
    Mat crop;
    Mat res;
    Mat gray;
    string text;
    stringstream sstm;
    
    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
    equalizeHist(frame_gray, frame_gray);
    
    // Detect faces
    face_cascade->detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    
    // Set Region of Interest
    cv::Rect roi_b;
    cv::Rect roi_c;
    
    size_t ic = 0; // ic is index of current element
    int ac = 0; // ac is area of current element
    
    size_t ib = 0; // ib is index of biggest element
    int ab = 0; // ab is area of biggest element
    
    for (ic = 0; ic < faces.size(); ic++) // Iterate through all current elements (detected faces)
        
    {
        roi_c.x = faces[ic].x;
        roi_c.y = faces[ic].y;
        roi_c.width = (faces[ic].width);
        roi_c.height = (faces[ic].height);
        
        ac = roi_c.width * roi_c.height; // Get the area of current element (detected face)
        
        roi_b.x = faces[ib].x;
        roi_b.y = faces[ib].y;
        roi_b.width = (faces[ib].width);
        roi_b.height = (faces[ib].height);
        
        ab = roi_b.width * roi_b.height; // Get the area of biggest element, at beginning it is same as "current" element
        
        if (ac > ab)
        {
            ib = ic;
            roi_b.x = faces[ib].x;
            roi_b.y = faces[ib].y;
            roi_b.width = (faces[ib].width);
            roi_b.height = (faces[ib].height);
        }
        
        crop = frame(roi_b);
        resize(crop, res, Size(128, 128), 0, 0, INTER_LINEAR); // This will be needed later while saving images
        cvtColor(crop, gray, CV_BGR2GRAY); // Convert cropped image to Grayscale
        
        // Form a filename
        filename = "";
        stringstream ssfn;
        ssfn << filenumber << ".png";
        filename = ssfn.str();
        filenumber++;
        
        // imwrite(filename, gray);
        
        Point pt1(faces[ic].x, faces[ic].y); // Display detected faces on main window - live stream from camera
        Point pt2((faces[ic].x + faces[ic].height), (faces[ic].y + faces[ic].width));
        rectangle(frame, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0);
    }
    
    // Show image
    sstm << "Crop area size: " << roi_b.width << "x" << roi_b.height << " Filename: " << filename;
    text = sstm.str();
    
    putText(frame, text, cvPoint(30, 30), FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(0, 0, 255), 1, CV_AA);
    imshow("original", frame);
    // waitKey();
    
    if (!crop.empty())
    {
        imshow("detected", crop);
        // waitKey();
    }
    else
        destroyWindow("detected");
    
}



int main(int argc, char* argv[])
{
    faceDetection *face;
    face = new faceDetection;
    // Load the cascade
    face_cascade = new CascadeClassifier;
    if (!face_cascade->load(face_cascade_name)){
        printf("--(!)Error loading\n");
        return (-1);
    }
    
    cvNamedWindow("Camera" , CV_WINDOW_AUTOSIZE );
    
    // 开启摄像头。
    // CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY);
    // 读取视频文件夹。
    CvCapture* capture = cvCreateFileCapture("/Users/liupeng/Desktop/my/handDetection/handDetection/hand.mp4");
    
    assert(capture != NULL);
    
    IplImage *frame = 0;
    
    while(1)
    {
        frame = cvQueryFrame(capture);
        if(!frame) break;
        
        face->detectAndDisplay((Mat)frame);
        
        char c = cvWaitKey(15);
        if(c == 27)  break;
    }
    
    cvReleaseCapture(&capture);
    cvReleaseImage( &frame);
    
    
    return (int)0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档