Распознавание лиц OpenCV
Я пытаюсь использовать opencv для распознавания лиц на статическом изображении, сравнивая его с базой данных изображений и печатая прогноз в текстовый файл. Это код, который я собрал, но получаю много ошибок. Буду очень признателен за любую помощь, если я ошибся.
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
using namespace cv;
using namespace std;
static Mat norm_0_255(InputArray _src) {
Mat src = _src.getMat();
// Create and return normalized image:
Mat dst;
switch(src.channels()) {
case 1:
cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
break;
case 3:
cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
break;
default:
src.copyTo(dst);
break;
}
return dst;
}
static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {
std::ifstream file(filename.c_str(), ifstream::in);
if (!file) {
string error_message = "No valid input file was given, please check the given filename.";
CV_Error(CV_StsBadArg, error_message);
}
string line, path, classlabel;
while (getline(file, line)) {
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if(!path.empty() && !classlabel.empty()) {
images.push_back(imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
}
}
//path to csv
string fn_csv = ("./at.csv");
//patch to haar cascade
string fn_haar = ("./haarcascade_frontalface_alt.xml");
// These vectors hold the images and corresponding labels.
vector<Mat> images;
vector<int> labels;
read_csv(fn_csv, images, labels);
int im_width = images[0].cols;
int im_height = images[0].rows;
Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
//cv::createEigenFaceRecognizer(10);
//create the model
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
model->train(images, labels);
//load cascade
CascadeClassifier haar_cascade;
haar_cascade.load(fn_haar);
Mat Image
for(;;) {
Mat Image* img = cvLoadImage ("./Lena.png")
Mat gray;
cvtColor(original, gray, CV_BGR2GRAY);
// Find the face
vector< Rect_<int> > faces;
haar_cascade.detectMultiScale(gray, faces);
vector< Rect_<int> > faces;
haar_cascade.detectMultiScale(gray, faces);
for(int i = 0; i < faces.size(); i++) {
// Process face
Rect face_i = faces[i];
// Crop the face from the image.
Mat face = gray(face_i);
Mat face_resized;
cv::resize(face, face_resized, Size(im_width, im_height), 1.0, 1.0, INTER_CUBIC);
// prediction
int prediction = model->predict(face_resized);
string text = format("Prediction = %d", prediction);
}
}
int send () {
std::string s= text;
std::ofstream os("prediction.txt");
if (!os) { std::cerr<<"Error writing to prediction"<<std::endl; } else {
os << s;
}
return 0;
}
1 ответ
Ваш код завершен? Существует множество небрежных ошибок, которые можно легко исправить, просто прочитав сообщения об ошибках.
- нет функции main()
- пропущенные точки с запятой 83 и 85
та же строка 85:
Mat Image* img = cvLoadImage ("./Lena.png");
должно быть
Image = imread("./Lena.png");
cvLoadImage() - это C (возвращая
IplImage*
), а не C++. (Хотя я не понимаю, почему вы загружаете одно и то же изображение снова и снова в бесконечном цикле.)original
Первая линия 88 не определеналинии 90-94 - это в два раза больше
не определено
text
переменная строка 113 в функции send(), вероятно, одна строка 107, которую вы должны передать в качестве параметра.