从OpenCV 3.0 Beta开始,加入了大量的GPU加速计算的功能。6月份OpenCV 3.0 Gold发布,修复了大量的BUG。与2.4.x版本相比,3.0仍然采用CUDA作为GPU计算库,但废除了cv::gpu,转而使用cv::cuda命名空间。官网提供的预编译库并不包含完整的CUDA功能,所以要想体验GPU加速技术带给OpenCV的变化,只能自己重新编译整个库。
在CUDA Toolkit 7.5中,虽然给出了适用Win32和x64两种目标架构的库,但像cufft、npps、nvblas等OpenCV所需的库只有x64版本。于是这也限制了我们只能编译64位的OpenCV库,而且在今后的编程中也要编写针对x64架构的程序。另外,在GUI组件中,CUDA也调用了部分OpenGL功能,所以编译过程也需要OpenGL库的支持。下图中左边是CUDA为Win32提供的库,右边是为x64提供的库。
之前在编译OpenCV 2.4.x版本时,为了尽可能地提高计算速度,我用了Intel TBB来优化OpenCV库函数的多核计算性能,并用Eigen头文件库优化矩阵的计算,而且事实证明是可行并有效的。但在编译OpenCV 3.0 Gold的过程中,发现即使我引用了x64版本的TBB库文件,最后编译产生的OpenCV库在编程时还是会产生“应用程序无法正常启动0xc000007b”的错误。用Dependency Walk查看.lib文件也会发现几乎全部的组件都是“x64”,只有TBB一项是个突兀的“x86”。至于Eigen库,在编译过程中就产生了大量的错误。也许是我配置的方法不正确,也许目前的OpenCV库还不完善,总之我没有办法成功地将TBB包整合到OpenCV库中。
事实证明,OpenCV 3.1可以成功整合TBB,IPPICV和Eigen。配置和编译过程的变化在文中以黄色做出了标记。
由于需要调用显卡的部分功能,首先还要确认自己的显卡是否支持CUDA和OpenGL。可用的工具有GPU-Z和GPU Caps Viewer。右图中的“5.2”指的是最低兼容的CUDA版本。
关于CUDA 5.x和CUDA 7.5:首先,CUDA 5只支持到vs2010,而CUDA 7.5是支持vs2012的。其次,从OpenCV部分头文件看来除了CUDA Toolkit外还调用了其他比较特殊的库,虽然对CUDA 7.5大部分功能没有太大影响,但这也导致部分CUDA功能是无法整合到OpenCV库中的。在这里有更详细的说明。最新版本的NVIDIA Nsight声称已经支持vs2015了,不过我还没有试验过,无从知晓CUDA 7.5对vs2015的支持程度。
当然,不使用CUDA而直接配置预编译OpenCV 3.0库的方法本文也有介绍,在这里。在Visual Studio中把Win32项目转换为x64项目的过程在这里。配置OpenCV 2.4.x的过程可以参考《Windows7+VS2010下OpenCV环境配置》。
先给出我的系统环境和会用到的所有库和工具:
Windows 7 x64,Visual Studio Ultimate 2012,CPU是Intel Core i5 4590,显卡是NVIDIA GeForce GTX 960。
OpenCV 3.0 Gold 下载地址:http://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.0.0/opencv-3.0.0.exe/download
OpenCV 3.1 下载地址:http://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.1.0/opencv-3.1.0.exe/download
CMAKE 3.4.0 rc1 下载地址:https://cmake.org/files/v3.4/cmake-3.4.0-rc1-win32-x86.exe
CMAKE 3.5.0 rc3 下载地址:https://cmake.org/files/v3.5/cmake-3.5.0-win32-x86.msi
CUDA Toolkit 7.5.18 下载地址:http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_windows.exe
TBB 4.4 Update 3 下载地址:https://www.threadingbuildingblocks.org/sites/default/files/software_releases/windows/tbb44_20160128oss_win_0.zip
Eigen 3.2.8 下载地址:http://bitbucket.org/eigen/eigen/get/3.2.8.zip
OpenGL 4.5 关于OpenGL 4编译和配置的详细过程,可以参考《Windows7+VS2012下OpenGL 4的环境配置》,只是在CMAKE中第一次点击Configure后要选择“Visual Studio 11 2012 Win64”作为Generator;编译好之后在配置环境时选择x64路径下的lib目录。
1.下载CMAKE和CUDA Toolkit并安装。
安装过程这里就不赘述了。需要注意的是,CMAKE的安装路径可以随意指定,CUDA Toolkit库本身的路径推荐用默认的C:\Program Files\NVIDIA GPU Computing Toolkit,不要修改;不过CUDA Samples的路径最好设为C盘以外的分区,比如F:\_Projects\CUDA Samples。因为在编译CUDA样例的过程中,可能会由于管理权限的原因编译器不能在样例目录内修改和写入文件,造成编译的失败。
CUDA Toolkit安装过程中会自动在Visual Studio安装NSIGHT插件。如果之前安装过较老版本的CUDA Toolkit,则会被自动卸载掉,并用7.5版本将其代替。安装程序也会自动在系统环境变量内修改“PATH”,添加“CUDA_INC_PATH”、“CUDA_LIB_PATH”、“CUDA_PATH”等值,所以我们不必过多担心CUDA的环境配置。
如果想验证CUDA是否配置正确,可以尝试编译任意一个CUDA自带的样例程序。这里以deviceQuery为例。
在CUDA Samples\1_Utilities\deviceQuery路径下找到deviceQuery_vs2012.sln项目文件,并用VS2012打开。我的路径是F:\_Projects\CUDA Samples\1_Utilities\deviceQuery。
打开之后,右击项目名称,点击Build。注意在Debug和Release两种模式下分别编译。
编译成功后,运行cmd.exe,切换到CUDA Samples\bin\win64\Debug目录,运行deviceQuery.exe,看能否通过测试。
再切换到CUDA Samples\bin\win64\Release目录,运行deviceQuery.exe,看能否通过测试。
在前面所给的链接下载OpenCV 3.0,双击打开,选择解压路径。比如E:\dev-lib。程序会自动在E:\dev-lib下建立名为opencv的文件夹,并把所有的文件解压到E:\dev-lib\opencv内。为了与OpenCV 2.4.x版本区分开,我把这个文件夹的名称改为了E:\dev-lib\opencv3。
解压完成后,在E:\dev-lib\opencv3里有两个名为build和sources的文件夹,其中build是预编译库,sources包含OpenCV的源代码。我们就是利用sources文件夹里的源码进行编译。如果不打算使用CUDA组件而只需要常用的模块,可以直接使用预编译库来进行开发环境的配置。但OpenCV 3.0只提供了用于vs2012和vs2013的预编译库,如果你的Visual Studio是这两个版本以外的,仍然需要自己编译。如果决定继续使用CUDA,则可以跳过这一部分,直接看第3步。在使用的过程中也会发现预编译库把很多模块合并到了两个文件中,但如果是自己编译,仍然会产生像之前版本那样很多个文件。
直接使用OpenCV 3.0预编译库配置开发环境的步骤如下:
打开开始菜单,右击计算机,点击属性,在弹出的窗口里依次点击高级系统设置->高级->环境变量,双击名为path的用户环境变量,如果没有这一项,则点击新建建立一个名为path的变量。
在变量值的末尾添加:
E:\dev-lib\opencv3\build\x86\vc11\bin
点击确定保存环境变量。打开cmd.exe,输入
set path=c
强制更新系统变量,以使刚刚的修改生效。
重新打开cmd.exe,输入
echo %path%
检查环境变量的修改是否生效。
注销并重新登录Windows,重启电脑等都可以更新环境变量。不过值得注意的是每次修改环境变量后,都需要重新打开Visual Studio才能对vs生效。
打开vs2012,新建一个Visual C++的Win32 Console项目,我这里命名为“ocv-test-vc11”。
点击OK,再点击Next,勾选Empty Project,点击Finish。
在左边Solution Explorer中右击项目名称,点击Properties。顶端的Configuration选择Debug,在属性窗口里选择Configuration Properties -> VC++ Directories,在右边的Include Directories里添加
E:\dev-lib\opencv3\build\include
在Library Directories里添加
E:\dev-lib\opencv3\build\x86\vc11\lib
在左边选择Linker -> Input,在右边的Additional Dependencies里添加
opencv_ts300d.lib opencv_world300d.lib
点击应用,以保存更改。把顶端的Configuraion改为Release,在左边选择Configuration Properties -> VC++ Directories,在右边的Include Directories里添加
E:\dev-lib\opencv3\build\include
在Library Directories里添加
E:\dev-lib\opencv3\build\x86\vc11\lib
在左边选择Linker -> Input,在右边的Additional Dependencies里添加
opencv_ts300.lib opencv_world300.lib
点击确定,以保存修改并关闭窗口。
在左边的Solution Explorer中右击Source Files -> Add -> New Item,新建一个cpp代码文件。
我这里命名为ocv-test-vc11.cpp。
把下面的代码拷贝到ocv-test-vc11.cpp中。
#include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char **argv) { const char* filename = "G:\\Datasets\\img\\skull.jpg"; Mat srcImg = imread(filename, CV_LOAD_IMAGE_COLOR); if(srcImg.empty()) return -1; // imshow("source", srcImg); Mat tmp1Img(srcImg.size(),CV_8UC1); Mat tmp3Img(srcImg.size(),CV_8UC3); cvtColor(srcImg,tmp1Img,CV_RGB2GRAY); cvtColor(tmp1Img,tmp3Img,CV_GRAY2RGB); Mat dstImg(srcImg.size(), CV_8UC3); double blender; for(int i=0; i<100; i++) { blender = (double)i/100.0; addWeighted(srcImg,1-blender,tmp3Img,blender,0,dstImg); imshow("result",dstImg); waitKey(20); } cout << "Done!" << endl; waitKey(0); return 0; }
第10行是输入图片的路径,可以自己随意修改,但要注意路径中的分隔符“\”要换成“\\”。
如果打算编写64位的程序,则需要把环境变量和库路径里的“x86”换成“x64”。然后如图打开Configuration Manager。
在弹出的窗口里,打开Active Solution Platform下的下拉菜单,点击<New…>,在Type or select the new platform里选择x64,Copy settings from保持Win32不变,点击OK。
编译项目之前如果需要切换到Release,还要在Configuration Manager中按下图更改Configuration。
我使用的输入图像为skull.jpg
程序运行结果为
打开CMAKE。点击Browse source,选择OpenCV的源码路径,我的是E:/dev-lib/opencv3/sources。点击Browse Build,选择编译结果的保存位置,我的是F:/_Projects/opencv3。
点击Configure,在弹出的窗口中选择“Visual Studio 11 2012 Win64”,然后点击Finish。
如果在下面输出区域里没有出现红色的错误信息,而且最后一行是“Configuring done”,就可以进行下一步了。
勾选WITH_TBB,WITH_IPP,WITH_EIGEN。由于OpenCV源码没有附带FFMPEG和IPPICV的完整文件,需要在生成的过程中自动下载,有时速度会很慢。我提供了这两个库的完整文件,以节约时间:http://pan.baidu.com/s/1bcQoR8。解压后只需要将ffmpeg和ippicv两个文件夹覆盖opencv\sources\3rdparty中相应的文件夹即可。TBB解压的目录为E:\dev-lib\tbb,Eigen解压的目录为E:\dev-lib\Eigen。TBB和Eigen的路径设置如下:
TBB_INCLUDE_DIRS E:/dev-lib/tbb/include
TBB_LIB_DIR E:/dev-lib/tbb/lib/intel64/vc11
EIGEN_INCLUDE_PATH E:/dev-lib/Eigen
可能需要单独设置TBB_STDDEF_PATH为E:/dev-lib/tbb/include/tbb/tbb_stddef.h。
需要注意的是,E:\dev-lib\Eigen目录内还有一个单独的名为Eigen的文件夹,在这个E:\dev-lib\Eigen\Eigen文件夹内,包含所有的Eigen头文件。
在上面的区域里选择编译所要包含的组件。由于之前提到的原因,WITH_TBB不能勾选。虽然默认勾选了WITH_EIGEN,但EIGEN_INCLUDE_PATH不需要指定,在编译过程中仍然会忽略Eigen。WITH_NVCUVID这一项也不能勾选,因为在OpenCV目录下的sources\modules\cudacodec\src\precomp.hpp文件有这样一行(第7行)
#ifdef HAVE_NVCUVID #include <nvcuvid.h> #ifdef WIN32 #define NOMINMAX #include <windows.h> #include <NVEncoderAPI.h> #else #include <pthread.h> #include <unistd.h> #endif
除了NVCUVID库之外,这里调用了独立的NVENC SDK。NVCUVID与NVENC SDK共同构成了NVIDIA video codec SDK,其中NVCUVID库是包含在CUDA Toolkit中的,而NVENC SDK是一个独立的SDK,而且对显卡的架构要求比较严格,较常见的GeForce系列显卡即使支持但性能也是受限的。总之在我的机器上只有NVCUVID,却没有NVENC SDK。考虑到OpenCV是把NVCUVID和NVENC SDK一同调用的,所以只好全部抛弃。对我们的影响只在于不能用显卡进行视频的解码与编码,其实用OpenCV默认的在CPU端的ffmpeg库也可以满足大部分快速编码解码的需求。
总之,我们需要勾选的是WITH_TBB、WITH_IPP、WITH_EIGEN、WITH_CUBLAS、WITH_CUDA、WITH_CUFFT和WITH_OPENGL,其中WITH_EIGEN、WITH_CUDA和WITH_CUFFT是默认开启的。
再次点击Configure。如果没有红色错误信息产生,点击Generate,生成项目文件。如果下方输出区域最后两行是“Configuring done”和“Generating done”,就可以进行下一步的编译了。
4.用Visual Studio编译OpenCV
用Visual Studio 2012打开刚才生成的vs项目文件,比如我的是F:\_Projects\opencv3\OpenCV.sln。程序会花一些时间载入所有所需的文件。如果还安装了Visual Assist之类的插件,初始化时间还会延长更多。
首先在Debug模式下,右击ZERO_CHECK项目,点击Build;再切换到Release模式下,右击ZERO_CHECK项目,点击Build。看两次编译是否产生错误。如果两次编译成功,则进行下一步。
在Debug模式下,右击INSTALL项目,点击Build,整个编译过程就开始了,这大概需要两个小时的时间。
由于编译过程非常耗时,所以在编译之前检查所有的设置是否正确是很有必要的。我在这里列了一个表格,用来参考是否所有的步骤都正确完成了。
CUDA | 系统环境变量PATH,CUDA_INC_PATH,CUDA_LIB_PATH |
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64中包含cublas cuda cufft nppc nppi npps | |
OpenGL |
|
CMAKE | 勾选WITH_CUBLAS,WITH_CUDA,WITH_CUFFT,WITH_OPENGL,WITH_TBB,WITH_IPP,WITH_EIGEN |
没有勾选 |
|
|
|
TBB_INCLUDE_DIRS为E:/dev-lib/tbb/include,TBB_LIB_DIR为E:/dev-lib/tbb/lib/intel64/vc11 | |
VS2012 | 目标平台为x64 |
编译完成后,切换到Release模式,右击INSTALL项目,点击Build。这次编译同样也需要两个小时左右的时间。如果编译过程中产生了错误,可以把错误信息贴在在下面的评论区。如果两次都成功了,把install文件夹(我的是F:\_Projects\opencv3\install)里的内容复制到一个更方便的路径。比如我在E:\dev-lib\opencv3下新建了一个名为“with-cuda”的文件夹,并把install里的etc,include,x64三个文件夹拷贝了进去。接着就可以开始测试我们编译的OpenCV库了。
5.测试程序
按照第2步中的过程修改环境变量,只不过环境变量值要用
E:\dev-lib\opencv3\with-cuda\x64\vc11\bin
按照第2步中的过程新建一个vs2012项目,并修改为x64架构。比如我的项目名称为“ocv3-test”。项目属性的VC++ Directories中的Include Directories和Library Directories要修改为
E:\dev-lib\opencv3\with-cuda\include
E:\dev-lib\opencv3\with-cuda\x64\vc11\lib
Linker -> Input中的Additional Dependencies要修改为
(Debug)
opencv_calib3d300d.lib opencv_core300d.lib opencv_cudaarithm300d.lib opencv_cudabgsegm300d.lib opencv_cudacodec300d.lib opencv_cudafeatures2d300d.lib opencv_cudafilters300d.lib opencv_cudaimgproc300d.lib opencv_cudalegacy300d.lib opencv_cudaobjdetect300d.lib opencv_cudaoptflow300d.lib opencv_cudastereo300d.lib opencv_cudawarping300d.lib opencv_cudev300d.lib opencv_features2d300d.lib opencv_flann300d.lib opencv_hal300d.lib opencv_highgui300d.lib opencv_imgcodecs300d.lib opencv_imgproc300d.lib opencv_ml300d.lib opencv_objdetect300d.lib opencv_photo300d.lib opencv_shape300d.lib opencv_stitching300d.lib opencv_superres300d.lib opencv_ts300d.lib opencv_video300d.lib opencv_videoio300d.lib opencv_videostab300d.lib
(Release)
opencv_calib3d300.lib opencv_core300.lib opencv_cudaarithm300.lib opencv_cudabgsegm300.lib opencv_cudacodec300.lib opencv_cudafeatures2d300.lib opencv_cudafilters300.lib opencv_cudaimgproc300.lib opencv_cudalegacy300.lib opencv_cudaobjdetect300.lib opencv_cudaoptflow300.lib opencv_cudastereo300.lib opencv_cudawarping300.lib opencv_cudev300.lib opencv_features2d300.lib opencv_flann300.lib opencv_hal300.lib opencv_highgui300.lib opencv_imgcodecs300.lib opencv_imgproc300.lib opencv_ml300.lib opencv_objdetect300.lib opencv_photo300.lib opencv_shape300.lib opencv_stitching300.lib opencv_superres300.lib opencv_ts300.lib opencv_video300.lib opencv_videoio300.lib opencv_videostab300.lib
测试代码如下
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/cudaarithm.hpp> #include <opencv2/cudafilters.hpp> int main (int argc, char* argv[]) { try { cv::Mat src_host = cv::imread("G:\\Datasets\\img\\skull.jpg", CV_LOAD_IMAGE_GRAYSCALE); cv::cuda::GpuMat dst, src; src.upload(src_host); cv::cuda::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY); // cv::Mat result_host(dst); cv::Mat result_host; dst.download(result_host); cv::imshow("Result", result_host); cv::waitKey(); } catch(const cv::Exception& ex) { std::cout << "Error: " << ex.what() << std::endl; } std::cin.get(); return 0; }
我仍然使用第2步中的skull.jpg图像,程序运行的结果为
在代码第16行的注释其实是给出了另一种将数据从GpuMat传递到Mat的方式。很多OpenCV库函数既有CPU版又有CUDA版的,这段代码也反映了本地与GPU之间数据传递的最常用的方式。
把数据从cv::Mat传递到cv::cuda::GpuMat
cv::Mat src_host; cv::cuda::GpuMat src; src.upload(src_host);
把数据从cv::cuda::GpuMat传递到cv::Mat
cv::cuda::GpuMat dst; cv::Mat result_host(dst);
或
cv::cuda::GpuMat dst; cv::Mat result_host; dst.download(result_host);
我编译的整合了CUDA和OpenGL的OpenCV库在这里可以下载,但是我不能保证在相似的环境下也能使用。
http://pan.baidu.com/s/1qW3lF2G
2016.10.27更新:
OpenCV 3.1.0版本所需的ffmpeg和ippicv库文件在这里下载:http://pan.baidu.com/s/1miFF5os。
2016.01.05更新:
OpenCV 3.1.0版本用本文方法也能够编译成功。不过在最后测试步骤中,除了要把所有*.lib文件名中的“300”改为“310”之外,还要注意OpenCV 3.1.0版本的lib比3.0.0版本少了一个“opencv_hal300”。
整合了CUDA和OpenGL的OpenCV 3.1.0库在这里下载:http://pan.baidu.com/s/1kTVu8M7。
如果发现在调试的时候弹出一个小黑框长时间没有反应,可以把Debug Type从默认的“Auto”改为“GPU Only”。
2016.03.15更新:
更新了OpenCV 3.1整合TBB,IPPICV,Eigen的步骤。修改了OpenGL环境需求的错误。
[…] 在这个DigitRecognizer包含了大部分核心代码。如果想使用SVM,注释掉134-135行,并取消132-133行的注释,这样运行时就要先读入训练数据并训练SVM,然后从摄像头读入图像,并对图像中央区域的数字进行分类。由于SVM训练过程计算量比较大,特别是移动平台上缺少多线程等优化时性能更是直线下降。推荐不更改代码,直接读取我训练好的SVM分类器。预训练的分类器文件在这里下载:http://pan.baidu.com/s/1nuS3M9F,下载好后拷贝到手机SD卡根目录。如果想要自己训练SVM,推荐在电脑上进行训练,然后把训练好的分类器文件提供给Android应用使用。训练SVM的C++代码在这里。在Windows平台式配置OpenCV开发环境的方法可以参考《Windows7+VS2012下64位OpenCV3.0+CUDA7.5的编译和部署》。我实验的结果是,迭代训练500次,精度74%,远不能达到实际运用的要求,至少比胡乱猜准一些-_- […]
请教大神再cmake成功后,尝试编译opencv-core时出现
opencv_cudev_main.obj : error LNK2001: 无法解析的外部符号 “__declspec(dllimport) bool cv::__termination” (__imp_?__termination@cv@@3_NA)
E:\opencvtt3\bin\Debug\opencv_cudev344d.dll : fatal error LNK1120: 1 个无法解析的外部命令
错误,时因为编译时候环境变量不对吗?是在属性里边更改ma? 新手求详细解答
从这个错误信息还是不好判断根本原因出在哪里,这个错误其实也是某个深层错误的结果。你能在输出信息里搜一下“fatal”或“error”,看有没有类似找不到某个文件的那种错误?
在确认一切配置都是正确的之后,我将OpenCV版本从3.4.4更换到3.4.6,这个错误再没有出现。
你好 我按照你的方法来编译在vs2015中出现了这样的错误
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2610 “std::tuple<cv::Size,perf::
anonymous-namespace'::MatDepth>::tuple(const std::tuple<cv::Size,perf::
anonymous-namespace’::MatDepth> &)”: 不是可默认为的特殊成员函数 (编译源文件 D:\opencv3.4\opencv\sources\modules\cudaarithm\perf\perf_element_operations.cpp) opencv_perf_cudaarithm D:\visual studio\VC\include\tuple 607错误 C2610 “std::tuple<cv::Size,perf::
anonymous-namespace'::MatDepth>::tuple(std::tuple<cv::Size,perf::
anonymous-namespace’::MatDepth> &&)”: 不是可默认为的特殊成员函数 (编译源文件 D:\opencv3.4\opencv\sources\modules\cudaarithm\perf\perf_element_operations.cpp)错误 C2535 “std::tuple<cv::Size,perf::
anonymous-namespace'::MatDepth,perf::
anonymous-namespace’::MatCn> &std::tuple<cv::Size,perf::anonymous-namespace'::MatDepth,perf::
anonymous-namespace’::MatCn>::operator =(const std::tuple<cv::Size,perf::anonymous-namespace'::MatDepth,perf::
anonymous-namespace’::MatCn> &)”: 已经定义或声明成员函数 (编译源文件 D:\opencv3.4\opencv\sources\modules\cudaarithm\perf\perf_core.cpp) opencv_perf_cudaarithm D:\visual studio\VC\include\tuple 756错误 C2382 “std::tuple<cv::Size,perf::
anonymous-namespace'::MatDepth,perf::
anonymous-namespace’::MatCn>::operator =”: 重定义;不同的异常规范 (编译源文件 D:\opencv3.4\opencv\sources\modules\cudaarithm\perf\perf_core.cpp) opencv_perf_cudaarithm D:\opencv3.4\opencv\sources\modules\ts\include\opencv2\ts\cuda_perf.hpp 73不知道怎么解决呀 求大神帮一下忙
与cuda相关的performance test的编译很容易出现这个问题,在CMAKE中取消选择test/performance相关的模块,再生成编译就能解决:https://github.com/opencv/opencv/issues/6716#issuecomment-255434337
您好,我是vs2012cuda7.5opencv2411,cmake没有问题,但是编译中出现了
错误 1 error MSB6006: “cmd.exe”已退出,代码为 1。 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets 172
错误 3 error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_core2411d.lib” D:\2411\1\modules\imgproc\LINK
这样的错误一共200多个,类型都是这两种,请问可能是什么原因造成的呢?应该怎么解决?
非常感谢!
在output窗口中出现的第一个错误就是 LNK1104: 无法打开文件“..\..\lib\Debug\opencv_core2411d.lib”吗?建议在output的开始搜索“error”,看一下第一个出现的错误是什么。如果第一个错误就是这个LNK1104的话,重新编译一次它的输出信息有可能就会有变化。
第一个出现的错误是MSB6006: “cmd.exe”已退出,代码为 1。 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets 172,请问这个可能是什么原因造成的呢?
你用cmake生成项目时选择的vs版本和编译时用的vs版本是否一致呢?
可以看一下C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets这个文件第172行写的是什么,我现在用的机器上没装vs2012。
172行是 <CustomBuild
Sources ="@(CustomBuild)"
BuildSuffix ="$(_BuildSuffix)"
TrackerLogDirectory ="%(CustomBuild.TrackerLogDirectory)"
MinimalRebuildFromTracking ="%(CustomBuild.MinimalRebuildFromTracking)"
TLogReadFiles ="@(CustomBuildTLogReadFiles)"
TLogWriteFiles ="@(CustomBuildTLogWriteFiles)"
TrackFileAccess ="$(TrackFileAccess)"
ToolArchitecture ="$(CustomBuildToolArchitecture)"
TrackerFrameworkPath ="$(CustomBuildTrackerFrameworkPath)"
TrackerSdkPath ="$(CustomBuildTrackerSdkPath)"
AcceptableNonZeroExitCodes ="%(CustomBuild.AcceptableNonZeroExitCodes)"
>
</CustomBuild>
</Target>
是开始编译以后很快就出现的报错。
麻烦您了!
谢谢您了,我的问题已经解决了,在用cmake编译的时候需要手动将cuda_generation选择到自己的GPU所对应的版本,我选择的是kepler,这样重新编译生成的工程就没有以前出现的问题了,还是非常感谢您!
您好,请问按照您的步骤编译,出现了错误 1 error MSB6006: “cmd.exe”已退出,代码为 1。 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets 172
错误 2 error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_core2411d.lib” D:\2411\3\modules\flann\LINK
等类似于这样的问题,请问问题可能是出在哪里了呢?
是编译opencv过程中产生的还是编译好之后运行测试代码产生的这个错误?
如果是编译opencv时产生的,很有可能是某一个第三方库的路径不正确;如果是测试代码产生的,就要仔细检查一下你安装的opencv版本与linker->input里面输入的lib文件是否一致并且这个lib文件也确实存在于opencv目录中。
是在编译过程中出现的,除了找不到lib还有MSB6006这样的错误。第三方库我添加的是cuda、tbb和opencv,还是没有变化,请问还需要添加其他库吗?
好像跟这个问题是 一样的 .
http://answers.opencv.org/question/122286/vs-2013-cannot-open-include-file-tbbtbbh-no-such-file-or-directory/
居然碰到了一个奇葩的问题.
zero_check 通过, CUDA PASS.
但最后编译的时候,最后报了一个 错误
44957 error C1083: 锟睫凤拷锟津开帮拷锟斤拷锟侥硷拷:锟斤拷tbb/tbb.h锟斤拷: No such file or directory E:\2\opencv\sources\modules\core\include\opencv2\core\private.hpp 63
找不到tbb.h. 实际上 ctrl + shift + G 是可以导航过去的..
建议把 BUILD_opencv_world 给打勾√.
这样编译出来就像 hj_opencv_world320.dll
把所有的dll集中在一个dll和一个lib中.
对的,用默认配置编译时,所有模块放到world里的确很方便。但模块比较多,尤其是包含extra modules时,个人还是习惯分开来,需要哪个就链接哪个。
大神有木有研究过 64位的exe 调用32位的DLL.
我看到的一些建议是在64位的应用中另外建立一个32位的进程,用这个32位的进程来调用32位的DLL,然后把处理的结果传递给64位的主进程。我没有具体实施过,相必也是需要一定工作量的。
如果你们项目需要CUDA来加速,最好将现有的函数库针对x64重新编译。如果目标平台只支持x86,那也只好放弃高版本的CUDA,改用比较老的版本,比如6.5。
谢谢, 那我用6.5编译32位试试.
编译CUDA版本的OPENCV , Eigen 是不是必须的?
不客气。Eigen只是为了加速一些代数运算,并不是必须加入的依赖项。
為何我勾選了WITH_TBB後需要輸入的路徑有四個,而且名稱跟版主的不太一樣
TBB_ENV_INCLUDE
TBB_ENV_LIB
TBB_ENV_LIB_DEBUG
TBB_VER_FILE
附圖 http://imgur.com/a/fb6wA
我事先設定成這樣然後DEBUG不設定
這樣在編譯時會出錯
你好!这四项要分别对应于:
TBB_ENV_INCLUDE : tbb2017_20161128oss/include
TBB_ENV_LIB : tbb2017_20161128oss/lib/intel64/vc14/tbb.lib
TBB_ENV_LIB_DEBUG : tbb2017_20161128oss/lib/intel64/vc14/tbb_debug.lib
TBB_VER_FILE : tbb2017_20161128oss/include/tbb/tbb_stddef.h
感謝版大,這樣設定真的就可以了
另外請問版大有試過使用TBB跟OpenMP哪一種的速度比較快嗎?
博主你好,我用camke3.4.3编译vs2013+opencv3.1+cuda7.5+tbb+Eigen,最后成功生成43个lib,10个lib失败,整体编译完出现opencv_core已在该环境外被修改,失败的10个我单独编译也都不行,
opencv_cudafeatures2d310d.lib
opencv_cudaimgproc310d.lib
opencv_cudalegacy310d.lib
opencv_cudaobjdetect310d.lib
opencv_cudaoptflow310d.lib
opencv_photo310d.lib
opencv_stitching310d.lib
opencv_superres310d.lib
opencv_videostab310d.lib
opencv_xphoto310d.lib
错误列表信息类似于这样: error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_cudaimgproc310d.lib”
我在输出里发现 1 error detected in the compilation of "C:/Users/HZWZM_~1/AppData/Local/Temp/tmpxft_00002f34_00000000-12_gftt.cpp4.ii".
我cmake不同版本也试过都不行,错误在网上找了半天也没发现解决办法,这应该是哪里的步骤错了?
你好,由于opencv某些模块相互依赖关系很强,一个模块编译失败就会造成大多数其他模块的编译失败。
无法打开文件“..\..\lib\Debug\opencv_cudaimgproc310d.lib”这个错误就是由于GPU版本的imgproc模块本身编译失败引起的。最有可能的原因是CUDA的环境或者Eigen库的路径没有配置正确。
请找一下在编译所有模块时,第一个出现的错误是什么(在output窗口中搜索“fatal error”),那里的错误信息会反映最根本的原因。
CUDA的环境应该没有设置错,因为cuda的例子跑过没问题,而且大部分有关cuda的lib是成功的,只有那少数几个(相互关联)的失败;Eigen库的路径也没问题,编译的时候显示出
8> — Use IPP Async: NO
8> — Use Eigen: YES (ver 3.2.8)
8> — Use Cuda: YES (ver 7.5)
8> — Use OpenCL: YES
8> — Use custom HAL: NO
第一个fatal error就是 105>LINK : fatal error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_cudafeatures2d310d.lib”
最近两个版本的opencv(包括3.2)在启用OpenCL编译test模块时也容易出现问题,我不知道你这里是否如此。
在输出信息里面搜索“error”,看能不能找到带有“perf_test”的错误信息。如果有的话,在CMAKE中取消勾选“BUILD_TESTS”和“BUILD_PERF_TESTS”然后再生成编译就可以避免这个问题。
我cmake都成功了,但是numDevice = cuda::getCudaEnabledDeviceCount();numDevice=0;
请教下楼主是什么问题啊?
这个意思是没找到支持CUDA的硬件。可以用GPU Caps Viewer看一下你的显卡支持的最低CUDA版本
测试编译和zero编译都成功了,但是在编译install的时候貌似全部文件都提示c4819错误,还有一些别的错误已经懒得找了~
opencv+tbb+cuda最新版,eign直接被忽略了没有参与编译,ant指定的是ant文件(不带扩展名),matlab是2015b,jdk是最新版的
应该是Eigen目录不正确引起的。第一个出现的错误是最关键的,之后的错误其实都是由于依赖关系连带产生的。
如果Eigen的Core文件位于E:\dev-lib\Eigen\Eigen\Core,那么在CMAKE中配置的时候EIGEN_INCLUDE_PATH就要填E:\dev-lib\Eigen,因为opencv源码中是以Eigen\Core的形式对其进行引用的。
最后感谢博主的分享!
warning : field of class type without a DLL interface used in a class with a DLL interface
请问这个是什么原因啊
请教楼主问题,我用的是opencv3.1,请问出现下面问题该如何处理 错误 1 error C2061: 语法错误: 标识符&l… 阅读更多 »
看着好像是CUDA库的支持出了问题,你的CUDA已经正确安装并且编译样例验证过了吗?
请问您的问题解决了么
博主在文章中说“OpenCV 3.0只提供了用于vs2012和vs2013的预编译库,如果你的Visual Studio是这两个版本以外的,仍然需要自己编译。”是什么意思?
opencv提供的预编译库有哪些?如果版本是VS2010是否需要自己编译?自己编译工作量大吗?
抱歉回复的比较晚。因为opencv的每个版本的发行版或多或少都会根据当前开发工具的流行程度来确定预编译库支持的vs版本。只要打开opencv\build\x86或opencv\build\x64就能看到给出的所有支持的vs版本。vc10=vs2010,vc11=vs2012,vc12=vs2013,vc14=vs2015。按照文中的方法,如果只编译CPU版本的话,一个小时之内就能完成。
编译时报错,望博主指点
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 7.5.targets(160,9): error MSB4062: 未能从程序集 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\Nvda.Build.CudaTasks.v7.5.dll 加载任务“Nvda.Build.CudaTasks.SanitizePaths”。未能加载文件或程序集“Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。 请确认 <UsingTask> 声明正确,该程序集及其所有依赖项都可用,并且该任务包含实现 Microsoft.Build.Framework.ITask 的公共类。
我之前已经编译好了,今天修改了一点东西想重新编译一次的,发现也出现了这样的错误,请问你是怎么解决的?如能指教,不胜感激
opencv换成3.0版本的就可以了。
你好我配置完后运行例子出现
这是什么问题?
>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: 命令“setlocal
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: "E:\Program Files (x86)\cmake\bin\cmake.exe" -DBUILD_TYPE=Debug -P cmake_install.cmake
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: :cmEnd
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: :cmErrorLevel
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: exit /b %1
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: :cmDone
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd
87>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: :VCEnd”已退出,代码为 1。
========== 生成: 成功 10 个,失败 77 个,最新 1 个,跳过 0 个 ==========
重新安装OPENCV就可以了。
出现的第一个error是什么呢?