_pFirstBlock == pHead错误

_pFirstBlock == pHead错误_第1张图片

先说明下应用的上下文环境:

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)

尴尬这个我改不了啊,因为用了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啦。






你可能感兴趣的:(_pFirstBlock == pHead错误)