1.opencv人脸检测

opencv使用visual Studio开发。
首先搭建工程。

1,人脸检测 (只适合静态图像的检测)

2,人脸跟踪(适合视频流检测人脸)

打开摄像头

CMakeLists.txt
# CMakeList.txt: Opencv_Face 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

include_directories("F:/opencv/opencv/build/include")
 #连接路径
link_directories("F:/opencv/opencv/build/x64/vc15/lib")

# 将源代码添加到此项目的可执行文件。
add_executable (Opencv_Face "Opencv_Face.cpp" "Opencv_Face.h")
#d是debug版本
target_link_libraries(Opencv_Face opencv_world410d) 
# TODO: 如有需要,请添加测试并安装目标。

Opencv_Face.h
// Opencv_Face.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>

// TODO: 在此处引用程序需要的其他标头。
#include <opencv2/opencv.hpp>

Opencv_Face.cpp
// Opencv_Face.cpp: 定义应用程序的入口点。
//

#include "Opencv_Face.h"

using namespace std;
using namespace cv;

int main()
{
	VideoCapture capture;
	capture.open(0);
	if (!capture.isOpened()) {
		cout << "opencv打开摄像头失败!\n" << endl;
		return -1;
	}
	Mat frame;
	while (true) 
	{
		capture >> frame;
		if (frame.empty()) {
			cout << "opencv读取摄像头图像失败!\n" << endl;
			return -1;
		}
		imshow("摄像头", frame);//显示图像
		if (waitKey(30) == 27)//Esc键退出
		{
			break;
		}
	}
	cout << "Hello CMake。" << endl;
	return 0;
}

opencv安装目录下有

opencv\build\etc

有一些训练好的模型示例。

灰度化demo

主要函数:

	cvtColor(frame, gray, COLOR_BGR2GRAY);//opencv

cmakelist不变。

// Opencv_Face.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>

// TODO: 在此处引用程序需要的其他标头。
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;


// Opencv_Face.cpp: 定义应用程序的入口点。
//

#include "Opencv_Face.h"



int main()
{
	CascadeClassifier face_CascadeClassifier;
	if (!face_CascadeClassifier.load("F:/opencv/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml")) {
		cout << "级联分类器加载失败!\n" << endl;
		return -1;
	}

	VideoCapture capture;
	capture.open(0);
	if (!capture.isOpened()) {
		cout << "opencv打开摄像头失败!\n" << endl;
		return -1;
	}
	Mat frame;//摄像头彩色图像
	Mat gray;//摄像头灰度图像
	while (true) 
	{
		capture >> frame;
		if (frame.empty()) {
			cout << "opencv读取摄像头图像失败!\n" << endl;
			return -1;
		}
		//灰度化处理
		cvtColor(frame, gray, COLOR_BGR2GRAY);//opencv 中是 B G R
		imshow("灰度化", gray);//显示图像
		if (waitKey(30) == 27)//Esc键退出
		{
			break;
		}
	}
	cout << "Hello CMake。" << endl;
	return 0;
}

人脸检测 (只适合静态图像的检测)

这种方式来检测相机实时人脸图像非常卡顿!只适合静态图像的检测。

主要函数:

//直方图均衡化,达到目的:增强对比度
		equalizeHist(gray, gray);
		std::vector<Rect>  faces;
		face_CascadeClassifier.detectMultiScale(gray, faces);

cmakelist和.h不变。

// Opencv_Face.cpp: 定义应用程序的入口点。
//

#include "Opencv_Face.h"

