Windows7+VS2012下64位OpenCV3.0+CUDA7.5的编译和部署

        从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两种目标架构的库,但像cufftnppsnvblas等OpenCV所需的库只有x64版本。于是这也限制了我们只能编译64位的OpenCV库,而且在今后的编程中也要编写针对x64架构的程序。另外,在GUI组件中,CUDA也调用了部分OpenGL功能,所以编译过程也需要OpenGL库的支持。下图中左边是CUDA为Win32提供的库,右边是为x64提供的库。

cuda-win32-64

        之前在编译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版本。

GPU-Caps-Viewer

        关于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。

cuda-device-query        打开之后,右击项目名称,点击Build。注意在DebugRelease两种模式下分别编译。

cuda-device-query-build        编译成功后,运行cmd.exe,切换到CUDA Samples\bin\win64\Debug目录,运行deviceQuery.exe,看能否通过测试。

cuda-device-query-debug

        再切换到CUDA Samples\bin\win64\Release目录,运行deviceQuery.exe,看能否通过测试。

cuda-device-query-release


        2.下载并解压OpenCV。

        在前面所给的链接下载OpenCV 3.0,双击打开,选择解压路径。比如E:\dev-lib。程序会自动在E:\dev-lib下建立名为opencv的文件夹,并把所有的文件解压到E:\dev-lib\opencv内。为了与OpenCV 2.4.x版本区分开,我把这个文件夹的名称改为了E:\dev-lib\opencv3

opencv-extraction        解压完成后,在E:\dev-lib\opencv3里有两个名为buildsources的文件夹,其中build是预编译库,sources包含OpenCV的源代码。我们就是利用sources文件夹里的源码进行编译。如果不打算使用CUDA组件而只需要常用的模块,可以直接使用预编译库来进行开发环境的配置。但OpenCV 3.0只提供了用于vs2012和vs2013的预编译库,如果你的Visual Studio是这两个版本以外的,仍然需要自己编译。如果决定继续使用CUDA,则可以跳过这一部分,直接看第3步。在使用的过程中也会发现预编译库把很多模块合并到了两个文件中,但如果是自己编译,仍然会产生像之前版本那样很多个文件。

        直接使用OpenCV 3.0预编译库配置开发环境的步骤如下:

        打开开始菜单,右击计算机,点击属性,在弹出的窗口里依次点击高级系统设置->高级->环境变量,双击名为path的用户环境变量,如果没有这一项,则点击新建建立一个名为path的变量。

pre-built-environment

        在变量值的末尾添加:

E:\dev-lib\opencv3\build\x86\vc11\bin

        点击确定保存环境变量。打开cmd.exe,输入

set path=c

强制更新系统变量,以使刚刚的修改生效。

cmd-set-path        重新打开cmd.exe,输入

echo %path%

检查环境变量的修改是否生效。

cmd-echo-path

       注销并重新登录Windows,重启电脑等都可以更新环境变量。不过值得注意的是每次修改环境变量后,都需要重新打开Visual Studio才能对vs生效。

       打开vs2012,新建一个Visual C++的Win32 Console项目,我这里命名为“ocv-test-vc11”。

pre-built-new-project       点击OK,再点击Next,勾选Empty Project,点击Finish

pre-built-new-project-2       在左边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

pre-built-new-project-5       在左边选择Linker -> Input,在右边的Additional Dependencies里添加

opencv_ts300d.lib
opencv_world300d.lib

pre-built-new-project-6       点击应用,以保存更改。把顶端的Configuraion改为Release,在左边选择Configuration Properties -> VC++ Directories,在右边的Include Directories里添加

E:\dev-lib\opencv3\build\include

       在Library Directories里添加

E:\dev-lib\opencv3\build\x86\vc11\lib

pre-built-new-project-7       在左边选择Linker -> Input,在右边的Additional Dependencies里添加

opencv_ts300.lib
opencv_world300.lib

pre-built-new-project-8

       点击确定,以保存修改并关闭窗口。

       在左边的Solution Explorer中右击Source Files -> Add -> New Item,新建一个cpp代码文件。

pre-built-new-project-3

       我这里命名为ocv-test-vc11.cpp。pre-built-new-project-4

       把下面的代码拷贝到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

