`12/8/2023` # Opencv C++ 環境建置筆記 其實我今天只是拿剛好正在學習的 opencv 來作為我今天學習的例子,原本我是在 Python 上面操作 opencv,但由於我想要在樹莓派上面運行 opencv,而由於樹莓派的 cpu 性能沒有很好,要編譯像 Python 那樣的高階語言會有性能不足的問題,導致像視訊等的及時性程式在運行時會非常得卡,所以我就想要使用效率更高的 C++ 來使用 opencv,於是就誕生了這樣的筆記。 希望我能夠紀錄我這次的開發過程,讓我可以透過紀錄過程去梳理我這次的開發所學習到的東西。 ## 套件安裝 是的,電腦原生具備的軟體還是不太夠用,需要額外下載一些第三方軟體才能完成完整的建置流程,這裡將最小幅度地介紹一些小工具給大家。 ### Homebrew Homebrew 是一個在 Mac 上常用的套件管理系統,它可以很方便地將許多第三方套件放在 brew 底下進行管理,同時它也具備自動安裝、自動移除、自動更新等功能,讓你只要一行指令就可以輕鬆做到以上各種事情,不需要像以往可能在要用到某個套件時發現已經過時了才要一個個手動更新,這是為了等下要裝 CMake 時會用到的。 附上[HomeBrew 的官網連結](https://brew.sh/zh-tw/),裡面就有詳細的介紹以及安裝方式 ### gcc/g++ 這個如果你是用 Mac 的話,你可以去下載 CommandLineTools,裡面有 Apple 自家的 Clang,你可以將其理解為 Apple 獨家的編譯系統,作為 GNU 的替代品。 ### CMake CMake 是一個可以自動幫你建製 Makefile 的第三方套件,簡單來說就是幫你執行從編譯到安裝的一切的工具,如果只是單純為了要建置環境的話,你只要安裝好就好了 安裝方式很簡單,剛剛已經讓你裝完 Homebrew 了,所以你只需要打開 Terminal 並執行: ```shell $ brew install cmake ``` 就可以直接使用了。 ## 本地端函式庫編譯與安裝 當你的前置工作都做完之後,就可以開始建置 opencv 的作業了 首先我們先到 [opencv 的官方 github](https://github.com/opencv/opencv) 去下載整個資料包,並找個暫時的地方解壓縮 opencv 的官方 github 頁面 ![image](https://hackmd.io/_uploads/Bky54aTVp.png) 找個地方解壓縮 ![image](https://hackmd.io/_uploads/SkCtraaV6.png) 解壓縮完之後,我們打開 Terminal 並將當前的 directory 切換到你剛才解壓縮的 opencv 的資料 ![截圖 2023-11-24 14.43.49](https://hackmd.io/_uploads/rkPILppET.png) 在 terminal 執行以下指令: ```shell $ mkdir build && cd build $ cmake .. $ make $ sudo make install ``` 指令的意思如下: * 創建名為 build 的資料夾(directory)並移至其中 * 執行位於母資料夾(opencv-4.x)中的 CMakelist.txt 內容 * 執行由 CMake 自動生成的 Makefile 檔案來進行編譯 * 最後就是把套件安裝到本地端的函式庫(事後刪掉當前的資料夾也沒關係) 注意: 在執行 make 指令後會開始編譯工作,會花上一點時間,這段時間請不要關機或關掉運作中的視窗,不然就要從頭開始喔~ ## 指令 ```shell $ g++ <filename>.cpp -I<install path> -o <executable> -lopencv_core -std=c++11 ``` 原始: ```shell $ g++ main.cpp -I/usr/local/include/opencv4 -o main -lopencv_core -std=c++11 ``` 透過上面的指令,就可以編譯 C++ 程式並生成 executable,然後方能執行你所寫的程式。 說明: * g++:GNU的編譯器,在蘋果裡面是用 Clang 來代替,但指令是一樣的 * -I(大寫 i ):include,後面要放你在程式裡 include 的函式庫在本機的路徑,要特別注意的是有些第三方函式庫並不是原本就內建在本地端的,所以要透過前面的步驟,將函式庫的環境建置檔案編譯之後執行 sudo make install 之後才會將這些資料安裝到本地端的函式庫。以這次的例子來說在 make install 之後編譯好的 opencv 函式庫就會拷貝一份到 /usr/local/include/ 的路徑,這個沒有一定,通常在你執行 make install 時可以在提示字元看到它的安裝位置,就是那個了 * -o:executable 的名字要放在它後面 * -l(小寫 L):除了前面要給它函式庫的位置以外,這裡則是要特別將你要 link 的函式庫名稱也一併給它 * -std=c\++11:指定 C++ 的版本,避免有新舊版本的語法差異所造成的無法編譯的問題 ## 結語 這只是開始,之後應該會往如何編寫 makefile(或 cmake) 和 shellscript 研究,這樣就可以將前面所有的步驟都一鍵化,如此一來要在不同裝置上快速使用就會比較方便。 # 更(12/8/2023) 後續發現要一個個用 *-l* 去 link 每個函式庫實在太麻煩,於是就上網找到了使用 pkg-config 套件去自動抓取的方法,但問題是我在編譯時的流程是沒有滿足使用這個方法的條件的,所以要在編譯流程上有細節上的修改,才能創建出使用這個方法所需要的 opencv.pc 檔。 關於這個流程,我參考了[這個網站的教學](https://tree.rocks/%E5%A6%82%E4%BD%95%E5%9C%A8-mac-%E4%B8%8A%E5%AE%89%E8%A3%9D-opencv-for-c-%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83-7776b7a70c46),因為是現成的,我就不特地再寫一次了,直接貼連結,供參。