int main()
{
	CascadeClassifier face_CascadeClassifier;
	if (!face_CascadeClassifier.load("F:/opencv/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml")) {
		cout << "级联分类器加载失败!\n" << endl;
		return -1;
	}

	VideoCapture capture;
	capture.open(0);
	if (!capture.isOpened()) {
		cout << "opencv打开摄像头失败!\n" << endl;
		return -1;
	}
	Mat frame;//摄像头彩色图像
	Mat gray;//摄像头灰度图像
	while (true) 
	{
		capture >> frame;
		if (frame.empty()) {
			cout << "opencv读取摄像头图像失败!\n" << endl;
			return -1;
		}
		//灰度化处理
		cvtColor(frame, gray, COLOR_BGR2GRAY);//opencv 中是 B G R
		
		//直方图均衡化,达到目的:增强对比度
		equalizeHist(gray, gray);
		std::vector<Rect>  faces;
		face_CascadeClassifier.detectMultiScale(gray, faces);

		for each (Rect face in faces)
		{
			//1, 在哪个上面画
			//2,人脸框矩形
			//3,画的矩形框的颜色
			rectangle(frame, face, Scalar(0, 0, 255));//蓝B  绿G  红R
			//这种方式来检测相机实时人脸图像非常卡顿!只适合静态图像的检测
		}
		imshow("摄像头", frame);//显示图像
		if (waitKey(30) == 27)//Esc键退出
		{
			break;
		}
	}
	cout << "Hello CMake。" << endl;
	return 0;
}

人脸跟踪

// Opencv_Face.cpp: 定义应用程序的入口点。
//

#include "Opencv_Face.h"

int main()
{
	

#ifdef DETECT
	//人脸检测
	if (!face_CascadeClassifier.load("F:/opencv/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml")) {
		cout << "级联分类器加载失败!\n" << endl;
		return -1;
	}
#else
	//人脸跟踪
	//创建1个主检测适配器
	cv::Ptr<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(
		makePtr<CascadeClassifier>("F:/opencv/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml"));
	//创建1个跟踪检测适配器
	cv::Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(
		makePtr<CascadeClassifier>("F:/opencv/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml"));

	//创建跟踪器
	DetectionBasedTracker::Parameters DetectorParams;
	tracker = makePtr<DetectionBasedTracker>(mainDetector, trackingDetector, DetectorParams);
	tracker->run();
#endif // DETECT

	VideoCapture capture;
	capture.open(0);
	if (!capture.isOpened()) {
		cout << "opencv打开摄像头失败!\n" << endl;
		return -1;
	}
	Mat frame;//摄像头彩色图像
	Mat gray;//摄像头灰度图像
	while (true) 
	{
		capture >> frame;
		if (frame.empty()) {
			cout << "opencv读取摄像头图像失败!\n" << endl;
			return -1;
		}
		//灰度化处理
		cvtColor(frame, gray, COLOR_BGR2GRAY);//opencv 中是 B G R
		
		//直方图均衡化,达到目的:增强对比度
		equalizeHist(gray, gray);

		std::vector<Rect>  faces;
#ifdef DETECT
		face_CascadeClassifier.detectMultiScale(gray, faces);
#else
		tracker->process(gray);
		tracker->getObjects(faces);
#endif // DETECT

		for each (Rect face in faces)
		{
			//1, 在哪个上面画
			//2,人脸框矩形
			//3,画的矩形框的颜色
			rectangle(frame, face, Scalar(0, 0, 255));//蓝B  绿G  红R
			//这种方式来检测相机实时人脸图像非常卡顿!只适合静态图像的检测
		}
		imshow("摄像头", frame);//显示图像

		if (waitKey(30) == 27)//Esc键退出
		{
			break;
		}
	}
#ifndef DETECT
	tracker->stop();
#endif // DETECT
	return 0;
}

.h文件

// Opencv_Face.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>

// TODO: 在此处引用程序需要的其他标头。
#include <opencv2/opencv.hpp>

//#define DETECT

using namespace std;
using namespace cv;

//#define DETECT
CascadeClassifier face_CascadeClassifier;
cv::Ptr<DetectionBasedTracker> tracker;

class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector
{
public:
	CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector) :
		IDetector(),
		Detector(detector)
	{
		CV_Assert(detector);
	}

	void detect(const cv::Mat& Image, std::vector<cv::Rect>& objects)
	{
		Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);
	}

	virtual ~CascadeDetectorAdapter()
	{
	}

private:
	CascadeDetectorAdapter();
	cv::Ptr<cv::CascadeClassifier> Detector;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值