在之前的文章中,我們已經完成了OpenCV的環境設置。現在,我們終於可以開始撰寫我們的第一個OpenCV程式。
在這個主題提供兩種建立專案的方式供你選擇。你可以根據你的開發需求和熟悉程度來決定使用哪一種方式。
無論你選擇哪種方式,都不太會影響後續的學習效果。使用CMake專案能夠將程式碼遷移到Linux環境下執行。其次,大部分的專案配置操作都可以在CMakeLists.txt
文件中完成,管理專案比較方便,我比較偏好使用CMake。
你可以參考以下比較,以決定你想使用哪種專案方式。以下是兩種方式的優點和缺點:
建立新的Visual Studio的sln專案:
建立新的CMake專案:
你目前的OpenCV組態會影響你使用IDE開發選擇的組態,所以如果你的OpenCV是Debug組態,你的專案的組態就要是Debug。如果你的OpenCV是Release組態,你的專案的組態就要是Release。使用Release組態程式不能在執行的時候使用斷點(Break Point)功能,所以建議選擇Debug。千萬別拿Release版的OpenCV去連結你的Debug專案,同理,別拿Debug版的OpenCV去連結你的Release專案。不然到時候你在編譯的時候連結器會出錯,是個很大的坑。
如果你是從官方預編譯的執行檔取得OpenCV的話,你可以自由選擇你要Debug還是Release組態。
如果你是透過編譯來取得OpenCV的話,回到當初建立編譯環境的CMake-gui,搜尋CMAKE_BUILD_TYPE
,看看你編譯出來的OpenCV是Debug組態還是Release組態,如果你很需要Break Point這個實用的功能的話建議回到上篇重新編譯一個Debug組態。
opencv_first_sln_project
,或是其他名稱也行,但切記不要用中文。專案>opencv_first_sln_project屬性
C/C++ > 一般
,設定OpenCV的include檔資料夾,如果沒有設定你在編譯的時候#include "opencv2/opencv.hpp"
會找不到標頭。連結器 > 一般
,設定其他程式庫目錄,OpenCV的連結庫資料夾OpenCV\build\x64\vc17\lib
。連結器 > 輸入
,設定OpenCV的連結庫,如果你的專案是Debug組態,填入opencv_world480d.lib
。如果你是Release組態,填入opencv_world480.lib
。opencv_first_project
,或是其他名稱也行,一樣切記不要用中文。可以看到右邊的解決方案總管裡面有opencv_first_project
,將它展開以後會看到CMakeLists.txt
,左鍵打開它。
更改CMakeLists.txt
成下方的格式,記得OpenCV_DIR
要改成你自己安裝OpenCV的位置,opencv_first_project
要改成你的專案名稱。還有,如果你的專案是Release組態,需要將下方target_link_libraries
的opencv_world480d
改成opencv_world480
,否則編譯的時候連結器會出錯。
CMakeLists.txt
# 設定OpenCV 安裝位置
set(OpenCV_DIR "C:\\Users\\vince\\opencv_workspace\\build")
set(OpenCV_INCLUDE_DIRS "${OpenCV_DIR}\\include")
set(OpenCV_LIBS "${OpenCV_DIR}\\x64\\vc17\\lib")
# 設定OpenCV 的include標頭檔位置
include_directories( ${OpenCV_INCLUDE_DIRS} )
# 設定OpenCV函式庫的資料夾
link_directories("${OpenCV_LIBS}")
# 尋找OpenCV
find_package(OpenCV REQUIRED)
add_executable (opencv_first_project "opencv_first_project.cpp")
# 連結OpenCV函式庫中的opencv_world.lib
target_link_libraries(opencv_first_project opencv_world480d)
if (CMAKE_VERSION VERSION_GREATER 3.12)
set_property(TARGET opencv_first_project PROPERTY CXX_STANDARD 20)
endif()
接下來打開你的opencv_first_project.cpp
檔,準備好寫下你的第一支OpenCV程式。
這支程式會讀取路徑下的圖片檔,透過視窗顯示出來。記得圖片的路徑必須要完整,不然會拋錯。
#include <iostream>
#include "opencv2/opencv.hpp"
int main()
{
// 讀取圖片
cv::Mat img = cv::imread("C:\\Users\\vince\\source\\repos\\MyFirstOpenCVProject\\x64\\Release\\Lenna.png", cv::IMREAD_UNCHANGED);
// 顯示圖片
cv::imshow("Output", img);
// 等待使用者按下任意按鍵
cv::waitKey(0);
// 顯示訊息
std::cout << "Hello OpenCV!\n";
}
由 南加州大學訊號及圖像處理學院圖庫, Fair use, https://zh.wikipedia.org/w/index.php?curid=102343Q
恭喜你,看到我們熟悉的Lenna圖。
板主您好,我是剛踏入C\C++的小白,最近工作需求又額外要學習OpenCV。
因此找到版主的文章來一步一步進行。目前安裝visual studio這塊, 參考Day2-Day3文章。
今天想要測試安裝是否正確及開起第一個專案, 參考Day5文章時, 到了步驟2) 設定專案屬性: 2. 開啟專案後,將組態更改成你安裝的OpenCV建置的組態。
--> 這邊有點摸不著頭緒, 因為還是個小小白的緣故...
請問安裝的OpenCV建置的組態能在哪邊查看嗎? 我回到Day2-Day3的文章內搜索, 並沒有找到組態這個相關詞的關聯, 請版主再幫忙指點🙂
感謝版主無私分享❤️
kighar1217你好,回覆以上問題:
你的意思應該是要如何知道自己的OpenCV是Debug版還是Release版對吧?
這取決於你OpenCV當初建置(或編譯)的設定。
x64\vc16\bin
資料夾下發現有opencv_world480d.dll
以及opencv_world480.dll
,代表兩個組態都有。您好, 感謝回覆
節錄上面文章:
『2) 設定專案屬性
◆ 點選專案>opencv_first_sln_project屬性
◆ 開啟專案後,將組態更改成你安裝的OpenCV建置的組態。』
所以我打開下面的位置, 順理成章地以為是在講黃色框框的地方, 以為要變更下拉式選單的內容。
依照大大的回覆, 這個步驟應該是將綠色框框處的屬性,改成安裝的版本, 請問這個理解正確嗎? 謝謝
[已解決] 我依照後面的步驟繼續進行,完成設定之後,將程式碼貼入並把圖片位置改成我的資料夾位置,執行後出現找不到,請問是哪裡出了紕漏呢? 應該怎麼挽救?
沒辦法刪除留言, 我用修改方式告知:
我重新開啟專案之後,再run一次, 系統出現的錯誤顯示是找不到opencv_world480d.dll, 於是我到x64\vc16\bin位址去看, 發現檔案是opencv_world4100d.lib , 修改之後已經可以順利執行, 並顯示正確結果.
感謝大大!