OpenCV文件编译及问题记录。
目前最新OpenCV官网发布最新版为3.4.0(2017年12月23日发布)。
OpenCV库使用方法
下载地址:https://github.com/opencv/opencv/releases/tag/3.4.0
或
https://sourceforge.net/projects/opencvlibrary/
法一:使用官方提供的已编译好的文件
优点:方便快捷
缺点:版本限制
选择opencv-3.4.0-vc14_vc15.exe,下载完成后可以直接打开解压,即可在自己的项目中直接使用。
具体步骤为:
配置环境变量
打开电脑右键属性-高级系统设置-环境变量,Path中新增:E:\opencv\build\x64\vc14\bin,(此处为解压对应目录)。
引入相应头文件、库文件、链接库
打开自己的工程,右键属性-配置属性-VC++目录-包含目录,新增:
E:\opencv\build\include\opencv
E:\opencv\build\include\opencv2
E:\opencv\build\include
库目录,新增:
E:\opencv\build\x64\vc14\lib
(注意修改为你解压对应的目录)。
链接器-输入-附加依赖项,新增:
opencv_world340d.lib
点击确定即可。
至此所有准备工作就绪,可以愉快地编译自己的工程啦。
但想如此一劳永逸解决问题,需符合以下特点:你的VS版本是VC14(2015)或VC15(2017)。
另附几种对应关系:
Microsoft Visual Studio 6.0: VC6.0
Microsoft Visual Studio 2002: VC7.0
Microsoft Visual Studio 2003: VC7.1
Microsoft Visual Studio 2005: VC8.0
Microsoft Visual Studio 2008: VC9.0
Microsoft Visual Studio 2010: VC10.0
Microsoft Visual Studio 2012: VC11.0
Microsoft Visual Studio 2013: VC12.0
Microsoft Visual Studio 2014: VC13.0
Microsoft Visual Studio 2015: VC14.0
Microsoft Visual studio 2017: VC15.0
由于我使用VS2013,因此无法使用该方法。(当然,可以自行下载VS2015的运行库)。
我使用法二。
法二:自行编译
下载源码Source code并解压
下载CMake
下载地址:https://cmake.org/download/
选择相应操作系统版本,例如我选择Windows win64-x64 Installer。安装,打开bin\cmake-gui.exe。
使用CMake
在Where is the source code中选择OpenCV解压目录,如:E:/opencv-3.4.0/opencv-3.4.0。
一般可以在解压目录下新建一个build文件夹,用来存放编译生成的文件。
于是,在Where to build the binaries中填入该路径,如:E:/opencv-3.4.0/opencv-3.4.0/build。(也可自行选择路径)
点击Configure,选择所需环境,如:Visual Studio 12 2013。进入漫长的等待。
如果区域有红色出现,需再次点击Configure,直到全部变成白色。
第一次Configure后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 General configuration for OpenCV 3.4.0 ===================================== Version control: unknown Platform: Timestamp: 2018-01-29T14:29:24Z Host: Windows 10.0.16299 AMD64 CMake: 3.10.2 CMake generator: Visual Studio 12 2013 CMake build tool: C:/Program Files (x86)/MSBuild/12.0/bin/MSBuild.exe MSVC: 1800 CPU/HW features: Baseline: SSE SSE2 requested: SSE2 Dispatched code generation: SSE4_1 SSE4_2 FP16 AVX requested: SSE4_1 SSE4_2 AVX FP16 AVX2 SSE4_1 (3 files): + SSE3 SSSE3 SSE4_1 SSE4_2 (1 files): + SSE3 SSSE3 SSE4_1 POPCNT SSE4_2 FP16 (2 files): + SSE3 SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX AVX (5 files): + SSE3 SSSE3 SSE4_1 POPCNT SSE4_2 AVX C/C++: Built as dynamic libs?: YES C++11: YES C++ Compiler: C:/software/vs2013/VC/bin/cl.exe (ver 18.0.21005.1) C++ flags (Release): /DWIN32 /D_WINDOWS /W4 /GR /EHa /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi /fp:fast /arch:SSE /arch:SSE2 /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /MP12 /MD /O2 /Ob2 /DNDEBUG /Zi C++ flags (Debug): /DWIN32 /D_WINDOWS /W4 /GR /EHa /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi /fp:fast /arch:SSE /arch:SSE2 /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /MP12 /MDd /Zi /Ob0 /Od /RTC1 C Compiler: C:/software/vs2013/VC/bin/cl.exe C flags (Release): /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi /fp:fast /arch:SSE /arch:SSE2 /MP12 /MD /O2 /Ob2 /DNDEBUG /Zi C flags (Debug): /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi /fp:fast /arch:SSE /arch:SSE2 /MP12 /MDd /Zi /Ob0 /Od /RTC1 Linker flags (Release): /machine:X86 /INCREMENTAL:NO /debug Linker flags (Debug): /machine:X86 /debug /INCREMENTAL ccache: NO Precompiled headers: YES Extra dependencies: 3rdparty dependencies: OpenCV modules: To be built: calib3d core dnn features2d flann highgui imgcodecs imgproc ml objdetect photo python_bindings_generator shape stitching superres ts video videoio videostab Disabled: js world Disabled by dependency: - Unavailable: cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 python3 viz Applications: tests perf_tests apps Documentation: NO Non-free algorithms: NO Windows RT support: NO GUI: Win32 UI: YES VTK support: NO Media I/O: ZLib: build (ver 1.2.11) JPEG: build (ver 90) WEBP: build (ver encoder: 0x020e) PNG: build (ver 1.6.34) TIFF: build (ver 42 - 4.0.9) JPEG 2000: build (ver 1.900.1) OpenEXR: build (ver 1.7.1) Video I/O: Video for Windows: YES DC1394: NO FFMPEG: NO avcodec: NO avformat: NO avutil: NO swscale: NO avresample: NO GStreamer: NO DirectShow: YES Parallel framework: Concurrency Trace: YES (with Intel ITT) Other third-party libraries: Lapack: NO Eigen: NO Custom HAL: NO NVIDIA CUDA: NO OpenCL: YES (no extra features) Include path: E:/opencv-3.4.0/opencv-3.4.0/3rdparty/include/opencl/1.2 Link libraries: Dynamic load Python (for build): NO Java: ant: NO JNI: NO Java wrappers: NO Java tests: NO Matlab: NO Install to: E:/opencv-3.4.0/opencv-3.4.0/build/install ----------------------------------------------------------------- Configuring done
此时可能出现常见问题:
1 2 3 4 5 6 7 8 9 10 11 FFMPEG: Download: opencv_ffmpeg.dll CMake Warning at cmake/OpenCVDownload.cmake:190 (message): FFMPEG: Download failed: 28;"Timeout was reached" FFMPEG: Download: opencv_ffmpeg_64.dll CMake Warning at cmake/OpenCVDownload.cmake:190 (message): FFMPEG: Download failed: 28;"Timeout was reached" IPPICV: Download: ippicv_2017u3_win_ia32_general_20170822.zip CMake Warning at cmake/OpenCVDownload.cmake:190 (message): IPPICV: Download failed: 28;"Timeout was reached"
总之就是有文件下载不成功。根据CMake的提示,打开build下的CMakeDownloadLog.txt,上面写着:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 use_cache "E:/opencv-3.4.0/opencv-3.4.0/.cache" do_copy "opencv_ffmpeg.dll" "3ae76b105113d944984b2351c61e21c6" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/66b1fed06cf3510235f367f96aa26da5cb234a15/ffmpeg/opencv_ffmpeg.dll" "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg" #missing "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg/opencv_ffmpeg.dll" #check_md5 "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/3ae76b105113d944984b2351c61e21c6-opencv_ffmpeg.dll" #mismatch_md5 "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/3ae76b105113d944984b2351c61e21c6-opencv_ffmpeg.dll" "299b46e2c4cf8047b0ef420c9a61c6ef" #delete "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/3ae76b105113d944984b2351c61e21c6-opencv_ffmpeg.dll" #cmake_download "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/3ae76b105113d944984b2351c61e21c6-opencv_ffmpeg.dll" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/66b1fed06cf3510235f367f96aa26da5cb234a15/ffmpeg/opencv_ffmpeg.dll" do_copy "opencv_ffmpeg_64.dll" "cf3bb5bc9d393b022ea7a42eb63e794d" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/66b1fed06cf3510235f367f96aa26da5cb234a15/ffmpeg/opencv_ffmpeg_64.dll" "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg" #missing "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg/opencv_ffmpeg_64.dll" #check_md5 "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/cf3bb5bc9d393b022ea7a42eb63e794d-opencv_ffmpeg_64.dll" #mismatch_md5 "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/cf3bb5bc9d393b022ea7a42eb63e794d-opencv_ffmpeg_64.dll" "3ab964d23e60d2b961737a8bb556bd45" #delete "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/cf3bb5bc9d393b022ea7a42eb63e794d-opencv_ffmpeg_64.dll" #cmake_download "E:/opencv-3.4.0/opencv-3.4.0/.cache/ffmpeg/cf3bb5bc9d393b022ea7a42eb63e794d-opencv_ffmpeg_64.dll" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/66b1fed06cf3510235f367f96aa26da5cb234a15/ffmpeg/opencv_ffmpeg_64.dll" do_copy "ffmpeg_version.cmake" "ec59008da403fb18ab3c1ed66aed583b" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/66b1fed06cf3510235f367f96aa26da5cb234a15/ffmpeg/ffmpeg_version.cmake" "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg" #check_md5 "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg/ffmpeg_version.cmake" #match_md5 "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg/ffmpeg_version.cmake" "ec59008da403fb18ab3c1ed66aed583b" do_unpack "ippicv_2017u3_win_ia32_general_20170822.zip" "8a7680ae352c192de2e2e34936164bd0" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/dfe3162c237af211e98b8960018b564bc209261d/ippicv/ippicv_2017u3_win_ia32_general_20170822.zip" "E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ippicv" #check_md5 "E:/opencv-3.4.0/opencv-3.4.0/.cache/ippicv/8a7680ae352c192de2e2e34936164bd0-ippicv_2017u3_win_ia32_general_20170822.zip" #mismatch_md5 "E:/opencv-3.4.0/opencv-3.4.0/.cache/ippicv/8a7680ae352c192de2e2e34936164bd0-ippicv_2017u3_win_ia32_general_20170822.zip" "c7fcfb626b50daa8bd728b7598328455" #delete "E:/opencv-3.4.0/opencv-3.4.0/.cache/ippicv/8a7680ae352c192de2e2e34936164bd0-ippicv_2017u3_win_ia32_general_20170822.zip" #cmake_download "E:/opencv-3.4.0/opencv-3.4.0/.cache/ippicv/8a7680ae352c192de2e2e34936164bd0-ippicv_2017u3_win_ia32_general_20170822.zip" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/dfe3162c237af211e98b8960018b564bc209261d/ippicv/ippicv_2017u3_win_ia32_general_20170822.zip"
可以看到文本中记录了下载链接,于是在浏览器中复制上述链接,自行下载好这几个文件到文本指向的路径中。
比如:我缺的三个文件是:
opencv_ffmpeg.dll,需放到:E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg。
下载链接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/66b1fed06cf3510235f367f96aa26da5cb234a15/ffmpeg/opencv_ffmpeg.dll
opencv_ffmpeg_64.dll,需放到:E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ffmpeg。
下载链接:
https://raw.githubusercontent.com/opencv/opencv_3rdparty/66b1fed06cf3510235f367f96aa26da5cb234a15/ffmpeg/opencv_ffmpeg_64.dll
ippicv_2017u3_win_ia32_general_20170822.zip,注意:需在压缩包前加上文件的hash值,即压缩名变为hash值-原名。提供一个在线查看哈希值的网站:http://www.atool.org/file_hash.php ,需要的是MD5 Hash。
需放到:E:/opencv-3.4.0/opencv-3.4.0/build/3rdparty/ippicv。(然而并没有生成ippicv文件夹)
下载链接:
https://raw.githubusercontent.com/opencv/opencv_3rdparty/dfe3162c237af211e98b8960018b564bc209261d/ippicv/ippicv_2017u3_win_ia32_general_20170822.zip
建议科学上网后下载,不然网速感人。
不过还是不匹配。
根据大佬提示,CMake3.10.2没有downloader.cmake,干脆……不要这三个文件了……
修改E:\opencv-3.4.0\opencv-3.4.0\3rdparty\ffmpeg中的ffmpeg.cmake,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 # Binary branch name: ffmpeg/master_20171009 # Binaries were created for OpenCV: 8ac2c5d620b467d3f22802e96c88ddde6da707af set(FFMPEG_BINARIES_COMMIT "66b1fed06cf3510235f367f96aa26da5cb234a15") set(FFMPEG_FILE_HASH_BIN32 "3ae76b105113d944984b2351c61e21c6") set(FFMPEG_FILE_HASH_BIN64 "cf3bb5bc9d393b022ea7a42eb63e794d") set(FFMPEG_FILE_HASH_CMAKE "ec59008da403fb18ab3c1ed66aed583b") function(download_win_ffmpeg script_var) set(${script_var} "" PARENT_SCOPE) # set(ids BIN32 BIN64 CMAKE) # set(name_BIN32 "opencv_ffmpeg.dll") # set(name_BIN64 "opencv_ffmpeg_64.dll") # set(name_CMAKE "ffmpeg_version.cmake") # set(FFMPEG_DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/3rdparty/ffmpeg") # set(status TRUE) # foreach(id ${ids}) # ocv_download(FILENAME ${name_${id}} # HASH ${FFMPEG_FILE_HASH_${id}} # URL # "$ENV{OPENCV_FFMPEG_URL}" # "${OPENCV_FFMPEG_URL}" # "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/" # DESTINATION_DIR ${FFMPEG_DOWNLOAD_DIR} # ID FFMPEG # RELATIVE_URL # STATUS res) # if(NOT res) # set(status FALSE) # endif() # endforeach() # if(status) # set(${script_var} "${FFMPEG_DOWNLOAD_DIR}/ffmpeg_version.cmake" PARENT_SCOPE) # endif() endfunction()
修改E:\opencv-3.4.0\opencv-3.4.0\3rdparty\ippicv中的ippicv.cmake,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 function(download_ippicv root_var) # set(${root_var} "" PARENT_SCOPE) # # Commit SHA in the opencv_3rdparty repo # set(IPPICV_COMMIT "dfe3162c237af211e98b8960018b564bc209261d") # # Define actual ICV versions # if(APPLE) # set(OPENCV_ICV_PLATFORM "macosx") # set(OPENCV_ICV_PACKAGE_SUBDIR "ippicv_mac") # if(X86_64) # set(OPENCV_ICV_NAME "ippicv_2017u3_mac_intel64_general_20170822.tgz") # set(OPENCV_ICV_HASH "c1ebb5dfa5b7f54b0c44e1917805a463") # else() # set(OPENCV_ICV_NAME "ippicv_2017u3_mac_ia32_general_20170822.tgz") # set(OPENCV_ICV_HASH "49b05a669042753ae75895a445ebd612") # endif() # elseif((UNIX AND NOT ANDROID) OR (UNIX AND ANDROID_ABI MATCHES "x86")) # set(OPENCV_ICV_PLATFORM "linux") # set(OPENCV_ICV_PACKAGE_SUBDIR "ippicv_lnx") # if(X86_64) # set(OPENCV_ICV_NAME "ippicv_2017u3_lnx_intel64_general_20170822.tgz") # set(OPENCV_ICV_HASH "4e0352ce96473837b1d671ce87f17359") # else() # set(OPENCV_ICV_NAME "ippicv_2017u3_lnx_ia32_general_20170822.tgz") # set(OPENCV_ICV_HASH "dcdb0ba4b123f240596db1840cd59a76") # endif() # elseif(WIN32 AND NOT ARM) # set(OPENCV_ICV_PLATFORM "windows") # set(OPENCV_ICV_PACKAGE_SUBDIR "ippicv_win") # if(X86_64) # set(OPENCV_ICV_NAME "ippicv_2017u3_win_intel64_general_20170822.zip") # set(OPENCV_ICV_HASH "0421e642bc7ad741a2236d3ec4190bdd") # else() # set(OPENCV_ICV_NAME "ippicv_2017u3_win_ia32_general_20170822.zip") # set(OPENCV_ICV_HASH "8a7680ae352c192de2e2e34936164bd0") # endif() # else() # return() # endif() # set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv") # ocv_download(FILENAME ${OPENCV_ICV_NAME} # HASH ${OPENCV_ICV_HASH} # URL # "${OPENCV_IPPICV_URL}" # "$ENV{OPENCV_IPPICV_URL}" # "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/" # DESTINATION_DIR "${THE_ROOT}" # ID IPPICV # STATUS res # UNPACK RELATIVE_URL) # if(res) # set(${root_var} "${THE_ROOT}/${OPENCV_ICV_PACKAGE_SUBDIR}" PARENT_SCOPE) # endif() endfunction()
再重新Configure两次,Generate一次,成功。
用VS2013编译
打开OpenCV.sln编译,debug-Win32调试器。
添加到所需工程
根据法一:
添加环境变量:
E:\opencv-3.4.0\opencv-3.4.0\build\install\x86\vc12\bin
VS包含目录:E:\opencv-3.4.0\opencv-3.4.0\build\install\include
E:\opencv-3.4.0\opencv-3.4.0\build\install\include\opencv
E:\opencv-3.4.0\opencv-3.4.0\build\install\include\opencv2
库目录:
E:\opencv-3.4.0\opencv-3.4.0\build\install\x86\vc12\lib
链接器:
opencv_calib3d340d.lib
opencv_core340d.lib
opencv_dnn340d.lib
opencv_features2d340d.lib
opencv_flann340d.lib
opencv_highgui340d.lib
opencv_imgcodecs340d.lib
opencv_imgproc340d.lib
opencv_ml340d.lib
opencv_objdetect340d.lib
opencv_photo340d.lib
opencv_shape340d.lib
opencv_stitching340d.lib
opencv_superres340d.lib
opencv_video340d.lib
opencv_videoio340d.lib
opencv_videostab340d.lib
测试
比较两张图片的不同之处。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <cv.h> #include <highgui.h> #include <stdio.h> int main() { IplImage *pSrc = cvLoadImage("1.jpg", 1); CvSize size = cvSize(600, 376);//区域大小 cvSetImageROI(pSrc, cvRect(0, 0, size.width, size.height));//设置源图像ROI IplImage* pDest1 = cvCreateImage(size, pSrc->depth, pSrc->nChannels);//创建目标图像 cvCopy(pSrc, pDest1); //复制图像 cvResetImageROI(pDest1);//源图像用完后,清空ROI cvSaveImage("Image_1.jpg", pDest1);//保存目标图像 cvSetImageROI(pSrc, cvRect(0, 393, size.width, size.height));//设置源图像ROI IplImage* pDest2 = cvCreateImage(size, pSrc->depth, pSrc->nChannels);//创建目标图像 cvCopy(pSrc, pDest2); //复制图像 cvResetImageROI(pDest2);//源图像用完后,清空ROI cvSaveImage("Image_2.jpg", pDest2);//保存目标图像 IplImage *dst; dst = cvCreateImage(cvGetSize(pDest1), pDest1->depth, pDest1->nChannels); cvAbsDiff(pDest1, pDest2, dst); cvNamedWindow("Compare_Images", 1); cvShowImage("Compare_Images", dst); cvWaitKey(); return 0; }
以上程序转自http://blog.csdn.net/cooelf/article/details/24663097
可成功编译和运行,到此,基础环境算是磕磕绊绊搭建好了。