物拆解:庫(kù)文件命名、鏈接與避坑指南)
簡(jiǎn)介本資源面向在Windows平臺(tái)使用Visual Studio進(jìn)行OpenCV二次開(kāi)發(fā)與編譯的工程師及學(xué)習(xí)者提供opencv-4.4.0完整編譯產(chǎn)物與依賴(lài)文件解決離線編譯時(shí)第三方組件下載失敗、庫(kù)文件缺失等常見(jiàn)問(wèn)題。壓縮包共575個(gè)文件約156.61MB以434個(gè)hpp頭文件、55個(gè)h頭文件為主輔以xml配置、cmake腳本、dll動(dòng)態(tài)庫(kù)、lib靜態(tài)庫(kù)及少量exe工具涵蓋ippicv、ffmpeg、ade等依賴(lài)組件與OpenCVConfig系列cmake配置便于直接集成到VS2015的x64工程中。資源中已包含編譯過(guò)程中需聯(lián)網(wǎng)下載的ippicv_2020、opencv_videoio_ffmpeg、ade-0.1.1f、face_landmark_model.dat及ffmpeg_version.cmake等文件同時(shí)提供編譯生成的x64位dll與lib庫(kù)及配套頭文件可省去重復(fù)下載與編譯環(huán)節(jié)。目前已有562人學(xué)習(xí)下載適合需要快速搭建OpenCV 4.4.0開(kāi)發(fā)環(huán)境或研究其編譯依賴(lài)結(jié)構(gòu)的讀者參考使用。1. OpenCV 4.4.0 編譯產(chǎn)物拆解下載的壓縮包里到底有什么你從 OpenCV 官方渠道拿到opencv-4.4.0-vc14_vc15.exe或opencv-4.4.0.zip解壓后看到build和sources兩個(gè)目錄點(diǎn)進(jìn)build又看到x64、x86、include、python一堆文件夾然后卡住了——到底哪些文件是編譯出來(lái)的庫(kù)哪些是頭文件鏈接時(shí)該填哪個(gè)路徑運(yùn)行時(shí)又該拷哪個(gè) DLL這個(gè)問(wèn)題不搞清楚后面寫(xiě) CMakeLists 就是盲人摸象。OpenCV 4.4.0 是 2020 年 7 月發(fā)布的 LTS 版本至今仍是很多工業(yè)視覺(jué)項(xiàng)目的基線。它的 Windows 預(yù)編譯包和源碼編譯產(chǎn)物結(jié)構(gòu)一致區(qū)別只在于預(yù)編譯包省掉了 CMake 配置和編譯等待。本文把「下載文件」和「生成的庫(kù)文件」這兩件事拆開(kāi)講預(yù)編譯包里每個(gè)目錄對(duì)應(yīng)什么、源碼編譯后產(chǎn)物落在哪、Debug 和 Release 怎么區(qū)分、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)怎么選。適合正在配 OpenCV 環(huán)境、被鏈接錯(cuò)誤折磨過(guò)的 C 和 Python 開(kāi)發(fā)者。2. 預(yù)編譯包目錄結(jié)構(gòu)與庫(kù)文件命名規(guī)則2.1 build 目錄下四個(gè)關(guān)鍵文件夾的職責(zé)解壓opencv-4.4.0-vc14_vc15.exe后根目錄下只有build和sources。sources是完整源碼預(yù)編譯場(chǎng)景下基本不用動(dòng)build才是你要關(guān)心的。build里面結(jié)構(gòu)如下build/ ├── include/ # 頭文件編譯時(shí) -I 指向這里 │ └── opencv2/ ├── x64/ # 64 位庫(kù)文件 │ ├── vc14/ # VS2015 編譯的庫(kù) │ │ ├── bin/ # DLL運(yùn)行時(shí)需要 │ │ ├── lib/ # 導(dǎo)入庫(kù)鏈接時(shí)需要 │ │ └── staticlib/# 靜態(tài)庫(kù) │ └── vc15/ # VS2017 編譯的庫(kù) ├── x86/ # 32 位庫(kù)文件結(jié)構(gòu)同上 ├── python/ # Python 綁定 ├── java/ # Java 綁定 └── etc/ # Haar 級(jí)聯(lián)等數(shù)據(jù)文件include放的是所有模塊的公開(kāi)頭文件比如opencv2/core.hpp、opencv2/imgproc.hpp。編譯階段編譯器需要它來(lái)解析函數(shù)聲明所以 CMake 里include_directories必須指向build/include不是sources/include——雖然后者也有頭文件但缺少opencv2/opencv_modules.hpp這類(lèi)由 CMake 生成的配置頭直接指過(guò)去會(huì)報(bào)找不到宏定義。x64/vc14和x64/vc15的區(qū)別是編譯器工具集版本。vc14 對(duì)應(yīng) Visual Studio 2015vc15 對(duì)應(yīng) Visual Studio 2017。ABI 不完全兼容用 VS2019 打開(kāi) vc15 的庫(kù)通常沒(méi)問(wèn)題但混用 vc14 和 vc15 的庫(kù)會(huì)出現(xiàn) LNK2038 運(yùn)行時(shí)庫(kù)不匹配。判斷方法很簡(jiǎn)單看你項(xiàng)目屬性里「平臺(tái)工具集」寫(xiě)的是什么選對(duì)應(yīng)的目錄。bin里是 DLLlib里是導(dǎo)入庫(kù)。導(dǎo)入庫(kù)體積極小幾 KB 到幾十 KB它只存了 DLL 中導(dǎo)出符號(hào)的地址索引真正的代碼在 DLL 里。所以鏈接時(shí)用lib運(yùn)行時(shí)用bin。很多人鏈接通過(guò)了一運(yùn)行就彈「找不到 opencv_world440.dll」就是因?yàn)闆](méi)把bin加進(jìn) PATH 或沒(méi)拷 DLL 到 exe 旁邊。2.2 庫(kù)文件命名規(guī)則world 與非 world、d 后綴、版本號(hào)OpenCV 4.4.0 的庫(kù)文件名遵循固定格式opencv_模塊名版本號(hào)d.lib舉幾個(gè)實(shí)際例子文件名含義opencv_world440.libRelease 版所有模塊合并成一個(gè)庫(kù)opencv_world440d.libDebug 版所有模塊合并opencv_core440.libRelease 版僅 core 模塊opencv_imgproc440d.libDebug 版僅 imgproc 模塊opencv_world440.dllRelease 運(yùn)行時(shí)動(dòng)態(tài)庫(kù)opencv_world440d.dllDebug 運(yùn)行時(shí)動(dòng)態(tài)庫(kù)440是版本號(hào)4.4.0 去掉點(diǎn)。末尾d表示 Debug。這里有個(gè)血淚經(jīng)驗(yàn)Debug 版和 Release 版的庫(kù)不能混用。如果你在 Debug 配置下鏈接了opencv_world440.lib沒(méi)有 d編譯能過(guò)但運(yùn)行時(shí)會(huì)崩在堆內(nèi)存管理上因?yàn)閮蓚€(gè)版本的 CRT 堆不一致。反過(guò)來(lái) Release 鏈接opencv_world440d.lib同樣會(huì)出問(wèn)題。world模塊是官方預(yù)編譯包的默認(rèn)形態(tài)把 calib3d、core、dnn、features2d、flann、highgui、imgcodecs、imgproc、ml、objdetect、photo、stitching、video、videoio 等全部合并成一個(gè) DLL。好處是鏈接時(shí)只寫(xiě)一個(gè)庫(kù)名壞處是哪怕你只用imread最終 exe 也會(huì)依賴(lài)一個(gè) 60MB 左右的 DLL。如果你在意體積可以源碼編譯時(shí)關(guān)掉BUILD_opencv_world生成分模塊的庫(kù)。非 world 模式下鏈接需要把所有用到的模塊都列出來(lái)。比如你用了imread和imshow至少需要target_link_libraries(你的目標(biāo) opencv_core440 opencv_imgcodecs440 opencv_highgui440 opencv_imgproc440 )漏掉任何一個(gè)鏈接階段就會(huì)報(bào)unresolved external symbol。新手常見(jiàn)做法是直接把lib目錄下所有.lib都塞進(jìn)去能過(guò)但沒(méi)必要而且 Debug/Release 混在一起會(huì)出問(wèn)題。2.3 用 CMake 鏈接預(yù)編譯庫(kù)的最小可用配置下面是一個(gè)能直接抄的CMakeLists.txt假設(shè) OpenCV 解壓在D:/opencv/opencv-4.4.0cmake_minimum_required(VERSION 3.10) project(OpencvDemo CXX) # 頭文件路徑指向 build/include set(OpenCV_DIR D:/opencv/opencv-4.4.0/build) include_directories(${OpenCV_DIR}/include) # 庫(kù)文件路徑根據(jù)平臺(tái)和工具集選擇 if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(OpenCV_LIB_DIR ${OpenCV_DIR}/x64/vc15/lib) set(OpenCV_BIN_DIR ${OpenCV_DIR}/x64/vc15/bin) else() set(OpenCV_LIB_DIR ${OpenCV_DIR}/x86/vc15/lib) set(OpenCV_BIN_DIR ${OpenCV_DIR}/x86/vc15/bin) endif() link_directories(${OpenCV_LIB_DIR}) add_executable(OpencvDemo main.cpp) # Debug 配置鏈接帶 d 的庫(kù)Release 鏈接不帶 d 的庫(kù) target_link_libraries(OpencvDemo debug opencv_world440d optimized opencv_world440 ) # 把 DLL 拷到輸出目錄省去手動(dòng)配 PATH add_custom_command(TARGET OpencvDemo POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${OpenCV_BIN_DIR}/opencv_world440.dll $TARGET_FILE_DIR:OpencvDemo )這段配置里幾個(gè)關(guān)鍵點(diǎn)CMAKE_SIZEOF_VOID_P EQUAL 8判斷 64 位避免手寫(xiě) x64/x86 切換debug和optimized關(guān)鍵字讓 CMake 根據(jù)當(dāng)前構(gòu)建類(lèi)型自動(dòng)選庫(kù)不用手動(dòng)改POST_BUILD拷貝 DLL 是省后悔藥的做法否則每次換構(gòu)建目錄都要重新配 PATH。main.cpp最小驗(yàn)證代碼#include opencv2/core.hpp #include opencv2/imgcodecs.hpp #include iostream int main() { // 打印版本確認(rèn)鏈接的是 4.4.0 std::cout OpenCV version: CV_VERSION std::endl; // 構(gòu)造一個(gè) 3x3 單位矩陣驗(yàn)證 core 模塊可用 cv::Mat m cv::Mat::eye(3, 3, CV_8UC1); std::cout Matrix:\n m std::endl; return 0; }編譯運(yùn)行后輸出OpenCV version: 4.4.0和矩陣內(nèi)容說(shuō)明頭文件、庫(kù)文件、DLL 三者都對(duì)上了。如果編譯報(bào)fatal error: opencv2/core.hpp: No such file檢查include_directories如果鏈接報(bào)unresolved external symbol檢查link_directories和庫(kù)名如果運(yùn)行報(bào)缺 DLL檢查bin目錄是否在 PATH 或 exe 同級(jí)。3. 從源碼編譯 OpenCV 4.4.0CMake 參數(shù)與產(chǎn)物落點(diǎn)3.1 源碼編譯的完整命令鏈路預(yù)編譯包雖然方便但有些場(chǎng)景必須自己編需要 CUDA 加速、需要 contrib 擴(kuò)展模塊、需要裁掉不需要的模塊減小體積、或者目標(biāo)平臺(tái)沒(méi)有官方預(yù)編譯包。OpenCV 4.4.0 源碼編譯在 Windows 上推薦用 CMake Visual Studio 組合Linux 上用 CMake GCC。Windows 下先裝好 CMake 3.10 和 Visual Studio 2017/2019然后# 進(jìn)入源碼目錄的上一級(jí)創(chuàng)建獨(dú)立的構(gòu)建目錄 mkdir build_opencv cd build_opencv # 配置階段指定源碼路徑、生成器、安裝路徑、關(guān)鍵開(kāi)關(guān) cmake -G Visual Studio 16 2019 -A x64 ^ -DCMAKE_INSTALL_PREFIXD:/opencv/install ^ -DBUILD_opencv_worldON ^ -DBUILD_SHARED_LIBSON ^ -DWITH_CUDAOFF ^ -DBUILD_TESTSOFF ^ -DBUILD_PERF_TESTSOFF ^ -DBUILD_EXAMPLESOFF ^ -DOPENCV_EXTRA_MODULES_PATHD:/opencv/opencv_contrib-4.4.0/modules ^ ../opencv-4.4.0 # 編譯 Release 版本8 線程并行 cmake --build . --config Release --parallel 8 # 安裝到 CMAKE_INSTALL_PREFIX 指定的目錄 cmake --build . --config Release --target INSTALLLinux 下命令類(lèi)似只是生成器換成 Unix Makefilesmkdir build_opencv cd build_opencv cmake -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/usr/local \ -DBUILD_opencv_worldON \ -DBUILD_SHARED_LIBSON \ -DWITH_CUDAOFF \ -DBUILD_TESTSOFF \ -DBUILD_PERF_TESTSOFF \ -DBUILD_EXAMPLESOFF \ ../opencv-4.4.0 make -j$(nproc) sudo make install-DBUILD_opencv_worldON生成合并庫(kù)-DBUILD_SHARED_LIBSON生成動(dòng)態(tài)庫(kù)DLL/so設(shè)為 OFF 則生成靜態(tài)庫(kù).lib/.a。-DOPENCV_EXTRA_MODULES_PATH指向 contrib 模塊路徑不需要 contrib 就刪掉這行。-DBUILD_TESTS、-DBUILD_PERF_TESTS、-DBUILD_EXAMPLES關(guān)掉能省大量編譯時(shí)間OpenCV 的測(cè)試用例編譯比庫(kù)本身還慢。編譯時(shí)間參考Windows 上 VS2019、8 核、Release、world 模式、無(wú) CUDA大約 15 到 25 分鐘。帶 CUDA 的話可能到 1 小時(shí)以上。Linux 上 GCC 通??煲恍?0 到 20 分鐘。3.2 編譯產(chǎn)物的目錄映射install 之后文件去了哪cmake --build . --target INSTALL執(zhí)行后所有產(chǎn)物會(huì)按 GNU 規(guī)范安裝到CMAKE_INSTALL_PREFIX。Windows 下典型結(jié)構(gòu)D:/opencv/install/ ├── include/opencv2/ # 頭文件 ├── x64/vc16/ │ ├── bin/ # opencv_world440.dll │ ├── lib/ # opencv_world440.lib │ └── staticlib/ # 靜態(tài)庫(kù)如果 BUILD_SHARED_LIBSOFF ├── etc/ # Haar 級(jí)聯(lián)數(shù)據(jù) └── python/ # Python 綁定Linux 下/usr/local/ ├── include/opencv4/opencv2/ ├── lib/ │ ├── libopencv_world.so.4.4.0 │ ├── libopencv_world.so.4.4 - libopencv_world.so.4.4.0 │ └── libopencv_world.so - libopencv_world.so.4.4 ├── bin/ └── share/opencv4/注意 Linux 下.so有三個(gè)文件真實(shí)文件libopencv_world.so.4.4.0、版本軟鏈libopencv_world.so.4.4、開(kāi)發(fā)軟鏈libopencv_world.so。鏈接時(shí)用-lopencv_world鏈接器找的是libopencv_world.so運(yùn)行時(shí)動(dòng)態(tài)加載器找的是libopencv_world.so.4.4所以三個(gè)都不能刪。Windows 下x64/vc16里的vc16對(duì)應(yīng) VS2019。如果你用 VS2017 編譯目錄名是vc15VS2015 是vc14。這個(gè)目錄名由 CMake 自動(dòng)檢測(cè)不用手動(dòng)指定。3.3 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的選擇依據(jù)BUILD_SHARED_LIBSON生成動(dòng)態(tài)庫(kù)OFF生成靜態(tài)庫(kù)。兩者取舍維度動(dòng)態(tài)庫(kù)靜態(tài)庫(kù)部署需要帶 DLL/so單 exe 即可體積exe 小DLL 大exe 大更新替換 DLL 即可需重新編譯許可證寬松分發(fā)時(shí)需注意 LGPL加載速度稍慢稍快內(nèi)存共享多進(jìn)程共享各自持有常見(jiàn)做法是開(kāi)發(fā)調(diào)試用動(dòng)態(tài)庫(kù)方便替換和排查最終交付如果不想帶一堆 DLL用靜態(tài)庫(kù)。但 OpenCV 的靜態(tài)庫(kù)鏈接時(shí)依賴(lài)順序很講究漏一個(gè)就報(bào)符號(hào)缺失而且第三方依賴(lài)libjpeg、libpng、zlib也要一起鏈進(jìn)去新手容易翻車(chē)。靜態(tài)庫(kù)編譯命令只需把-DBUILD_SHARED_LIBSON改成OFF其余不變。編譯完成后lib目錄下是.libWindows或.aLinux沒(méi)有 DLL/so。鏈接時(shí) CMake 里target_link_libraries需要額外加上第三方依賴(lài)Windows 下通常還要加ippicvmt.lib、libjpeg-turbo.lib等具體看build目錄下生成的OpenCVModules.cmake。4. 編譯與鏈接環(huán)節(jié)的避坑排查4.1 現(xiàn)象LNK2038 檢測(cè)到 RuntimeLibrary 不匹配原因項(xiàng)目用的運(yùn)行時(shí)庫(kù)MT/MD、MTd/MDd和 OpenCV 庫(kù)編譯時(shí)用的不一致。OpenCV 官方預(yù)編譯包默認(rèn)用 MD/MDd動(dòng)態(tài) CRT如果你的項(xiàng)目設(shè)成 MT/MTd靜態(tài) CRT鏈接器就會(huì)報(bào)LNK2038: mismatch detected for RuntimeLibrary。解決項(xiàng)目屬性 → C/C → 代碼生成 → 運(yùn)行時(shí)庫(kù)改成「多線程 DLL (/MD)」對(duì)應(yīng) Release「多線程調(diào)試 DLL (/MDd)」對(duì)應(yīng) Debug。如果必須用 MT那就得自己源碼編譯 OpenCV 并設(shè)-DCMAKE_MSVC_RUNTIME_LIBRARYMultiThreaded。4.2 現(xiàn)象Debug 正常 Release 崩潰或反之原因Debug 配置鏈接了 Release 庫(kù)或 Release 配置鏈接了 Debug 庫(kù)。典型表現(xiàn)是cv::Mat析構(gòu)時(shí)堆異?;蛘遡mread返回空 Mat。解決CMake 里用debug和optimized關(guān)鍵字區(qū)分如 2.3 節(jié)示例。手動(dòng)配 VS 的話在「鏈接器 → 輸入 → 附加依賴(lài)項(xiàng)」里Debug 配置填opencv_world440d.libRelease 配置填opencv_world440.lib不要兩個(gè)都填。4.3 現(xiàn)象運(yùn)行時(shí)報(bào)找不到 opencv_world440.dll原因DLL 不在 exe 搜索路徑里。Windows 搜索順序是 exe 所在目錄 → 系統(tǒng)目錄 → PATH。解決三種做法任選。一是把x64/vc15/bin加進(jìn)系統(tǒng) PATH二是把 DLL 拷到 exe 同級(jí)目錄三是 VS 里設(shè)「調(diào)試 → 環(huán)境」為PATHD:\opencv\...\bin;%PATH%。CMake 項(xiàng)目推薦用 2.3 節(jié)的POST_BUILD自動(dòng)拷貝一勞永逸。4.4 現(xiàn)象CMake 報(bào) Could NOT find OpenCV原因find_package(OpenCV REQUIRED)找不到OpenCVConfig.cmake。這個(gè)文件在預(yù)編譯包的build目錄下源碼編譯后在install目錄下。解決設(shè)置OpenCV_DIR環(huán)境變量或 CMake 變量指向包含OpenCVConfig.cmake的目錄。預(yù)編譯包指向build源碼安裝指向install。命令行加-DOpenCV_DIRD:/opencv/install或在 CMakeLists 里set(OpenCV_DIR ...)后再find_package。4.5 現(xiàn)象Python 端 ModuleNotFoundError: No module named cv2原因Python 綁定沒(méi)裝或路徑不對(duì)。預(yù)編譯包的python目錄下有cv2.pydWindows或cv2.soLinux但不會(huì)自動(dòng)進(jìn)site-packages。解決把cv2.pyd拷到 Python 的site-packages目錄或者把build/python加進(jìn)PYTHONPATH。源碼編譯時(shí)加-DBUILD_opencv_python3ON和-DPYTHON3_EXECUTABLE指向你的 Pythonmake install會(huì)自動(dòng)裝到對(duì)應(yīng) site-packages。驗(yàn)證用python -c import cv2; print(cv2.__version__)輸出4.4.0即成功。5. 驗(yàn)證編譯產(chǎn)物完整性的三個(gè)實(shí)用技巧5.1 用 dumpbin 和 ldd 檢查庫(kù)文件依賴(lài)Windows 下用 VS 自帶的dumpbin查看 DLL 導(dǎo)出了哪些符號(hào)、依賴(lài)了哪些其他 DLL# 查看 opencv_world440.dll 的導(dǎo)出函數(shù)數(shù)量 dumpbin /exports opencv_world440.dll | find /c ordinal # 查看它依賴(lài)哪些系統(tǒng) DLL dumpbin /dependents opencv_world440.dllLinux 下用ldd和nm# 查看 so 的依賴(lài) ldd libopencv_world.so.4.4.0 # 查看是否導(dǎo)出了 imread 符號(hào) nm -D libopencv_world.so.4.4.0 | grep imread如果dumpbin /dependents輸出里有MSVCP140.dll、VCRUNTIME140.dll說(shuō)明依賴(lài) VC 運(yùn)行時(shí)目標(biāo)機(jī)器沒(méi)裝的話需要帶vc_redist.x64.exe。Linux 下ldd輸出not found的項(xiàng)就是缺失依賴(lài)通常是libjpeg.so、libpng.so這類(lèi)。5.2 用 CMake 的 OpenCVConfig 自動(dòng)解析版本和路徑源碼編譯安裝后install目錄下會(huì)生成OpenCVConfig.cmake和OpenCVConfig-version.cmake。項(xiàng)目里用find_package可以自動(dòng)拿到版本號(hào)和所有模塊路徑find_package(OpenCV 4.4 REQUIRED) message(STATUS OpenCV version: ${OpenCV_VERSION}) message(STATUS OpenCV libs: ${OpenCV_LIBS}) message(STATUS OpenCV include: ${OpenCV_INCLUDE_DIRS}) target_include_directories(你的目標(biāo) PRIVATE ${OpenCV_INCLUDE_DIRS}) target_link_libraries(你的目標(biāo) PRIVATE ${OpenCV_LIBS})OpenCV_LIBS會(huì)自動(dòng)包含所有已編譯模塊的庫(kù)名不用手寫(xiě)。OpenCV_VERSION輸出4.4.0。這種方式比手動(dòng)拼路徑可靠換機(jī)器時(shí)只需改OpenCV_DIR。5.3 一個(gè)最小圖像處理程序驗(yàn)證全鏈路最后用一個(gè)實(shí)際讀寫(xiě)圖像的程序驗(yàn)證從編譯到運(yùn)行的完整鏈路#include opencv2/imgcodecs.hpp #include opencv2/imgproc.hpp #include iostream int main(int argc, char** argv) { if (argc 2) { std::cerr Usage: argv[0] image_path std::endl; return -1; } // 讀取圖像驗(yàn)證 imgcodecs 模塊 cv::Mat img cv::imread(argv[1], cv::IMREAD_COLOR); if (img.empty()) { std::cerr Failed to load image: argv[1] std::endl; return -1; } std::cout Size: img.cols x img.rows Channels: img.channels() std::endl; // 轉(zhuǎn)灰度驗(yàn)證 imgproc 模塊 cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); // 寫(xiě)回文件驗(yàn)證編碼器可用 bool ok cv::imwrite(output_gray.jpg, gray); std::cout Write result: (ok ? OK : FAIL) std::endl; return 0; }編譯運(yùn)行后傳入一張 jpg輸出尺寸和通道數(shù)并在當(dāng)前目錄生成output_gray.jpg說(shuō)明imgcodecs、imgproc、core三個(gè)模塊的編譯產(chǎn)物都正常。如果imread返回空檢查圖像路徑和 OpenCV 是否帶對(duì)應(yīng)編解碼器預(yù)編譯包默認(rèn)帶 jpg/png/tiff/webp。我自己的習(xí)慣是每換一臺(tái)機(jī)器或升級(jí)一次 OpenCV先跑這個(gè)最小程序確認(rèn)CV_VERSION、imread、imwrite三件事都通再去動(dòng)項(xiàng)目代碼。這個(gè)習(xí)慣幫我省過(guò)很多次「以為是代碼問(wèn)題、其實(shí)是環(huán)境問(wèn)題」的排查時(shí)間。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取