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

被折叠的 条评论
为什么被折叠?



