Compressive Tracking C++ 代码Visual Studio2013 调试错误大全

来源:互联网 发布:简单的c语言程序文件 编辑:程序博客网 时间:2024/06/06 11:40

之前学习了Kaihua Zhang 的compressive tracking,其Matlab和C++/C#代码在主页http://www4.comp.polyu.edu.hk/~cslzhang/CT/CT.htm 上面都可以下载到。


Matlab代码基本上可以直接运行。不过C++代码由于VS和OPENCV的版本不同,造成库有些不同,而且存在一些默认的配置路径的问题,在调试时会出现各种错误。本博客收集了调试该代码时出现的所有错误,可以供后来学习compressive tracking的同学予以参考。


(本博客系原创,转载请注明出处:http://blog.csdn.net/xuexiyanjiusheng/article/details/46877275)


由已有的cpp和h文件重新建立工程调试。


(1)error C2664: “FindFirstFileW”: 不能将参数 1 从“char [261]”转换为“LPCWSTR” 

在写Tracking的代码的时候遇到这样的问题: error C2664: “FindFirstFileW”: 不能将参数 1 从“char [261]”转换为“LPCWSTR”。
这个代码是读入一个文件夹里面所有的图片的文件名。因为在TLD,CT算法里面都是会遇到的。会遇到这样的错误。

解决的方式是:选中项目属性——>配置属性——>常规——>字符集,就字符集选为“使用多字节字符集"即可编译通过。



(2)无法查找或打开 PDB 文件
调试-选项和设置--勾上启用源服务器支持;调试-符号-勾微软符号服务器



(3)strcpy(conf,"./config.txt");这句这里出现 未找到strcat.asm 错误
发现好像拷别人工程里面的cpp和h文件过来有大问题,在网上查了半天,原来是因为编译的时候在调试信息中保存的源文件路径和你的安装路径不一致(也不太可能一致)。确认你的VS源文件路径就可以了。然后看到它原来的路径(显示的字体是灰色的)为f:\dd\vctools\crt\crtw32\string\i386\strcat.asm,很明显这是原作者配置的,后来重新加载,找到了在E:\Software\computer\Visual Studio\VC\crt\src\intel 里面

(PS:这是在单步调试main函数那里前面几句就出现的错误。最开始还不知道要用单步调试的时候,是直接在release下调试的,结果编译都是对的,但是工程整个会出现以下的错误0x00983488 处有未经处理的异常(在 CompressiveTracking.exe 中):  0xC0000005:  读取位置 0x00000000 时发生访问冲突 )



(4)后来又出现 vector subscript out of range,崩溃了,然后回去找错误发现前面的 box {x=73 y=-858993460 width=-858993460 ...} 那里错了,此时执行到了这一步readConfig(conf,imgFilePath,box) 转到readConfig的定义处,是
void readConfig(char* configFileName, char* imgFilePath, Rect &box)
{
int x;
int y;
int w;
int h;

fstream f;
char cstring[1000];
int readS=0;

f.open(configFileName, fstream::in);

char param1[200]; strcpy(param1,"");
char param2[200]; strcpy(param2,"");
char param3[200]; strcpy(param3,"");

f.getline(cstring, sizeof(cstring));
readS=sscanf (cstring, "%s %s %s", param1,param2, param3);

strcpy(imgFilePath,param3);

f.getline(cstring, sizeof(cstring)); 
f.getline(cstring, sizeof(cstring)); 
f.getline(cstring, sizeof(cstring));

readS=sscanf (cstring, "%s %s %i %i %i %i", param1,param2, &x, &y, &w, &h);

box = Rect(x, y, w, h);
}

而那个config文件是这样的
directory = .\data

%bb = x y width height the following is for david sequence
bb = 73,126,29,23

想了想,最开始的bb是73 126 29 23的形式,我是烤了benchmark的anno里面的信息过来有逗号,然后把逗号去了,就好了box{x=73 y=126 width=29 ...}



(5)想了想,最开始还出现了未申明的标识符MAX_PATH、WIN32_FIND_DATA、FindFirstFile这样的错误,那个MAX_PATH我是查了一下,改成了_MAX_PATH,后面的感觉是有库没有引用,在搜到FindFirstFile的百度百科的时候,找到了一个这样的例子,感觉是少了windows.h,include了一下,就好了

#include<stdio.h> 
#include<windows.h> 
intmain() 

WIN32_FIND_DATAp; 
HANDLEh=FindFirstFile("e:\\test\\*.c",&p); 
puts(p.cFileName); 
while(FindNextFile(h,&p)) 
puts(p.cFileName); 
return0; 
}



(6)error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information.

看到网上说要得到exe能在别的计算机上面运行,需要  项目属性-配置属性-常规-MFC的使用-在静态库中使用MFC

项目属性-配置属性-C/C++-代码生成-运行库-MTD/MT (注意!!!!debug必须是MTD,带有D,而用release时,是MT 错乱会出现这个错误Unhandled exception at 0x7476C41F in CompressiveTracking.exe: Microsoft C++ exception: cv::Exception at memory location 0x0041BD40.)


(后来发现“代码生成-运行库-MTD/MT”直接在项目属性那里改,会发生错误,于是索性将运行库那里改成了“从父级或项目默认设置继承”,而在属性管理器那里,debug和release的运行库那里各自是各自的MTD/MT)

然后在http://www.microsoft.com/zh-cn/download/details.aspx?id=40770上面下载了一个vc_mbcsmfc.exe安装。


0 0
原创粉丝点击