人眼目标检测初始化

 // 初始化摄像头读取视频流
	cv::VideoCapture cap(0);
	// 宽高设置为320*256
	cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
	cap.set(CV_CAP_PROP_FRAME_HEIGHT, 256);
	// 读取级联分类器
	// 文件存放在opencv\sources\data\haarcascades	
	bool flagGlasses = false;
	if(flagGlasses)
	{
		face_cascade.load("haarcascade_frontalface_alt2.xml");
		eye_cascade.load("haarcascade_eye.xml");
	}else
	{
		face_cascade.load("haarcascade_frontalface_alt2.xml");
 	eye_cascade.load("haarcascade_eye_tree_eyeglasses.xml");
	}
	// 判断初始化设置是否正常
	if (face_cascade.empty() || eye_cascade.empty() 
     || !cap.isOpened())
		return 1;
	// 视频流操作
	cv::Mat frame, eyeMat;
	cv::Rect eyeRect;
	while (cv::waitKey(10) != 'q')
	{
		cap >> frame;
		if (frame.empty())
			break;
		// 水平翻转
		cv::flip(frame, frame, 1);
		// 灰度转换
		cv::Mat gray;
		cv::cvtColor(frame, gray, CV_BGR2GRAY);
		// 人眼检测尺寸判断 若不符合则需要重新检测
		if (eyeRect.width <= 2 || eyeRect.height <= 2)
		{
			// 人眼检测
			detectEye(gray, eyeMat, eyeRect);
		}
		else // 符合则进行人眼跟踪
		{
			// 人眼跟踪
			trackEye(gray, eyeMat, eyeRect);
			// 人眼结果绘制
			cv::rectangle(frame, eyeRect, CV_RGB(0,255,0));
		}
		cv::imshow("video", frame);
	}




转载:http://blog.youkuaiyun.com/zhuwei1988

### 使用 OpenCV 级联分类器进行人眼检测 为了使用 OpenCV 实现人眼检测,可以采用 Haar 特征级联分类器。Haar 特征是一种机器学习方法,通过大量正负样本训练得到能够区分目标对象(如眼睛)和其他背景区域的特征模式。 #### 加载必要的库和初始化资源 首先需要加载所需的头文件以及配置好开发环境: ```cpp #include "stdafx.h" #include <opencv2/objdetect.hpp> #include <opencv2/videoio.hpp> // Video capture support #include <opencv2/highgui.hpp> using namespace cv; ``` 接着定义两个 `CascadeClassifier` 对象分别用来存储人脸和人眼识别模型数据结构: ```cpp CascadeClassifier face_cascade; CascadeClassifier eye_cascade; if (!face_cascade.load("haarcascades/haarcascade_frontalface_alt.xml")) { printf("--(!)Error loading face cascade\n"); } if (!eye_cascade.load("haarcascades/haarcascade_eye_tree_eyeglasses.xml")) { printf("--(!)Error loading eyes cascade\n"); } ``` 这里假设已经正确设置了路径指向预训练好的 XML 文件[^2]。这些文件通常可以在安装目录下的 `data\haarcascades` 中找到,也可以从官方渠道下载最新版本。 #### 获取视频流并处理每一帧图像 创建一个循环不断读取来自摄像头的新帧,并对其进行灰度化转换以便后续计算效率更高: ```cpp VideoCapture cap(0); // 打开默认摄像设备 Mat frame, gray_frame; while (true){ cap >> frame; // 抓取下一帧图片 if(frame.empty()){ break; // 如果没有更多帧则退出循环 } cvtColor(frame, gray_frame, COLOR_BGR2GRAY); equalizeHist(gray_frame, gray_frame); std::vector<Rect> faces; face_cascade.detectMultiScale(gray_frame, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30)); for(size_t i=0;i<faces.size();i++){ Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4); Mat faceROI = gray_frame(faces[i]); std::vector<Rect> eyes; eye_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); for(size_t j=0;j<eyes.size();j++){ Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); circle(frame, eye_center, radius, Scalar(255, 0, 0 ), 4); } } imshow("Capture - Face detection", frame); char c=(char)waitKey(10); if(c==27){break;} // ESC 键终止程序执行 } cap.release(); destroyAllWindows(); ``` 上述代码片段展示了如何利用 OpenCV 提供的功能完成基本的人脸定位及其内部器官——眼睛的具体位置标记工作。其中 `detectMultiScale()` 函数负责调用预先训练过的分类器来进行多尺度的目标匹配操作;参数设置决定了搜索窗口大小变化范围、邻近条件等细节[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值