OpenCV人脸检测使计算机崩溃
opencv face detect crashes computer
大家好,我在Visual Studio 2015 C++中编程的opencv 3.1程序一直遇到这个问题。它可以很好地使用相机并显示图像,但是我尝试了计算机冻结文档中的面部检测示例。这是代码:
以下是它挂断的两个函数:但主要停在 faceDetect 函数周围,我将做一个断点来具体知道在哪里。
void CoreVision::init()
{
face_cascade_name = "C:\PAD\opencv\haarcascades\haarcascade_frontalface_alt.xml";
eyes_cascade_name = "C:\PAD\opencv\haarcascades\haarcascade_eye_tree_eyeglasses.xml";
if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascaden"); };
if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascaden"); };
std::cout << "face_dir: " << face_cascade_name << std::endl;
std::cout << "eye_dir: " << eyes_cascade_name << std::endl;
}
cv::Mat CoreVision::detectFace(cv::Mat main)
{
cv::Mat nuller;
try
{
faces.clear();
cv::Mat frame_gray;
cv::cvtColor(main, frame_gray, cv::COLOR_BGR2GRAY);
cv::equalizeHist(frame_gray, frame_gray);
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
for (size_t i = 0; i < faces.size(); i++)
{
cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
cv::ellipse(main, center, cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, cv::Scalar(255, 0, 255), 4, 8, 0);
cv::Mat faceROI = frame_gray(faces[i]);
std::vector<cv::Rect> eyes;
eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
for (size_t j = 0; j < eyes.size(); j++)
{
cv::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);
cv::circle(main, eye_center, radius, cv::Scalar(255, 0, 0), 4, 8, 0);
}
}
return main;
}
catch (...)
{
std::cout << "Exception: have issue with processing face detection.";
return nuller;
}
这是主要功能:
int main()
{
CoreVision _core;
_core.init();
while (true)
{
cv::Mat img = _core.captureImage(-1);
img = _core.detectFace(img);
_core.displayImage(img, "parker");
}
}
最后是两个函数的 .h 文件:
#include <iostream>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <opencv2opencv.hpp>
#include <opencv2world.hpp>
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
class CoreVision
{
public:
CoreVision();
~CoreVision();
cv::Mat loadImage(const char* image_name, int type);
void saveImage(cv::Mat img, const char* filename);
cv::Mat captureImage(int cam);
cv::Mat detectFace(cv::Mat main);
int convertImage(cv::Mat img, int type);
void displayImage(cv::Mat, const char* window_name);
void init(void);
char cCurrentPath[FILENAME_MAX];
cv::String face_cascade_name;
cv::String eyes_cascade_name;
cv::CascadeClassifier face_cascade;
cv::CascadeClassifier eyes_cascade;
std::vector<cv::Rect> faces;
};
提前感谢您的帮助,我不确定这是否是驱动程序问题,但我已经在多台计算机上尝试过,并且发生了相同的冻结。
您似乎没有存储面向量。你在公共场合有它标准::矢量面;但是你在哪里使用它?眼睛和脸是两组不同的数据。您还混合了两种风格的代码 c 风格和 c++ 风格的 opencv。你应该坚持使用c ++,因为你使用的是最新的opencv版本。
faces.clear(); // under here
std::vector<Rect>faces; // see if this helps
//
void saveImage(cv::Mat img, const char* filename); //should be
void imwrite(img, const char* filename);// etc.
cv::Mat img = _core.captureImage(-1);
img = _core.detectFace(img);
_core.displayImage(img, "parker"); // should be
_core.displayImage(Mat frame);
假设 core.captureImage(-1) 可能行不通;是你的相机。另外int convertImage(cv::Mat img, int type); do?
您确定它需要整数值吗?
C++ 约定是
Videocapture cap(0);
Mat frame:
cap >> frame;
namedWindow("video");
imshow(video, frame); //etc
我遇到了完全相同的问题。我发现包含eyes_cascade.detectMultiScale的行是导致我的驱动程序崩溃的行。我有英特尔高清显卡 4400。在我完全卸载英特尔高清显卡驱动程序后,代码开始完美运行。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- CoInitialize()在单独的线程上崩溃而不返回
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 视窗驱动程序IOCTL代码蓝屏/使计算机崩溃
- 如何检测终止进程事件、计算机关闭和计算机崩溃
- OpenCV人脸检测使计算机崩溃
- 使用删除会使我的计算机崩溃
- 为什么这行代码会导致计算机崩溃
- 访问计算机指针时发生访问冲突(c系统异常代码:c0000005),导致应用程序崩溃