- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 C++ 中的 EigenFaceRecognizer 识别正面。
问题是:
1) 在高阈值时,两个人被识别为同一个人,并且还识别出"new"面孔,而不是将其声明为新面孔
2)在低阈值下,将训练集中已有的人脸识别为新人脸
3) 也会遇到误报。虽然不是问题,但如果建议一种简单的方法来减少它们,我们将不胜感激>
有什么方法可以改进识别器以准确识别人脸吗?
以下是我正在做的。
#include<opencv2\opencv.hpp> //For opencv functions
#include<opencv2\highgui\highgui.hpp> //For window based functions
#include<fstream> //For dealing with I/O operations on file
using namespace std;
using namespace cv;
// Function to read the File containing paths and labels of the training images and push them into images and labels vector
static void read_data(vector <Mat> & images,vector <int>& labels, char separator=' ')
{
ifstream file("images.txt"); //images.txt contains paths and labels separated by a space
string line;
string a[2];
while(getline(file,line)) // read images.txt line by line
{
int i=0;
stringstream iss(line);
while (iss.good() && i < 2)
{
iss>>a[i];
++i;
}
images.push_back(imread(a[0],CV_LOAD_IMAGE_GRAYSCALE)); // a[0] = "path of images"
labels.push_back(atoi(a[1].c_str())); //a[1] = "labels"
}
file.close();
}
// Function to take input from webcam and recognize faces
int face_recognition::face_rec(int time_flag, int trigger_flag)
{
vector<Mat> images; //stores the paths of all images
vector<int> labels; //stores the corresponding labels
//function call to function read_data
read_data(images,labels);
//take the size of the sample images
int im_width = images[0].cols;
int im_height = images[0].rows;
//threshold is the minimum value of magnitude of vector of EigenFaces
double threshold=10.0;
//create instance of EigenFaceRecognizer
Ptr<FaceRecognizer> model = createEigenFaceRecognizer(10,threshold);
double current_threshold =model->getDouble("threshold");
// set a threshold value, for face prediction
model->set("threshold",5000.0);
// train the face recognizer using the sample images
model->train(images,labels);
// Create face_cascade to detect people
CascadeClassifier face_cascade;
if(!face_cascade.load("haarcascade_frontalface_default.xml")) // load haarcascade_frontaface_default.xml
{
cout<<"ERROR Loading cascade file";
return 1;
}
// capture the video input from webcam
VideoCapture capture(CV_CAP_ANY);
capture.set(CV_CAP_PROP_FRAME_WIDTH, 320);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
Size frameSize(static_cast<int>(320), static_cast<int>(240));
//initialize the VideoWriter object
VideoWriter oVideoWriter ("MyVideo.avi", CV_FOURCC('P','I','M','1'), 20, frameSize, true); // video is save in the VS project
if(!capture.isOpened())
{
cout<<"Error in camera";
return 1;
}
Mat cap_img, gray_img;
//store the detected faces
vector<Rect> faces;
while(1)
{
//capture frame by frame in cap_img
capture>>cap_img;
waitKey(10);
// Image conversion: Color to Gray
cvtColor(cap_img,gray_img,CV_BGR2GRAY);
//Histogram Equilization to increase contrast by stretching intensity ranges
equalizeHist(gray_img,gray_img);
// detects faces in the frame
//CV_HAAR_SCALE_IMAGE to scale the size of the detect face
//CV_HAAR_DO_CANNY_PRUNING to increase speed as it skips image regions that are unlikely to contain a face
face_cascade.detectMultiScale(gray_img,faces,1.1,10,CV_HAAR_SCALE_IMAGE | CV_HAAR_DO_CANNY_PRUNING, Size(20,20),Size(300,300));
Mat Normalized;
//Loop over the detected faces
for(int i=0;i<faces.size();i++)
{
Rect face_i = faces[i];
Mat face = gray_img(face_i);
Mat face_resized;
//resize the detected face to the size of sample images
resize(face,face_resized, Size(im_width,im_height),1.0,1.0,INTER_CUBIC);
// predict the person the face belongs to, returns label
int predicted_label = -1;
predicted_label=model->predict(face_resized);
// Draws a rectangle around the faces
rectangle(cap_img,face_i, CV_RGB(0,255,0),1);
//text to be put with the face, by default "new" for new faces
string box_text=format("new");
// Change the text based on label
if(predicted_label>-1)
switch(predicted_label)
{
case 0:box_text = format("keanu");
break;
case 1:box_text = format("selena");
break;
case 2:box_text = format("shubham");
break;
}
// calculate the coordinates to put the text based on the postion of the face
int pos_x = max(face_i.tl().x - 10, 0);
int pos_y = max(face_i.tl().y - 10, 0);
// put text on the output screen
putText(cap_img, box_text , Point(pos_x,pos_y), FONT_HERSHEY_PLAIN,0.8, CV_RGB(0,255,0), 1,CV_AA);
if (box_text=="new")
{
oVideoWriter.write(cap_img); //writer the frame into the file
}
}
// show the frame on the result window
imshow("Press Esc to exit",cap_img);
if(waitKey(30)==27)
break;
}
返回0;
最佳答案
我遇到了同样的问题。答案 ( and code ) 在 Mastering OpenCV 的第 8 章中很棒的 Shervin Emami 的书。 Here's his blog post关于这个问题。
主要是对人脸做一些预处理,包括以下几个步骤
干杯。
关于c++ - 如何提高 EigenFaceRecognizer 的准确率,将两个人识别为一个人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31191177/
我使用的是linux的windows子系统,安装了ubuntu,bash运行流畅。 我正在尝试使用make,似乎bash 无法识别gcc。尝试将其添加到 PATH,但没有任何改变。奇怪的是 - cmd
ImageMagick 已正确安装。 WAMP 的“PHP 扩展”菜单也显示带有勾选的 php_imagick。除了 Apache 和系统环境变量外,phpinfo() 没有显示任何 imagick
我是这么想的,因为上限是 2^n,并且考虑到它们都是有限机,n 状态 NFA 和具有 2^n 或更少状态的 DFA 的交集将是有效。 我错了吗? 最佳答案 你是对的。 2^n 是一个上限,因此生成的
我有一个大型数据集,其中包含每日值,指示一年中的特定一天是否特别热(用 1 或 0 表示)。我的目标是识别 3 个或更多特别炎热的日子的序列,并创建一个包含每个日子的长度以及开始和结束日期的新数据集。
我有一个向量列表,每个向量看起来像这样 c("Japan", "USA", "country", "Japan", "source", "country", "UK", "source", "coun
是否有任何工具或方法可以识别静态定义数组中的缓冲区溢出(即 char[1234] 而不是 malloc(1234))? 昨天我花了大部分时间来追踪崩溃和奇怪的行为,最终证明是由以下行引起的: // e
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我想录下某人的声音,然后根据我获得的关于他/她声音的信息,如果那个人再次说话,我就能认出来!问题是我没有关于哪些统计数据(如频率)导致人声差异的信息,如果有人可以帮助我如何识别某人的声音? 在研究过程
我希望我的程序能够识别用户何时按下“enter”并继续循环播放。但是我不知道如何使程序识别“输入”。尝试了两种方法: string enter; string ent = "\n"; dice d1;
我创建了这个带有一个参数(文件名)的 Bash 小脚本,该脚本应该根据文件的扩展名做出响应: #!/bin/bash fileFormat=${1} if [[ ${fileFormat} =~ [F
我正在寻找一种在 for 循环内迭代时识别 subview 对象的方法,我基本上通过执行 cell.contentView.subviews 从 UITableView 的 contentView 获
我正在尝试在 Swift 中使用 CallKit 来识别调用者。 我正在寻找一种通过发出 URL 请求来识别调用者的方法。 例如:+1-234-45-241 给我打电话,我希望它向 mydomain.
我将(相当古老的)插件称为“thickbox”,如下所述: 创建厚盒时,它包含基于查询的内容列表。 使用 JavaScript 或 jQuery,我希望能够访问 type 的值(在上面的示例中 t
我想编写一些可以接受某种输入并将其识别为方波、三角波或某种波形的代码。我还需要一些产生所述波的方法。 我确实有使用 C/C++ 的经验,但是,我不确定我将如何模拟所有这些。最终,我想将其转换为微 Co
我创建了一个 for 循环,用于在每个部分显示 8 个项目,但我试图在循环中识别某些项目。例如,我想识别前两项,然后是第五项和第六项,但我的识别技术似乎是正确的。 for (int i = 0; i
如何识别 UIStoryboard? 该类具有创建和实例化的方法,但我没有看到带有类似name 的@property。例如 获取 Storyboard对象 + storyboardWithName:b
如何确定所运行的SQLServer2005的版本 要确定所运行的SQLServer2005的版本,请使用SQLServerManagementStudio连接到SQLServer2005,然后运行
这个问题在这里已经有了答案: How to check whether an object is a date? (26 个答案) 关闭2 年前。 我正在使用一个 npm 模块,它在错误时抛出一个空
我正在制作一个使用 ActivityRecognition API 在后台跟踪用户 Activity 的应用,如果用户在指定时间段(例如 1 小时)内停留在同一个地方,系统就会推送通知告诉用户去散步.
我是一名优秀的程序员,十分优秀!