python手势检测 cascade_opencv_traincascade训练分类器,手势识别。

本文介绍了如何使用OpenCV的CascadeClassifier进行手势检测。通过加载训练好的hand.xml分类器文件,实现在视频中实时检测并识别手势。代码中包含了从视频帧中检测、裁剪和显示检测到的手势区域。
摘要由CSDN通过智能技术生成

xml和video下载地址:Here。

测试代码:

#include

#include

#include

#include

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 faces;

public:

faceDetection();

~faceDetection();

void detectAndDisplay(Mat frame);

};

faceDetection::faceDetection()

{

}

faceDetection::~faceDetection()

{

}

// Function detectAndDisplay

void faceDetection::detectAndDisplay(Mat frame)

{

// 报错问题所在,。

// std::vector 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值