pre-built-new-project-10       在弹出的窗口里,打开Active Solution Platform下的下拉菜单,点击<New…>,在Type or select the new platform里选择x64Copy settings from保持Win32不变,点击OK

pre-built-new-project-11

       编译项目之前如果需要切换到Release,还要在Configuration Manager中按下图更改Configuration

pre-built-new-project-12

       我使用的输入图像为skull.jpg

skull       程序运行结果为

pre-built-new-project-9


        3.使用CMAKE编译OpenCV。

        打开CMAKE。点击Browse source,选择OpenCV的源码路径,我的是E:/dev-lib/opencv3/sources。点击Browse Build,选择编译结果的保存位置,我的是F:/_Projects/opencv3。

        点击Configure,在弹出的窗口中选择“Visual Studio 11 2012 Win64”,然后点击Finish

cmake_generator        如果在下面输出区域里没有出现红色的错误信息,而且最后一行是“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_CUBLASWITH_CUDAWITH_CUFFTWITH_OPENGL,其中WITH_EIGEN、WITH_CUDAWITH_CUFFT是默认开启的。

cmake_configure

        再次点击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。看两次编译是否产生错误。如果两次编译成功,则进行下一步。

build-opencv        在Debug模式下,右击INSTALL项目,点击Build,整个编译过程就开始了,这大概需要两个小时的时间。

build-opencv-2

        由于编译过程非常耗时,所以在编译之前检查所有的设置是否正确是很有必要的。我在这里列了一个表格,用来参考是否所有的步骤都正确完成了。

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 环境变量PATH指向bin\x64  glew32.dll文件拷贝到C:\Windows\SysWOW64目录下
CMAKE 勾选WITH_CUBLAS,WITH_CUDA,WITH_CUFFT,WITH_OPENGL,WITH_TBB,WITH_IPP,WITH_EIGEN
  没有勾选WITH_TBB,WITH_NVCUVID
  EIGEN_INCLUDE_PATH为空  EIGEN_INCLUDE_PATH为E:/dev-lib/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库了。

build-opencv-3


        5.测试程序

        按照第2步中的过程修改环境变量,只不过环境变量值要用

E:\dev-lib\opencv3\with-cuda\x64\vc11\bin

        按照第2步中的过程新建一个vs2012项目,并修改为x64架构。比如我的项目名称为“ocv3-test”。项目属性的VC++ Directories中的Include DirectoriesLibrary 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图像,程序运行的结果为

build-opencv-4        在代码第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环境需求的错误。

把这篇文章分享给你的朋友:
Subscribe
订阅评论
guest
104 评论
最新
最旧 得票最多
Inline Feedbacks
View all comments
trackback
1 月 之前

[…]         在这个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%,远不能达到实际运用的要求,至少比胡乱猜准一些-_- […]

王小我
王小我
1 年 之前

请教大神再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? 新手求详细解答

Peanut
Reply to  王小我
1 年 之前

在确认一切配置都是正确的之后,我将OpenCV版本从3.4.4更换到3.4.6,这个错误再没有出现。

涛涛涛涛
涛涛涛涛
2 年 之前

你好 我按照你的方法来编译在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
不知道怎么解决呀 求大神帮一下忙

魏蔚
魏蔚
2 年 之前

您好,我是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多个,类型都是这两种,请问可能是什么原因造成的呢?应该怎么解决?

非常感谢!

魏蔚
魏蔚
Reply to  John Hany
2 年 之前

第一个出现的错误是MSB6006: “cmd.exe”已退出,代码为 1。 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets 172,请问这个可能是什么原因造成的呢?

魏蔚
魏蔚
Reply to  John Hany
2 年 之前

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>

是开始编译以后很快就出现的报错。

麻烦您了!

魏蔚
魏蔚
Reply to  John Hany
2 年 之前

谢谢您了,我的问题已经解决了,在用cmake编译的时候需要手动将cuda_generation选择到自己的GPU所对应的版本,我选择的是kepler,这样重新编译生成的工程就没有以前出现的问题了,还是非常感谢您!

moe
moe
2 年 之前

