将自己生成的cascade.xml模型,导入工程中


#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

char* cascade_name = "E:/data/training/data/cascade.xml";
CascadeClassifier cascade;
String window_name = "Capture";

void detectFace(Mat frame);

int main(int argc, char *argv[])
{
	int currentFrame = 1;
	VideoCapture cap("5.avi");
	if (!cap.isOpened())
	{
		return -1;
	}
	if (!cascade.load(cascade_name))
	{
		cout << "Error: cannot load face casade!!!" << endl;
		return -2;
	}
	Mat frame;
	
	while (1)
	{
		cap>>frame;
		if (frame.empty())
		{
			break;
		}
		resize(frame,frame,Size(336,256));
		imshow("原图像", frame);
		
		cvtColor(frame, gray, CV_BGR2GRAY);
		
		namedWindow(window_name);//创建窗口

		detectFace(gray);//对帧图像进行处理,识别

		waitKey(125);
	}

	return 0;
}


void detectFace(Mat frame)
{
	Mat frame_gray;
	vector<Rect> face;

	//cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转成灰度图像
	frame_gray = frame.clone();
	equalizeHist(frame_gray, frame_gray);//直方图均衡化

	//按照文档说明调用函数即可
	cascade.detectMultiScale(frame_gray, face, 1.1, 2, CASCADE_SCALE_IMAGE, Size(30, 30));

	//遍历所有目标
	for (size_t i = 0; i < face.size(); i++)
	{
		//根据返回的Rect的x坐标、y坐标、宽width和高height算出中心位置
		Point center(face[i].x + face[i].width/2, face[i].y + face[i].height/2);
		//调用ellipse画出椭圆型边框,指示人脸
		ellipse(frame, center, Size(face[i].width/2, face[i].height/2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);

	}

	//最后刷新窗口,显示图像
	imshow(window_name, frame);
}

猜你喜欢

转载自blog.csdn.net/red_ear/article/details/83856551