版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianjian1992/article/details/49247003
先说明下应用的上下文环境:
vs2012 c++
我有个工程需要用到SRC(Sparse Representation Classification),所以使用了KL1P库。
因为要做图像处理,所以使用了opencv库,我用opencv的Hog特征提取出了上面问题。
关于这个问题,
1.库目录设置错误
stackoverflow里边给出了个1个解答,是库目录设置错了,因为vs2012需要使用的是opencv里边的vc11目录里边的库,但是2012这个名字很容易让我们误以为要使用vc12,混用lib,dll的错误可是很大的哦!
我看了一下,还真用错了。
不过我改过来了之后还是会报这个错误,又有另一个解答如下:
2.代码生成模式
CSDN里的解答如下:
debug版下:属性--配置属性--C/C++--代码生成--运行库:
Multi-threaded Debug DLL (/MDd)
Multi-threaded Debug DLL (/MDd)
这个我改不了啊,因为用了KL1P库,所以运行库模式只能设置成MTD,要不会报错的。
3.我的调试过程
如此一来,我只能慢慢找原因,并且规避一下了。
先进行断点调试,我定位错误在hog特征提取这里。
我设计了一个HoGExtract类,
这个类里边有一个HOGDescriptor *hog私有成员变量,
错误发生在这个类的
void extractHoGFeature(Mat &img,int partSeq)成员函数里边。
按照断点调试一步步运行,错误发生在函数运行完最后一句返回的时候。
所以我便有了几个猜测:
1.因为错误很可能和opencv的lib错误有关,所以会不会是hog的问题呢?
2.错误发生在函数运行结束时,那会不会是descriptorsFloat以及descriptors出了问题呢?它们是在函数里边定义的局部变量,被保存到了最终的结果里边,所以出了问题。
void extractHoGFeature(Mat &img,int partSeq){
vector<float> descriptorsFloat;
Mat resizedImg;
resize(img, resizedImg, Size(32,32));
hog->compute(resizedImg, descriptorsFloat,Size(1,1), Size(0,0)); //调用计算函数开始计算
vector<double> descriptors;
for (vector<float>::size_type i = 0; i < descriptorsFloat.size(); i++)
{
descriptors.push_back((double)descriptorsFloat[i]);
}
switch (partSeq){
case 0:{
features_leye.push_back(descriptors);
}
break;
case 1:{
features_reye.push_back(descriptors);
}
break;
case 2:{
features_nose.push_back(descriptors);
}
break;
case 3:{
features_mouth.push_back(descriptors);
}
break;
case 4:{
features_face.push_back(descriptors);
}
}
}
首先从第一点出发,我把
hog->compute(resizedImg, descriptorsFloat,Size(1,1), Size(0,0)); //调用计算函数开始计算
给去掉,运行无错误!
在此基础上,我加上
descriptorsFloat.push_back(1.1);
descriptorsFloat.push_back(1.2);
descriptorsFloat.push_back(1.3);
几句,无错误!
如果从第二点出发,我用new进行定义
vector<double> *descriptors = new vector<double>;
错误依旧。
看来错误就是发生在hog的身上了!!!
我在main函数里边写了下面一小段代码测试hog。
HOGDescriptor *hog = new HOGDescriptor(cvSize(32,32),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
Mat img = imread("E:\\p1.jpg");
Mat resizedImg;
vector<float> descriptorsFloat;
resize(img, resizedImg, Size(32,32));
hog->compute(resizedImg, descriptorsFloat,Size(1,1), Size(0,0)); //调用计算函数开始计算
for (int i = 0; i < 10; i++)
{
cout << descriptorsFloat[i] << " ";
}
运行无误!可以正常输出,断点调试查看descriptorsFloat也可以看到它是正常的。
那错误是怎么回事呢?
我把上面这段代码放到一个函数里边,
void testHog()
{
HOGDescriptor *hog = new HOGDescriptor(cvSize(32,32),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
Mat img = imread("E:\\p1.jpg");
Mat resizedImg;
vector<float> descriptorsFloat;
resize(img, resizedImg, Size(32,32));
hog->compute(resizedImg, descriptorsFloat,Size(1,1), Size(0,0)); //调用计算函数开始计算
for (int i = 0; i < 10; i++)
{
cout << descriptorsFloat[i] << " ";
}
}
错误神奇的又出现了。
我决定新建个项目专门用来做特征提取,这样就不会和KL1P冲突了,模式也可以设置成MDd,这样就可以开心地用opencv提取Hog啦。