C++ 修改“打开CV视频检测”教程
我对打开简历有些陌生,只是对教程做了一些实验,以了解关于这个库的使用和功能的一些信息,在其中一个教程中,已经放在了open CV官方网站上,有一段代码是关于检测一些经过训练的人脸和预测网络摄像头上的人脸 现在我正试图修改代码,以便使用本地数据库中保存的图片,并在检测到的人脸上提供相同的输出,并在其上方添加一个标签。我以以下方式修改了代码(在教程中提到的代码的第88行之后):C++ 修改“打开CV视频检测”教程,c++,opencv,C++,Opencv,我对打开简历有些陌生,只是对教程做了一些实验,以了解关于这个库的使用和功能的一些信息,在其中一个教程中,已经放在了open CV官方网站上,有一段代码是关于检测一些经过训练的人脸和预测网络摄像头上的人脸 现在我正试图修改代码,以便使用本地数据库中保存的图片,并在检测到的人脸上提供相同的输出,并在其上方添加一个标签。我以以下方式修改了代码(在教程中提到的代码的第88行之后): CascadeClassifier haar_cascade; haar_cascade.load(fn_haar);
CascadeClassifier haar_cascade;
haar_cascade.load(fn_haar);
for(;;) {
Mat gray;
Mat original;
gray = imread("F:\datasets\23.jpg",0);
original = imread("F:\datasets\23.jpg");
vector< Rect_<int> > faces;
haar_cascade.detectMultiScale(gray, faces);
for(int i = 0; i < faces.size(); i++) {
Rect face_i = faces[i];
Mat face = gray(face_i);
Mat face_resized;
cv::resize(face, face_resized, Size(im_width, im_height), 1.0, 1.0, INTER_CUBIC);
// predict:
int prediction = model->predict(face_resized);
// visualize:
rectangle(original, face_i, CV_RGB(0, 255,0), 1);
string box_text = format("Prediction = %d", prediction);
int pos_x = std::max(face_i.tl().x - 10, 0);
int pos_y = std::max(face_i.tl().y - 10, 0);
putText(original, box_text, Point(pos_x, pos_y), FONT_HERSHEY_PLAIN, 1.0, CV_RGB(0,255,0), 2.0);
}
// Show the result:
imshow("face_recognizer", original);
// And display it:
char key = (char) waitKey(20);
// Exit this loop on escape:
if(key == 27)
break;
}
cascade分类器haar_cascade;
haar_梯级荷载(fn_haar);
对于(;;){
席灰色;
垫子原件;
灰色=imread(“F:\datasets\23.jpg”,0);
original=imread(“F:\datasets\23.jpg”);
向量<矩形>面;
haar_级联。检测多尺度(灰色、人脸);
对于(inti=0;i预测(面大小调整);
//想象:
矩形(原始、面、CV、RGB(0、255、0)、1);
字符串框\文本=格式(“预测=%d”,预测);
int pos_x=std::max(face_i.tl().x-10,0);
int pos_y=std::max(face_i.tl().y-10,0);
putText(原件、方框、文本、点(位置x、位置y)、字体、字体、1.0、CV、RGB(0255,0)、2.0);
}
//显示结果:
imshow(“人脸识别器”,原件);
//并显示:
char key=(char)waitKey(20);
//在退出时退出此循环:
如果(键==27)
打破
}
但是,当我执行代码时,它会报告“OpenCV错误:未知函数中的坏标志(参数或结构字段)(无法识别或不支持的数组类型)”有人能帮我解决这个问题以检测和解决代码中的错误吗?调整图像路径,应该是
“F:\\datasets\\23.jpg”或“F:/datasets/23.jpg”
(文件名中的单个反斜杠有些问题,请使用2或避免使用)
对于未来,该错误是空的或无效的垫子的症状,因此必须对加载的任何ressource进行检查。比如:
gray = imread("F:/datasets/23.jpg",0);
if ( gray.empty() )
{
cerr << "could not load it!";
return -1;
}
在那里调整图像路径,应该是“F:\\datasets\\23.jpg”或“F:/datasets/23.jpg” (文件名中的单个反斜杠有些问题,请使用2或避免使用) 对于未来,该错误是空的或无效的垫子的症状,因此必须对加载的任何ressource进行检查。比如:
gray = imread("F:/datasets/23.jpg",0);
if ( gray.empty() )
{
cerr << "could not load it!";
return -1;
}
没有OpenCV的经验,但是如果我有这个错误,我会启动gdb。没有OpenCV的经验,但是如果我有这个错误,我会启动gdb。你能提到在本教程中应该如何启动原始变量吗?我认为这个变量会导致问题。这个变量的初始值应该是什么?有一个名为original的变量,用于打印矩形并在其上方添加标签,它来自Mat类型,但我很难启动它:
original=imread(“F:/datasets/23.jpg”)代码>我只是想确定它的启动方式啊,好的。也许把它放在一行,Mat original=imread(…)
但是如果imread()成功与否,没有任何东西可以让您免于检查。您需要与其他btw相同的if(original.empty())
code,因为您只检查了两个图像,所以可以跳过(;;)循环的封闭,并更改waitKey(20);等待键(0);因此,它会一直等待按键,反复考虑,也许最好只加载原始图像(是的,并检查是否成功!),然后获得灰度,如Mat gray;CVT颜色(原色、灰色、CV_rgb2灰色)代码>从那开始。将更快,并节省您的检查时间。您是否可以在本教程中提到应如何启动原始变量?我认为这个变量会导致问题。这个变量的初始值应该是什么?有一个名为original的变量,用于打印矩形并在其上方添加标签,它来自Mat类型,但我很难启动它:original=imread(“F:/datasets/23.jpg”)代码>我只是想确定它的启动方式啊,好的。也许把它放在一行,Mat original=imread(…)
但是如果imread()成功与否,没有任何东西可以让您免于检查。您需要与其他btw相同的if(original.empty())
code,因为您只检查了两个图像,所以可以跳过(;;)循环的封闭,并更改waitKey(20);等待键(0);因此,它会一直等待按键,反复考虑,也许最好只加载原始图像(是的,并检查是否成功!),然后获得灰度,如Mat gray;CVT颜色(原色、灰色、CV_rgb2灰色)代码>从那开始。将更快,并避免您进行两次检查