gpt4 book ai didi

C++ OpenCV 读取 HaarCascades 减慢计算机速度

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:15 27 4
gpt4 key购买 nike

我正在使用 C++ 和 OpenCV 编写程序。这实际上是我的第一次,所以我要问的可能是我忽略的非常基本的东西。其中大部分是复制的——请注意,不是复制+粘贴,而是手工复制,逐行复制,理解我写的每一行在做什么——来自 OpenCV 的一些教程。我将在下面粘贴代码。

我遇到的问题是,一旦网络摄像头开始尝试实现面部识别,一切都会变慢。向下。据我了解,这是因为 .exe 试图在每次帧更新时从两个 MASSIVE .xml 文件中读取,但我不知道如何修复它。在我限制视频的高度、宽度和帧率之前情况更糟。

如果此时有人有任何想法,我很乐意听取他们的意见。我是软件编程的新手 - 直到现在我主要从事 Web 开发,所以我不习惯担心系统内存和其他因素。

提前致谢!

编辑:这是我的系统规范:Mac、OSX 10.9.4、2.5 GHz Intel Core i5、4 GB 1600 MHz DDR3 RAM。

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

/** Function Headers */
void detectAndDisplay( Mat frame );

/** Global variables */
String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
String window_name = "Capture - Face detection";

/** @function main */
int main( void )
{
cv::VideoCapture capture;
Mat frame;

//-- 1. Load the 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; };

//-- 2. Read the video stream
capture.open( -1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

capture.set(CV_CAP_PROP_FRAME_WIDTH,640);
capture.set(CV_CAP_PROP_FRAME_HEIGHT,480);
capture.set(CV_CAP_PROP_FPS, 15);

while ( capture.read(frame) )
{
if( frame.empty() )
{
printf(" --(!) No captured frame -- Break!");
break;
}

//-- 3. Apply the classifier to the frame
detectAndDisplay( frame );

int c = waitKey(10);
if( (char)c == 27 ) { break; } // escape
}
return 0;
}

/** @function detectAndDisplay */
void detectAndDisplay( Mat frame )
{
std::vector<Rect> 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|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 );
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] );
std::vector<Rect> eyes;

//-- In each face, detect 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 );
}
}
//-- Show what you got
imshow( window_name, frame );
}

最佳答案

一个快速的解决方案是替换:

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

通过

eyes_cascade.detectMultiScale( faceROI, eyes, 1.3, 2, 0 |CASCADE_SCALE_IMAGE, Size(60, 60), Size(350, 350) );

1.3 是比例因子,Size(60, 60) 是最小窗口大小,Size(350, 350) 是最大窗口大小。这基本上意味着它将开始搜索 60*60 面,然后将大小增加 oldWindowSize*1.3,直到达到 350*350。假设你的脸是最小 60 * 60 和最大 350 * 350。

您可以根据需要进一步调整它。 minSize 对性能和规模的影响最大(但 1.3 已经很高)。 maxSize 的影响较小。

此更新后,您的程序应该会快两倍或将 CPU 使用率降低一半。然而,我仍然感到惊讶的是,您当前的调音和您的计算机存在性能问题...

如果有效,请给我们反馈。

关于C++ OpenCV 读取 HaarCascades 减慢计算机速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com