# 在 Mac VS Code 上架設 OpenCV 環境教學 [C++] ###### tags: `VSCode`, `C++`, `OpenCV`, `Tutorial` >發表時間:2021.10.18 ## 前言 **閱讀教學文章之前,請先確認你的mac已經安裝VS code,並且已經安裝設置好相關套件,可以對C++程式碼進行編譯以及除錯。若尚未完成,可以參考 vscode 官方的[教學文章](https://code.visualstudio.com/docs/cpp/config-clang-mac)** 因研究需求,第一次接觸 macOS 的我對於這邊的各種快捷鍵、視窗界面可以說是用得相當不順手,光是尋找檔案路徑就令我十分頭痛。但在經歷一段陣痛期之後,發覺相較於 Windows 系統,這顆蘋果還是有一些優點的(不過若沒有特殊需求,也不用特地買一台來玩,筆者認為 Ubuntu 免費又好用QQ)。 撰寫文章時稍微做了一些資料蒐集了解到,由於 MacOS 源於類Unix家族的 [Darwin](https://zh.wikipedia.org/wiki/Darwin_(%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F)),作業系統的服務和使用者空間工具則以 [BSD](https://zh.wikipedia.org/wiki/BSD) 為基礎,在 C/C++ 的支援上會比 Windows 好得多,在蘋果自家的 IDE , Xcode 上除可以撰寫 Swift 外,其實也可以進行 C/C++的 開發。 本文是筆者踩過ㄧ整趟架設時發生的各種坑之後,所做整理出的安裝教學,在完成每一個步驟之後均會做一些檢核機制,若中途發生錯誤,請回頭確認是否有疏漏了哪些環節。另外考慮到有些人因為各種專有名詞的不熟悉而看得頭昏眼花,我會盡量對其做相關的補充說明。 ### 軟硬體版本 ### - Mac mini (M1, 2020) macOS Big Sur - 11.6 - Visual Studio Code - 1.61.0 - opencv ( Install by Homebrew ) - 4.5.3 ## 確認 vs code 以 root 權限開啟 ## 非必要,不過可能會有差。執行前確認你的vscode已經安裝於應用程式的資料夾中,並且已經在vscode 中呼叫 `shell command` 安裝 `code` 指令: >補充: >"root" 為一術語,意思是取得系統或應用程式的最高權限,在這個模式下你有權限可以對一些內部參數、設定做更改,但也有可能設定錯誤導致錯誤,可以想像遊戲中開金手指的意思。 **檢核方式: 進入終端機(Terminal)並輸入** ```shell= code . ``` 若印出類似以下訊息且vscode並沒有開啟,表示尚未設定,[解決方式](https://stackoverflow.com/questions/29955500/code-not-working-in-command-line-for-visual-studio-code-on-osx-mac): ```shell= sudo: code: command not found ``` 確認可以運行之後,接下來的一步是對 `code` 做一些設置,使我們每一次只要輸入該指令就可以直接以 root 開啟 vscode: ```shell= sudo code --user-data-dir="/.vscode-root" ``` ## 安裝 Homebrew ## 以下是[官網](https://brew.sh/index_zh-tw.html)對於 Homebrew 的介紹,簡單來說你可以透過他去下載到許多原先 macOS 未預先裝設的 Unix 工具, opencv 便是其中之一。 >Homebrew is the easiest and most flexible way to install the UNIX tools Apple didn’t include with macOS. It can also install software not packaged for your Linux distribution to your home directory without requiring sudo. 依循官網的安裝指示或者在終端機輸入: ```shell= /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 兩個重要的 brew 指令: ```shell= brew install "packageName" // 安裝指定套件如 brew install opencv brew info "packageName" // 顯示已下載套件資訊以及路徑(超重要) ``` 關於查找已安裝的函式庫的使用介面的電腦工具軟體,也可以安裝 [pkg-config](https://zh.wikipedia.org/wiki/Pkg-config) ```shell= brew install pkg-config ``` **安裝 Xcode Line Tools 及 cmake ** 這包含 c++ 編譯器 clang、macOS SDK 以及 make,不在本篇討論範圍不用知道太多,只要知道若你有在使用Xcode 或者 Homebrew 管理 Unix 工具,基本上都會需要。 ```shell= sudo xcode-select --install brew install cmake ``` **檢核方式** ```shell= brew --version ``` 若安裝成功會顯示版本號 ## 開始安裝 opencv ## 使用 Homebrew 安裝,基本上比較簡單,沒有特別需要注意的地方。取決於這部分會安裝很久,可以先休息一下再回來。 ```shell= brew install opencv ``` **檢核方式** ```shell= brew info opencv ``` ## 設置 vscode .json 檔 ## 這邊較為複雜也最常出錯,先附上筆者的設置,你可以點擊標題,查看官方文檔對於這些.json文件參數代表的解釋。或者先熟悉[如何編譯及偵錯在 vscode 上的 c++ 程式碼](https://code.visualstudio.com/docs/cpp/config-clang-mac) ### 測試專案主要架構圖 ### ```mermaid graph LR; opencv_test --> .vscode; opencv_test --> main.cpp; opencv_test --> W_A1_0_3.jpg .vscode --> c_cpp_properties.json; .vscode --> launch.json; .vscode --> task.json; ``` ``` 測試專案主要架構圖 opencv_test--| | .vscode-----| | | | c_cpp_properties.json | | | launch.json | | | task.json | main.cpp | W_A1_0_3.jpg ``` ### 測試主程式碼:main.cpp ### ```cpp= #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <vector> #include <string> using namespace cv; using namespace std; int main() { // 測試擴增函式庫是否能正常使用 vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"}; for (const string& word : msg) { cout << word << " "; } cout << endl; // 測試 opencv 能否運作 cv::Mat img = cv::imread("W_A1_0_3.jpg"); if(img.empty()){ cout << "open img failed " << endl; } cv::imshow("Example", img); cv::waitKey(0); return 0; } ``` ### [task.json](https://code.visualstudio.com/docs/editor/tasks) ### 此文件負責告訴 vscode 要如何編譯你的程式碼,包含要編譯的目標檔案位置(<font color="#f00">`"${file}"`</font>)、使用何種編譯器(<font color="#f00">`"command":`</font>)、需要引入哪些參數和函式庫(<font color="#f00">`"args":`</font>)等。 ``` { "version": "2.0.0", "tasks": [ { "type": "shell", "label": "clang++ build active file", "command": "/usr/bin/clang++", // terminal cmd: which clang++ "args": [ "-std=c++17", "-stdlib=libc++", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", "-I", //terminal cmd: pkg-config --cflags --libs opencv4 "/opt/homebrew/opt/opencv/include/opencv4", "-L", "/opt/homebrew/opt/opencv/lib", "-l", "opencv_gapi", "-l", "opencv_stitching", "-l", "opencv_alphamat", "-l", "opencv_aruco", "-l", "opencv_barcode", "-l", "opencv_bgsegm", "-l", "opencv_bioinspired", "-l", "opencv_ccalib", "-l", "opencv_dnn_objdetect", "-l", "opencv_dnn_superres", "-l", "opencv_dpm", "-l", "opencv_face", "-l", "opencv_freetype", "-l", "opencv_fuzzy", "-l", "opencv_hfs", "-l", "opencv_img_hash", "-l", "opencv_intensity_transform", "-l", "opencv_line_descriptor", "-l", "opencv_mcc", "-l", "opencv_quality", "-l", "opencv_rapid", "-l", "opencv_reg", "-l", "opencv_rgbd", "-l", "opencv_saliency", "-l", "opencv_sfm", "-l", "opencv_stereo", "-l", "opencv_structured_light", "-l", "opencv_phase_unwrapping", "-l", "opencv_superres", "-l", "opencv_optflow", "-l", "opencv_surface_matching", "-l", "opencv_tracking", "-l", "opencv_highgui", "-l", "opencv_datasets", "-l", "opencv_text", "-l", "opencv_plot", "-l", "opencv_videostab", "-l", "opencv_videoio", "-l", "opencv_viz", "-l", "opencv_wechat_qrcode", "-l", "opencv_xfeatures2d", "-l", "opencv_shape", "-l", "opencv_ml", "-l", "opencv_ximgproc", "-l", "opencv_video", "-l", "opencv_dnn", "-l", "opencv_xobjdetect", "-l", "opencv_objdetect", "-l", "opencv_calib3d", "-l", "opencv_imgcodecs", "-l", "opencv_features2d", "-l", "opencv_flann", "-l", "opencv_xphoto", "-l", "opencv_photo", "-l", "opencv_imgproc", "-l", "opencv_core" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": "build" }, ] } ``` <font color="#f00">`"args":`</font>區塊中很長的那一串可以透過終端機輸入 `pkg-config --cflags --libs opencv` 找到,他會告訴 vscode 編譯程式碼時引入全部的 opencv 函式庫 ### [launch.jason](https://www.youtube.com/watch?v=G9gnSGKYIg4) ### 此文件負責告訴 vscode 要如何偵錯,設定好之後你可以直接按鍵盤上的預設鍵 `F5` 開始偵錯,不需要花費時間建置(build)後再進入終端機執行編譯好的程式。 - 若發生找不到 `"lldb"` 導致無法偵錯,可以安裝並啟用此[套件](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb) ``` { // 使用 IntelliSense 以得知可用的屬性。 // 暫留以檢視現有屬性的描述。 // 如需詳細資訊,請瀏覽: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "clang++ - 建置及偵錯使用中的檔案", "type": "lldb", // 若找不到需安裝codelldb "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", // 要進行偵錯的檔案 "args": [], "stopAtEntry": true, // 開啟後,固定將每一次主程式的進入點設為中斷點 "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "lldb", "preLaunchTask": "clang++ build active file", // 需要與task.json中的"label"相同 } ] } ``` ### [c_cpp_properties.json](https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference) ### 此文件負責告訴 vscode 一些非 c++ 本身內建的函式庫位置,讓你可順利將 opencv 的函式庫 `#include` 進來。 <font color="#f00">`"includePath":`</font> 中的opencv路徑位置可以在終端機輸入 `brew info opencv` 找到,加入其函式庫資料夾以及標頭檔資料夾。 ``` { "configurations": [ { "name": "Mac", "includePath": [ "${workspaceFolder}/**", "/opt/homebrew/Cellar/opencv/4.5.3_2/lib", "/opt/homebrew/Cellar/opencv/4.5.3_2/include/opencv4/**" ], "defines": [], "macFrameworkPath": [ "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang", "cStandard": "gnu17", "cppStandard": "gnu++17", "intelliSenseMode": "macos-gcc-arm64" } ], "version": 4 } ``` ## 測試 ## 在主程式`main.cpp` 按下 `F5` 測試看看吧!希望這篇安裝說明可以帶給你一些有用的資訊。 範例程式碼於 [GitHub link](https://github.com/maromaSamsa/vscode_opencv_hello_mac)