【OpenCV】目标检测
来源:互联网 发布:机械革命 知乎 编辑:程序博客网 时间:2024/05/17 09:18
OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification)。haar支持的目标有人脸、眼、嘴、鼻、身体,这里给出的是脸部和眼部的示例。
理论参考链接:https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html
代码参考链接:https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html
代码示例
#include "opencv2/objdetect.hpp"#include "opencv2/videoio.hpp"#include "opencv2/highgui.hpp"#include "opencv2/imgproc.hpp"#include <iostream>#include <stdio.h>using namespace std;using namespace cv;void detectAndDisplay(Mat frame); // 检测并显示String face_cascade_name, eyes_cascade_name;CascadeClassifier face_cascade; // 脸部识别CascadeClassifier eyes_cascade; // 眼部识别String window_name = "Capture - Face detection";int main(int argc, const char** argv){ CommandLineParser parser(argc, argv, "{help h||}" "{face_cascade|../data/haarcascade_frontalface_alt.xml|}" "{eyes_cascade|../data/haarcascade_eye_tree_eyeglasses.xml|}"); cout << "\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(); face_cascade_name = parser.get<string>("face_cascade"); eyes_cascade_name = parser.get<string>("eyes_cascade"); VideoCapture capture; Mat frame; // 加载cascades级联分类器 if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; }; if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; }; // 读取视频 capture.open(0); if (!capture.isOpened()) { printf(" --(!)Error opening video capture\n"); return -1; } while (capture.read(frame)) { if (frame.empty()) { printf(" --(!) No captured frame -- Break!"); break; } // 检测并显示 detectAndDisplay(frame); char c = (char)waitKey(10); if (c == 27) { break; } } return 0;}void detectAndDisplay(Mat frame){ std::vector<Rect> faces; Mat frame_gray; cvtColor(frame, frame_gray, COLOR_BGR2GRAY); // 转换灰度图像 equalizeHist(frame_gray, frame_gray); // 直方图均衡化 // 检测脸部 face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); 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); // faces矩形的中点 ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);// 绘制椭圆 Mat faceROI = frame_gray(faces[i]); // ROI std::vector<Rect> eyes; eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); // 眼部检测 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, 8, 0); } } imshow(window_name, frame);}
运行结果就不贴出来了,只是在原有基础上加了注释,亲测可行(⊙o⊙)!
11/23小更:
原本计划是继续学习OpenCV,后续还会发布SVM等机器学习的内容,但目前还是决定搁置了。在咨询一毕业数年的博士大牛之后,现在打算开始学习“计算机视觉与机器学习”方向,后续是以python & tensorflow继续去钻研这个领域,希望能沉下心去学习研究,不要半途而废。共勉!
阅读全文
0 0
- OpenCV运动目标检测
- opencv 运动目标检测
- 目标检测 OpenCV
- 【OpenCV】目标检测
- opencv目标检测算法资源
- opencv 模板匹配目标检测
- python opencv检测目标颜色
- 应用OpenCV检测自定义目标
- OpenCV:OpenCV目标检测Boost方法训练
- opencv-根据颜色进行目标检测
- opencv-根据颜色进行目标检测
- OpenCV实现运动目标检测的函数
- OpenCV之帧差法检测运动目标
- Opencv运动目标检测常用方法
- opencv学习---运动目标(前景)检测
- openCV目标检测学习笔记(一)
- 【OpenCV】动态目标检测(背景/场景)
- python+opencv+caffe+摄像头做目标检测
- 11/20/2017
- 百度地图开发之一(创建百度地图)
- Shell语言
- 多线程基础01
- [算法分析与设计] leetcode 每周一题:Longest Substring Without Repeating Characters
- 【OpenCV】目标检测
- Eclipse中添加文档注释快捷键
- Java基础面试题(二)
- 在北京,年薪300000+的产品经理长啥样?
- 基础巩固--编写一个完美的equals方法
- 【C++】虚函数原理
- 2017 沈阳区域赛部分题解
- 多线程基础02
- Python3.6.1下载与安装