简介
- OpenCV是一个基于BSD许可开源发行的跨平台计算机视觉库。拥有C++,Python和Java接口,并且支持Windows, Linux, Mac OS, iOS 和 Android系统。实现了图像处理和计算机视觉方面的很多通用算法。
主要模块以及功能
模块 | 功能 |
---|---|
Core | 核心基础模块,定义了被所有其他模块和基本数据结构(包括重要的多维数组Mat)使用的基本函数、底层数据结构和算法函数 |
Imgproc | 图像处理模块,包括:滤波、高斯模糊、形态学处理、几何变换、颜色空间转换及直方图计算等 |
Highgui | 高层用户交互模块,包括:GUI、图像与视频I\O等 |
Video | 视频分析,,运动分析及目标跟踪 |
Calib3d | 3D模块,包括:摄像机标定、立体匹配、3D重建等 |
Features2d | 二维特征检测与描述模块,包括:图像特征检测、描述、匹配等 |
Objdetect | 目标检测模块,如:人脸检测等 |
MI | 机器学习模块,包括:支持向量机、神经网络等 |
Flann | 最近邻开源库。包含一系列查找算法,自动选取最快算法的机制。 |
Imgcodecs | 图像编解码模块,图像文件的读写操作 |
Photo | 图像计算(处理)模块,图像修复及去噪。 |
Shape | 形状匹配算法模块。描述形状、比较形状 |
Stitching | 图像拼接 |
Superres | 超分辨率模块 |
Videoio | 视频读写模块,视频文件包括摄像头的输入 |
Videostab | 解决拍摄的视频稳定 |
Dnn | 深度神经网络 |
contrib | 可以引入额外模块 |
人脸定位
人脸定位,是人脸检测、识别的基础,比如像美图的贴纸,B612相机的贴纸啊,等等,都是需要先定位到人脸而后再进行处理,人脸识别,现在比较流行的就是刷脸支付。
代码
这个前提是先配置好xcode环境,不会配置的,看它(https://blog.csdn.net/YuQing_Cat/article/details/83113424)
这个是FaceTracking.cpp文件
#include "FaceTracking.h"
int main(int argc, const char * argv[]) {
//分类器 智能指针
Ptr<CascadeClassifier> classifier = makePtr<CascadeClassifier>("/Users/.../OpenCV-android-sdk/sdk/etc/lbpcascades/lbpcascade_frontalface.xml");
//创建一个跟踪适配器
Ptr<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(classifier);
//分类器 智能指针
Ptr<CascadeClassifier> classifier1 = makePtr<CascadeClassifier>("/Users/.../OpenCV-android-sdk/sdk/etc/lbpcascades/lbpcascade_frontalface.xml");
//再创建一个跟踪适配器
Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(classifier1);
DetectionBasedTracker::Parameters DetectorParams;
Ptr<DetectionBasedTracker> tracker = makePtr<DetectionBasedTracker>(mainDetector,trackingDetector,DetectorParams);
//开启跟踪器
tracker->run();
VideoCapture capture(0);
Mat img;
Mat gray;
while (1) {
capture >> img;
//变成灰度图片
//img的颜色空间为BGR,现在比较主流的颜色空间为RGB
//但是在早期时候是BGR
cvtColor(img, gray, COLOR_BGR2GRAY);
//增强对比度(直方图均衡)
equalizeHist(gray, gray);
std::vector<Rect> faces;
//定位人脸 N个
tracker->process(gray);
tracker->getObjects(faces);
for ( Rect face : faces ) {
//画矩形
//分别指定bgr
rectangle(img, face, Scalar(0, 0, 255));
}
imshow("摄像头", img);
waitKey(30);
}
tracker->stop();
return 0;
}
这个是.h文件
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector
{
public:
CascadeDetectorAdapter(Ptr<CascadeClassifier> detector) :IDetector(),
Detector(detector){
CV_Assert(detector);
}
void detect(const Mat &Image, std::vector<cv::Rect> &objects)
{
//返回一个矩形
Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);
}
virtual ~CascadeDetectorAdapter()
{
}
private:
CascadeDetectorAdapter();
Ptr<CascadeClassifier> Detector;
};
效果图
本来打开的其实是摄像头,因为想识别多个人,就用了照片代替