先说明下应用的上下文环境:
vs2012 c++
我有个工程需要用到SRC(Sparse Representation Classification),所以使用了KL1P库。
因为要做图像处理,所以使用了opencv库,我用opencv的Hog特征提取出了上面问题。
关于这个问题,
stackoverflow里边给出了个1个解答,是库目录设置错了,因为vs2012需要使用的是opencv里边的vc11目录里边的库,但是2012这个名字很容易让我们误以为要使用vc12,混用lib,dll的错误可是很大的哦!
我看了一下,还真用错了。
不过我改过来了之后还是会报这个错误,又有另一个解答如下:
这个我改不了啊,因为用了KL1P库,所以运行库模式只能设置成MTD,要不会报错的。
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] << " "; } }