opencv视频取帧并进行人脸检测(Windows和Linux双版本)
来源:互联网 发布:淘宝福袋是死人衣服 编辑:程序博客网 时间:2024/05/29 07:39
Windows版本
环境win7+vs2015+opencv2.4.10
直接给代码:
#include "highgui.h" #include "objdetect/objdetect.hpp"#include "imgproc/imgproc.hpp"using namespace cv;String face_cascade_name = "E:\\rszj\\software\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml";String eyes_cascade_name = "E:\\rszj\\software\\opencv\\sources\\data\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml";CascadeClassifier face_cascade;CascadeClassifier eyes_cascade;void detectAndDisplay(char* window_name, IplImage* frameSrc){Mat frame = Mat(frameSrc);std::vector<Rect> faces;Mat frame_gray;cvtColor(frame, frame_gray, COLOR_BGR2GRAY);equalizeHist(frame_gray, frame_gray);//-- Detect facesface_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0, Size(80, 80));for (size_t i = 0; i < faces.size(); i++){Mat faceROI = frame_gray(faces[i]);std::vector<Rect> eyes;//-- In each face, detect eyeseyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));if (eyes.size() == 2){//-- Draw the facePoint 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, 0), 2, 8, 0);for (size_t j = 0; j < eyes.size(); j++){ //-- Draw the eyesPoint 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, 255), 3, 8, 0);}}}//-- Show what you gotimshow(window_name, frame);}int loadCascade(){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;};return 0;}int main(int argc, char* argv[]){if (loadCascade() != 0){printf("Error loading cascade!!");return -1;}cvNamedWindow("avi");CvCapture* capture = cvCreateFileCapture("E:\\rszj\\codes\\c++workspace\\opencv_model\\Debug\\test4.mp4");IplImage* frame;while (1){frame = cvQueryFrame(capture);if (!frame) break;//cvShowImage("avi", frame);detectAndDisplay("avi", frame);char c = cvWaitKey(50);if (c == 27)break;}cvReleaseCapture(&capture);cvDestroyWindow("avi");return 0;}
Linux:
环境:Ubuntu14.04 + opencv2.4.9
#include "stdio.h"#include "highgui.h"#include "objdetect/objdetect.hpp"#include "imgproc/imgproc.hpp"using namespace cv;//using namespace std;string face_cascade_name = "/home/rszj/yanjie/codes/opencv/lbpcascade_frontalface.xml";string eyes_cascade_name = "/home/rszj/yanjie/codes/opencv/haarcascade_eye_tree_eyeglasses.xml";CascadeClassifier face_cascade;CascadeClassifier eyes_cascade;void detectAndDisplay(string window_name, IplImage* frameSrc){ Mat frame = Mat(frameSrc);std::vector<Rect> faces;Mat frame_gray;cvtColor(frame, frame_gray, COLOR_BGR2GRAY);equalizeHist(frame_gray, frame_gray);//-- Detect facesface_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0, Size(80, 80));for (size_t i = 0; i < faces.size(); i++){Mat faceROI = frame_gray(faces[i]);std::vector<Rect> eyes;//-- In each face, detect eyeseyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));if (eyes.size() == 2){//-- Draw the facePoint 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, 0), 2, 8, 0);for (size_t j = 0; j < eyes.size(); j++){ //-- Draw the eyesPoint 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, 255), 3, 8, 0);}}}//-- Show what you gotimshow(window_name, frame);}int loadCascade(){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;};return 0;}int main(int argc, char* argv[]){if (loadCascade() != 0){printf("Error loading cascade!!");return -1;}cvNamedWindow("avi");CvCapture* capture = cvCreateFileCapture("test4.mp4");IplImage* frame;while (1){frame = cvQueryFrame(capture);if (!frame) break;//cvShowImage("avi", frame);detectAndDisplay("avi", frame);char c = cvWaitKey(20);if (c == 27)break;}cvReleaseCapture(&capture);cvDestroyWindow("avi");return 0;}
Makefile:
CFLAGS = `pkg-config --cflags opencv` -I/usr/include/opencv2LIBS = `pkg-config --libs opencv`CC = g++clean: rm -f *.o *~ testmain:main.cpp $(CC) $+ $(CFLAGS) $(LIBS) -o main.o
编译用:make main
PS:这里Makefile要记住一点:
顺序一定要:$(CC) $+ $(CFLAGS) $(LIBS) -o main.o 而不能用:$(CC) $(CFLAGS) $(LIBS) -o main.o $+
不然会出现:“对‘cv::Mat::Mat(_IplImage const*, bool)’未定义的引用”之类的错误。
具体原因我也没搞懂,我测试了一下:
g++ -o main.o main.cpp`pkg-config --cflags opencv` -I/usr/include/opencv2 `pkg-config --libs opencv`#这个是OK的
而
g++ `pkg-config --cflags opencv` -I/usr/include/opencv2 `pkg-config --libs opencv` -o main.o main.cpp #这个就是不行的,反而按照规范这个才是正确写法吧
原因没搞懂,望有经验的同学予以指正。
阅读全文
0 0
- opencv视频取帧并进行人脸检测(Windows和Linux双版本)
- 【Python+OpenCV】实现检测场景内是否有物体移动,并进行人脸检测抓拍
- OpenCV:人脸检测和行人检测
- opencv 人脸识别和行人检测
- 视频监控 形态学 OpenCV致力于计算机视觉技术研究(高密度环境下行人检测和统计)
- HOG+SVM行人检测opencv版本
- 新手学习opencv九:基于Hog的视频行人检测
- OpenCV Demo :行人检测(HOG+SVM)
- opencv实现行人检测(C++)
- OpenCV中行人检测
- Opencv HOG检测行人
- Opencv HOG检测行人
- OpenCV中行人检测
- Opencv HOG行人检测
- 行人检测 opencv
- OpenCV行人检测
- opencv行人检测代码
- opencv行人跟踪检测
- 运行jar文件方法
- Appium移动自动化测试1
- 【心励路程】----凡事多换位思考
- 基础数据结构04:背包
- 基于机器学习的NLP情感分析(一)---- 数据采集与词向量构造方法(京东商品评论情感分析)
- opencv视频取帧并进行人脸检测(Windows和Linux双版本)
- samba简单免密搭建方式
- 剖析容器List
- CDH启用 sentry
- 51实现定时器定时调整
- 2017暑假集训 div1 匹配问题(1)
- 机器学习实战 笔记 debug(一) kNN
- 单例模式的双层锁原理
- Java GC 相关