2 xiao9377 xiao9377 于 2016.03.18 13:00 提问

用vs2015和opencv做人脸识别时碰到LNK2019的错误

错误如下:
图片说明

不是链接器的问题,应该是代码的问题,但我对c++和vs还不太熟悉。请哪位大神告知。代码如下:
#include "stdafx.h"
#include
#include
#include "opencv2/core.hpp"
#include "opencv2/face.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
//#include
#include
#include
#include

using namespace cv;
using namespace cv::face;
using namespace std;

static Mat norm_0_255(InputArray _src) {
Mat src = _src.getMat();
// 创建和返回一个归一化后的图像矩阵:
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;
}
//使用CSV文件去读图像和标签,主要使用stringstream和getline方法
static void read_csv(const string& filename, vector& images, vector& 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(Error::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()));
}
}
}

int main() {
// 检测合法的命令,显示用法
// 如果没有参数输入则退出!.

string output_folder;
output_folder = string("D:\\Documents\\faceData\\output");

//读取你的CSV文件路径.
string fn_csv = string("D:\\Documents\\faceData\\ORL\\at.txt");
// 2个容器来存放图像数据和对应的标签
vector<Mat> images;
vector<int> labels;
// 读取数据. 如果文件不合法就会出错
// 输入的文件名已经有了.
try {
    read_csv(fn_csv, images, labels);
}
catch (cv::Exception& e) {
    cerr << "Error opening file " << fn_csv << ". Reason: " << e.msg << endl;
    // 文件有问题,我们啥也做不了了,退出了
    exit(1);
}
// 如果没有读取到足够图片,我们也得退出.
if (images.size() <= 1) {
    string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
    CV_Error(Error::StsError, error_message);
}
// 得到第一张照片的高度. 在下面对图像
// 变形到他们原始大小时需要
int height = images[0].rows;
// 下面的几行代码仅仅是从你的数据集中移除最后一张图片
//[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题]
Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
images.pop_back();
labels.pop_back();
// 下面几行创建了一个特征脸模型用于人脸识别,
// 通过CSV文件读取的图像和标签训练它。
// T这里是一个完整的PCA变换
//如果你只想保留10个主成分,使用如下代码
      //cv::createEigenFaceRecognizer(10);
//
// 如果你还希望使用置信度阈值来初始化,使用以下语句:
//      cv::createEigenFaceRecognizer(10, 123.0);
//
// 如果你使用所有特征并且使用一个阈值,使用以下语句:
//      cv::createEigenFaceRecognizer(0, 123.0);
//
Ptr<BasicFaceRecognizer> model = createEigenFaceRecognizer();
model->train(images, labels);
// 下面对测试图像进行预测,predictedLabel是预测标签结果
int predictedLabel = model->predict(testSample);
//
// 还有一种调用方式,可以获取结果同时得到阈值:
//      int predictedLabel = -1;
//      double confidence = 0.0;
//      model->predict(testSample, predictedLabel, confidence);
//
string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
cout << result_message << endl;
// 这里是如何获取特征脸模型的特征值的例子,使用了getMat方法:
Mat eigenvalues = model->getEigenValues();
// 同样可以获取特征向量:
Mat W = model->getEigenVectors();
// 得到训练图像的均值向量
Mat mean = model->getMean();
// 显示还是保存:

imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));

imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));

// 显示还是保存特征脸:
for (int i = 0; i < min(10, W.cols); i++) {
    string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i));
    cout << msg << endl;
    // 得到第 #i个特征
    Mat ev = W.col(i).clone();
    //把它变成原始大小,为了把数据显示归一化到0~255.
    Mat grayscale = norm_0_255(ev.reshape(1, height));
    // 使用伪彩色来显示结果,为了更好的感受.
    Mat cgrayscale;
    applyColorMap(grayscale, cgrayscale, COLORMAP_JET);
    // 显示或者保存:

    imshow(format("eigenface_%d", i), cgrayscale);

    imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));

}
// 在一些预测过程中,显示还是保存重建后的图像:
for (int num_components = 10; num_components <300; num_components += 15) {
    // 从模型中的特征向量截取一部分
    Mat evs = Mat(W, Range::all(), Range(0, num_components));
    Mat projection = LDA::subspaceProject(evs, mean, images[0].reshape(1, 1));
    Mat reconstruction = LDA::subspaceReconstruct(evs, mean, projection);
    // 归一化结果,为了显示:
    reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
    // 显示或者保存:

    imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);

    imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);

}
// 如果我们不是存放到文件中,就显示他,这里使用了暂定等待键盘输入:

waitKey(0);

return 0;

}

3个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.18 13:13

这种情况一般都是函数只找到声明但没有实现,或者是少了什么链接库

xiao9377
xiao9377   2016.03.18 14:41

我把opencv3.1换成2.4.12就没有这个问题。具体也不知道为什么。

diudiu5
diudiu5   2016.04.24 23:21

opencv3的链接库即使配置好了也经常出问题,建议先用2.4.9学习研究。等3的版本稳定了,别人把问题解决方法总结的差不多了,再使用。这样学习事半功倍

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!