人脸识别用的是OpenCV自带的级联分类器,在opencv\data文件夹里可以找到这些已经训练好的xml文件。我将分别使用CUDA加速和不使用CUDA,比较一下速度上到底有多大提升。
WITH CUDA:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "Can not open video source";
return -1;
}
std::vector<cv::Rect> h_found;
cv::Ptr<cv::cuda::CascadeClassifier> cascade = cv::cuda::CascadeClassifier::create("haarcascade_frontalface_alt2.xml");
cv::cuda::GpuMat d_frame, d_gray, d_found;
while (1)
{
Mat frame;
if (!cap.read(frame)) {
cerr << "Can not read frame from webcam";
return -1;
}
d_frame.upload(frame);
cv::cuda::cvtColor(d_frame, d_gray, cv::COLOR_BGR2GRAY);
int64 start = cv::getTickCount();
cascade->detectMultiScale(d_gray, d_found);
cascade->convert(d_found, h_found);
double fps = cv::getTickFrequency() / (cv::getTickCount() - start);
cout << "FPS : " << fps << endl;
for (int i = 0; i < h_found.size(); ++i)
{
rectangle(frame, h_found[i], Scalar(0, 255, 255), 3);
}
imshow("Result", frame);
if (waitKey(30) == 'q') {
break;
}
}
return 0;
}
FPS如图:一直是27左右。
WITHOUT CUDA:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image, image_gray;
VideoCapture capture(0);
if (!capture.isOpened()) {
cerr << "Can not open video source";
return -1;
}
while (1)
{
if (!capture.read(image)) {
cerr << "Can not read frame from webcam";
return -1;
}
cvtColor(image, image_gray, CV_BGR2GRAY);
equalizeHist(image_gray, image_gray);
CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_alt2.xml"))
{
cout << "Load haarcascade_frontalface_alt failed!" << endl;
return 0;
}
//vector 是个类模板 需要提供明确的模板实参 vector<Rect>则是个确定的类 模板的实例化
vector<Rect> faceRect;
int64 start = cv::getTickCount();
//检测关于脸部位置
face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0, Size(30, 30));
double fps = cv::getTickFrequency() / (cv::getTickCount() - start);
cout << "FPS : " << fps << endl;
for (size_t i = 0; i < faceRect.size(); i++)
{
rectangle(image, faceRect[i], Scalar(0, 0, 255));
}
imshow("人脸识别图", image);
if (waitKey(30) == 'q') {
break;
}
}
return 0;
}
FPS如下图,FPS保持在8左右。使用CUDA加速确实有效果,能提升两倍!!