- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我一直在做一些研究,并试图建立一个 haarcascade 来识别性别。 我阅读了这篇文章,其中描述了他们是如何做到的,我也尝试这样做:http://www.ijcce.org/papers/301-
本人根据Opencv文档制作了人脸识别程序。我还想找出耳朵的位置,但是在使用为耳朵提供的 Haarcascade 时,编译器说流中有一个非法字符。Question1-如何去除这个非法字符?Questi
我决定针对此处给出的 102 个花卉类别训练 Haar 分类器:(数据集) http://www.robots.ox.ac.uk/~vgg/data/flowers/102/categories.ht
我正在使用 opencv 和 c++。当我将 Haarcascade 与 haarcascade_frontalface_alt2.xml 文件一起使用时,它只检测面部而不检测耳朵。我需要一张图片中的
我正在尝试使用我用相机拍摄的样本创建一个 xml 文件。这是一次试运行,我将相机放在 window 上,让它每隔 30 秒拍一张过往车辆的照片,持续一段时间。我现在有大约 200 张图片(只是为了一个
我想在opencv cpp中使用facedetection在Android应用程序中使用它。我已经成功编译了jni。但我不知道我该如何使用级联。我可以存储在sdcard中并从那里读取它。我还有其他方法
我一直在关注教程 here使用 opencv 通过网络摄像头对面部和眼睛进行对象跟踪。问题是,即使使用 haarcascade_frontalface_alt.xml 进行人脸检测,我也没有收到使用
我正在为 OpenCV 搜索 NEW* Haarcascade。它可以是任何东西——脸、人、车等等,现在我只需要它来进行一些测试。不幸的是,OpenCV 中包含的所有级联以及我在互联网上创建的所有内容
我在 opencv 中看到了多个用于面部检测、眼睛检测、耳朵检测、人体检测等的 haarcascade xml,但是看不到这些 xml 的适当文档或解释。 例如,在一个应用程序中,如果我需要检测侧面,
我正在使用 opencv 进行 Opencv 移动车辆检测。我需要 2000 个正样本和 1000 个负样本的汽车进行检测。 请给我一些链接,我可以在其中下载汽车样本以供检测。 谢谢 最佳答案 以下是
我一直在尝试 OpenCV iOS 示例来实现面部情绪识别。我从下面的链接获得了 OpenCV 示例 iOS 项目“openCViOSFaceTrackingTutorial”。 https://gi
我需要多少个正样本和多少个负样本才能识别像这张图片上 3 个贴纸之一的图案: http://i.expansys.com/i/b/b199956.jpg 注意:我说的是为 OpenCV 在 xml 中
我正在使用 C++ 和 OpenCV 编写程序。这实际上是我的第一次,所以我要问的可能是我忽略的非常基本的东西。其中大部分是复制的——请注意,不是复制+粘贴,而是手工复制,逐行复制,理解我写的每一行在
我正在尝试在这里做一些人脸检测并使用标准的级联,可以找到here ,下面的代码应该在眼睛和脸上绘制矩形,或者级联根本不起作用,或者我的代码应该在框架上绘制有问题。还有可能抓取视频源而不是将其倒置吗?
我正在使用 opencv 和 c++。如果我有 348x288 人脸图像,应该使用哪种人脸检测器算法。在 Haarcascade 的论文中 http://www.vision.caltech.edu/
我正在尝试实现 Viola Jones 检测器。因为我没有足够的图像或时间来训练分类器,所以我决定使用这些 OpenCV。 到目前为止,我已经能够将整个 haarcascade_frontface_a
正如我在主题中所说的,下面的代码使用 haarcascade-Opencv/Python 检测图像中的每个人脸。 代码检测所有面孔, 但是我需要检测图像中的相同面孔,然后绘制不同颜色的边界框 我是初学
我想使用 opencv 和 haartraining 来训练带有新样本的新 haarcascade。我创建了 positives.dat 和 negative.dat,其中包含正面和负面图像的列表。下
我正在尝试创建一个从正面摄像头拍照而不是使用 Viola-Jones 算法对其进行分析的应用程序。有办法吗? 我正在关注这个例子 Face Detection using Haar Cascades
我错过了什么? VS 无法找到 Capture 和 HaarCascade。我添加了所有 opencv .dll 和“始终复制”。 并添加了 Emgu 的引用。 我的 Emgu 是 emgucv-wi
我是一名优秀的程序员,十分优秀!