Sep*_*our 1 opencv image-processing type-conversion char visual-studio-2010
很抱歉提出这样一个初学者问题,但我对 openCV 和 VC++2010 真的很陌生。我在网上搜索了答案,但没有得到合适的答案。
搭建OReilly-LearningOpenCV书的第一个项目“First Program-Display a Picture”,遇到了这些错误:
1-error C2664: 'cvLoadImage' : cannot convert parameter 1 from '_TCHAR *' to 'const char *'
2-IntelliSense: argument of type "_TCHAR *" is incompatible with parameter of type "const char *"
Run Code Online (Sandbox Code Playgroud)
这是代码:
#include "stdafx.h"
#include "opencv\highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{ IplImage* img = cvLoadImage( argv[1] );
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
cvShowImage( "Example1", img );
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( "Example1" );
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我从 Microsoft Visual Studio 2010 收到的消息:
1>------ Build started: Project: FirstProgram_DisplayAPicture3, Configuration: Debug x64 ------
1>Build started 7/6/2013 11:13:00 AM.
1>InitializeBuildStatus:
1> Touching "x64\Debug\FirstProgram_DisplayAPicture3.unsuccessfulbuild".
1>ClCompile:
1> All outputs are up-to-date.
1> FirstProgram_DisplayAPicture3.cpp
1>FirstProgram_DisplayAPicture3.cpp(9): error C2664: 'cvLoadImage' : cannot convert parameter 1 from '_TCHAR *' to 'const char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.68
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)
可能需要的其他信息:
我制作了一个 win32 控制台应用程序,并且在向导的第二页中我选择了预编译头设置。
我已将项目的平台更改为 x64,因为我使用的是 win7x64 作为操作系统。
我已将 openCV 库正确链接到我的项目。
我刚刚引入了 highgui.lib 作为附加依赖项
任何帮助,将不胜感激。
我该怎么做才能解决这两个错误?
编辑部分:
请注意,这些错误发生在第 6 行,我的意思是 IplImage* img = cvLoadImage( argv[1]);
我根据 Roger Rowland 的建议编辑的部分:
根据 Roger Rowland 所说,我将项目的 Character Set 属性更改为 Not Set。上面提到的两个错误得到了解决,但这些错误又出现了。
错误 LNK1120:1 个未解析的外部
错误 LNK2019:未解析的外部符号 cvReleaseImage 在函数 main 中引用
我该如何解决问题?
您的项目配置为 Unicode,这意味着_TCHAR宏计算结果为wchar_t,这是 Windows 上的 16 位 UTF-16 数据类型。但是您正在调用的库接受 8 位char数据。
因此,您需要使接口的两侧匹配。有很多方法可以做到这一点。显而易见的选择是:
在我看来,_TCHAR这些天使用起来不必要地复杂。当我们需要从单个代码库支持 Win9x(不支持 Unicode)和 WinNT(支持 Unicode)时,这很有用。但是我希望现在您的目标是基于 NT 的系统,因此您可以安全地假设对 Unicode 的支持。在这种情况下,你可以使用wchar_t,wstring等等。
另一方面,也许这只是一个供您个人使用的简单程序。在这种情况下,由于您的库需要 8 位字符,因此针对 ANSI 可能是最简单的方法。
但无论哪种方式,我宁愿怀疑_TCHAR这只会让你感到困惑。如果我是你,我会放弃。
最后一点是您提到您的目标是 x64,因为您的系统是 64 位。请注意,64 位系统可以完美地运行 32 位代码。如果您希望您的程序能够在 32 位系统上运行,并且您没有迫切需要在 64 位系统下运行,那么以 x86 为目标可能会更容易。
您对问题的编辑提出了一个单独的问题,尽管我有所保留,但我仍会尝试回答。
在解析的外部符号错误指示链接器无法解析特定的符号。为了让链接器解析它,需要传递定义该符号的 .lib 文件。您应该仔细检查您是否在其他依赖项中包含了所有必需的 .lib 文件。据我所知,OpenCV 有多个 .lib 文件,您可能错过了定义 .lib 的文件cvReleaseImage。