opencv linux和windows,opencv视频取帧并进行人脸检测(Windows和Linux双版本)

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

Mat frame_gray;

cvtColor(frame, frame_gray, COLOR_BGR2GRAY);

equalizeHist(frame_gray, frame_gray);

//-- Detect faces

face_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 eyes;

//-- In each face, detect eyes

eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));

if (eyes.size() == 2)

{

//-- Draw the face

Point 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 eyes

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, 255), 3, 8, 0);

}

}

}

//-- Show what you got

imshow(window_name, frame);

}

int loadCascade()

{

if (!face_cascade.load(face_cascade_name))

{

printf("--(!)Error loading face cascaden");

return -1;

};

if (!eyes_cascade.load(eyes_cascade_name))

{

printf("--(!)Error loading eyes cascaden");

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

Mat frame_gray;

cvtColor(frame, frame_gray, COLOR_BGR2GRAY);

equalizeHist(frame_gray, frame_gray);

//-- Detect faces

face_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 eyes;

//-- In each face, detect eyes

eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));

if (eyes.size() == 2)

{

//-- Draw the face

Point 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 eyes

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, 255), 3, 8, 0);

}

}

}

//-- Show what you got

imshow(window_name, frame);

}

int loadCascade()

{

if (!face_cascade.load(face_cascade_name))

{

printf("--(!)Error loading face cascaden");

return -1;

};

if (!eyes_cascade.load(eyes_cascade_name))

{

printf("--(!)Error loading eyes cascaden");

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/opencv2

LIBS = `pkg-config --libs opencv`

CC = g++

clean:

rm -f *.o *~ test

main: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值