


// 包含OpenCV库中的对象检测、图形用户界面、图像处理、视频捕获等相关的头文件
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <iostream> // 包含输入输出流的头文件
// 使用标准名字空间std和OpenCV名字空间cv
using namespace std;
using namespace cv;
// 函数声明:帮助信息函数,打印程序如何使用的说明
static void help(const char** argv);
// 函数声明:检测和绘制函数,用于检测图像中的对象(比如脸部和眼睛)并绘制检测结果
void detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip );
// 全局变量声明:主级联分类器和次级联分类器的名字,用于对象检测
string cascadeName;
string nestedCascadeName;
// 主函数入口
int main( int argc, const char** argv )
{
VideoCapture capture; // 定义一个VideoCapture对象用于视频捕获
Mat frame, image; // 定义Mat对象用于存放视频帧和图片
string inputName; // 定义一个输入名字的字符串
bool tryflip; // 定义一个bool变量表示是否尝试翻转检测
CascadeClassifier cascade, nestedCascade; // 定义两个级联分类器对象
double scale; // 定义一个缩放比例
// 定义一个命令行解析器,用于处理命令行输入参数
cv::CommandLineParser parser(argc, argv,
"{help h||}" // 帮助信息
"{cascade|data/haarcascades/haarcascade_frontalface_alt.xml|}" // 主分类器xml文件路径
"{nested-cascade|data/haarcascades/haarcascade_eye_tree_eyeglasses.xml|}" // 嵌套分类器xml文件路径
"{scale|1|}{try-flip||}{@filename||}" // 缩放比例,是否翻转,文件名参数
);
// 如果有帮助标识,则打印帮助信息并退出
if (parser.has("help"))
{
help(argv);
return 0;
}
// 获取主分类器文件路径
cascadeName = parser.get<string>("cascade");
// 获取嵌套分类器文件路径
nestedCascadeName = parser.get<string>("nested-cascade");
// 获取缩放比例
scale = parser.get<double>("scale");
if (scale < 1) // 如果缩放比例小于1,则强制设为1
scale = 1;
// 获取是否翻转标识
tryflip = parser.has("try-flip");
// 获取文件名参数
inputName = parser.get<string>("@filename