您好,请问按照您的步骤编译,出现了错误 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
等类似于这样的问题,请问问题可能是出在哪里了呢?

moe
moe
Reply to  John Hany
2 年 之前

是在编译过程中出现的,除了找不到lib还有MSB6006这样的错误。第三方库我添加的是cuda、tbb和opencv,还是没有变化,请问还需要添加其他库吗?

SamRichard
SamRichard
2 年 之前

居然碰到了一个奇葩的问题.

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 是可以导航过去的..

 

SamRichard
SamRichard
2 年 之前

建议把 BUILD_opencv_world 给打勾√. 

这样编译出来就像 hj_opencv_world320.dll 

把所有的dll集中在一个dll和一个lib中.

 

SamRichard
SamRichard
2 年 之前

大神有木有研究过 64位的exe 调用32位的DLL.

SamRichard
SamRichard
Reply to  John Hany
2 年 之前

谢谢, 那我用6.5编译32位试试. 

编译CUDA版本的OPENCV , Eigen 是不是必须的?

THINK
THINK
3 年 之前

為何我勾選了WITH_TBB後需要輸入的路徑有四個,而且名稱跟版主的不太一樣

TBB_ENV_INCLUDE     

TBB_ENV_LIB

TBB_ENV_LIB_DEBUG

TBB_VER_FILE

THINK
THINK
Reply to  THINK
3 年 之前

附圖 http://imgur.com/a/fb6wA

我事先設定成這樣然後DEBUG不設定

這樣在編譯時會出錯

THINK
THINK
Reply to  John Hany
3 年 之前

感謝版大,這樣設定真的就可以了

另外請問版大有試過使用TBB跟OpenMP哪一種的速度比較快嗎?

王周敏
3 年 之前

博主你好,我用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不同版本也试过都不行,错误在网上找了半天也没发现解决办法,这应该是哪里的步骤错了?

 

王周敏
Reply to  John Hany
3 年 之前

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”

李东
李东
Reply to  John Hany
3 年 之前

我cmake都成功了,但是numDevice = cuda::getCudaEnabledDeviceCount();numDevice=0;

请教下楼主是什么问题啊?

lsltx
lsltx
3 年 之前

测试编译和zero编译都成功了,但是在编译install的时候貌似全部文件都提示c4819错误,还有一些别的错误已经懒得找了~

opencv+tbb+cuda最新版,eign直接被忽略了没有参与编译,ant指定的是ant文件(不带扩展名),matlab是2015b,jdk是最新版的

Mei Dong
Mei Dong
3 年 之前

最后感谢博主的分享!

高诚壑
高诚壑
3 年 之前

warning : field of class type without a DLL interface used in a class with a DLL interface

请问这个是什么原因啊

朱灵灵
朱灵灵
3 年 之前

请教楼主问题,我用的是opencv3.1,请问出现下面问题该如何处理 错误    1    error C2061: 语法错误: 标识符&l… 阅读更多 »

幽灵
幽灵
Reply to  朱灵灵
3 年 之前

请问您的问题解决了么

辉耀
辉耀
3 年 之前

博主在文章中说“OpenCV 3.0只提供了用于vs2012和vs2013的预编译库,如果你的Visual Studio是这两个版本以外的,仍然需要自己编译。”是什么意思?

辉耀
辉耀
Reply to  辉耀
3 年 之前

opencv提供的预编译库有哪些?如果版本是VS2010是否需要自己编译?自己编译工作量大吗?

wang
wang
3 年 之前

编译时报错,望博主指点

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 的公共类。

ypaafw
ypaafw
Reply to  wang
3 年 之前

我之前已经编译好了,今天修改了一点东西想重新编译一次的,发现也出现了这样的错误,请问你是怎么解决的?如能指教,不胜感激

破肚
破肚
Reply to  ypaafw
3 年 之前

opencv换成3.0版本的就可以了。

破肚
破肚
3 年 之前
破肚
破肚
3 年 之前

你好我配置完后运行例子出现

这是什么问题?

破肚
破肚
3 年 之前

>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 个 ==========
 

破肚
破肚
Reply to  破肚
3 年 之前

重新安装OPENCV就可以了。