基于c++的OpenCV目标检测

声明:本文的源码全部来OpenCV的官方文档,笔者只是做一个学习笔记

文档传送门:https://docs.opencv.org/master/d2/d64/tutorial_table_of_content_objdetect.html

以下代码主要实现通过摄像头完成人脸、眼睛、身体检测

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

#include <iostream>

using namespace std;
using namespace cv;

void detectAndDisplay(Mat frame);

CascadeClassifier face_cascade;				//使用级联分类器类加载视频中对象		//face
CascadeClassifier eyes_cascade;												//eyes
CascadeClassifier upperbody_cascade;										//body

int main(int argc, const char** argv)
{
	CommandLineParser parser(argc, argv,
		"{help h||}"
		"{face_cascade|D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml|Path to face cascade.}"
		"{eyes_cascade|D:/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml|Path to eyes cascade.}"
		"{upperbody_cascade|D:/opencv/sources/data/haarcascades/haarcascade_upperbody.xml|Path to upperbody cascade.}"
		"{camera|0|Camera device number.}");
		//路径自己改,在你安装OpenCV目录寻找

	parser.about("\nThis program demonstrates using the cv::CascadeClassifier class to detect objects (Face + eyes) in a video stream.\n"
		"You can use Haar or LBP features.\n\n");
	parser.printMessage();

	String face_cascade_name = parser.get<String>("face_cascade");
	String eyes_cascade_name = parser.get<String>("eyes_cascade");
	String upperbody_cascade_name = parser.get<String>("upperbody_cascade");

	//-- 1. Load the cascades
	if (!face_cascade.load(face_cascade_name))
	{
		cout << "--(!)Error loading face cascade\n";
		return -1;
	};
	if (!eyes_cascade.load(eyes_cascade_name))
	{
		cout << "--(!)Error loading eyes cascade\n";
		return -1;
	};
	if (!upperbody_cascade.load(upperbody_cascade_name))
	{
		cout << "--(!)Error loading upperbody cascade\n";
		return -1;
	};

	int camera_device = parser.get<int>("camera");
	VideoCapture capture;
	//-- 2. Read the video stream
	capture.open(camera_device);
	if (!capture.isOpened())
	{
		cout << "--(!)Error opening video capture\n";
		return -1;
	}

	Mat frame;
	while (capture.read(frame))
	{
		if (frame.empty())
		{
			cout << "--(!) No captured frame -- Break!\n";
			break;
		}

		//-- 3. Apply the classifier to the frame
		detectAndDisplay(frame);

		if (waitKey(10) == 27)
		{
			break; // escape
		}
	}
	return 0;
}

void detectAndDisplay(Mat frame)
{
	Mat frame_gray;
	cvtColor(frame, frame_gray, COLOR_BGR2GRAY);					//转灰度图	
	equalizeHist(frame_gray, frame_gray);							//直方图等化:增强图像的对比度

	//-- Detect faces
	std::vector<Rect> faces;
	face_cascade.detectMultiScale(frame_gray, faces);				//在图像中检测不同大小的对象,并将检测到的对象以矩形列表返回,这里检测的是人脸
																	//这个返回值是放在faces里面的,detectMultiScale这个函数是void

	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 = frame_gray(faces[i]);										//先确定脸,再去找眼睛

		//-- In each face, detect eyes
		std::vector<Rect> eyes;
		eyes_cascade.detectMultiScale(faceROI, eyes);

		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);
		}
	}

	std::vector<Rect> upperbody;
	upperbody_cascade.detectMultiScale(frame_gray, upperbody);
	for (size_t i = 0; i < upperbody.size(); i++)
	{
		Point top_left(upperbody[i].x, upperbody[i].y);
		Point low_right(upperbody[i].x + upperbody[i].width, \
			upperbody[i].y + upperbody[i].height);
		rectangle(frame, top_left, low_right, Scalar(0, 255, 0), 4);
	}

	//-- Show what you got
	imshow("Capture - Face detection", frame);
}

 

  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt是一个跨平台的C++应用开发框架,可以用于开发各种类型的应用程序,包括目标检测应用。 目标检测是计算机视觉领域的一个重要任务,旨在识别图像或视频中的特定对象并将其标记出来。Qt提供了丰富的功能和工具,可以帮助开发人员实现目标检测算法。 在Qt中实现目标检测可以按照以下步骤进行: 1.导入图像或视频数据:通过Qt的图像处理模块,可以将图像或视频数据导入到应用程序中,这是目标检测的基础。 2.图像预处理:在进行目标检测之前,通常需要对输入数据进行预处理,如图像增强、尺度调整等。Qt提供了丰富的图像处理功能,可以方便地实现这些操作。 3.选择目标检测算法:根据具体需求,选择合适的目标检测算法。常用的目标检测算法包括基于特征的方法(如Haar特征和HOG特征)和基于深度学习的方法(如卷积神经网络)等。 4.实现目标检测算法:利用C++编写目标检测算法的代码。Qt提供了一套易于使用的工具和库,可以快速实现和调试算法。 5.标记目标并显示结果:在检测到目标后,通过Qt的图形界面模块,可以将目标在图像或视频中标记出来,并将结果显示在应用程序的界面上。 6.性能优化:根据实际需求,对目标检测算法进行性能优化,如加速算法、减少误检率等。Qt提供了多线程、并行计算等功能,可以提高目标检测的速度和效率。 总之,Qt是一个强大的开发框架,在目标检测应用中可以发挥重要作用。通过利用Qt的功能和工具,开发人员可以更加便捷地实现目标检测算法,并开发出高效、稳定的目标检测应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值