2019年2月24日 星期日

[圖文] OpenCV 4 安裝配置在 Visual Studio 2019

[圖文] OpenCV 4.0.1 安裝配置在 Visual Studio 2019


2024-02-04
1. 新版的 Visual Studio 2022 + OpenCV490 可以參考新文章https://charlottehong.blogspot.com/2024/02/opencv-490-win11-visual-studio-2022.html


軟體下載

先到官方下載這兩項軟體 (點擊有連結)

  1. OpenCV401:https://sourceforge.net/projects/opencvlibrary/files/4.0.1/opencv-4.0.1-vc14_vc15.exe/download
    (我是故意放帶版本號連結的,這樣下面教學才能直接貼上不用改版本號。)

本文範例opencv載官方的這個

並直接安裝到C曹

這邊建議跟著我做,因為路徑如果改了,本篇教程很多部分也要跟著改
一般都是看著教程複製貼上這做,到時候很容易漏掉沒改到…

  1. Visual Studio 2019

關於 Visual Studio 如何安裝可以參考
https://charlottehong.blogspot.com/2018/09/c-visual-studio-2017.html

文件說明

build 是待會要用到的文件,全部都在裡面

這個位置是要設置在環境變數的(專給VS用的)
C:\opencv\build\x64\vc15\bin

這個位置給 C++ 引入標頭檔的
C:\opencv\build\include

這個位置專給 VS 引入lib檔的
C:\opencv\build\x64\vc15\lib

以上如果是 VS2015 就是找vc14

部屬OpenCV

環境變數

這是一次性的工作,設置好環境變數,這台電腦以後就不用再設置了。

對著左下角的開始按右鍵,打開管理員模式的 powershell。

如果是使用 win7 的用戶

  • 用管理員打開cmd,然後在cmd內輸入 powershell 就可打開
    (非SP1版本可能沒有…參考文中置頂的舊文設置)

輸入下面指令 (連點三下直接全選)

[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";C:\opencv\build\x64\vc15\bin", "Machine")

輸入之後不會有什麼提示,想要確定是否成功可以輸入

[environment]::GetEnvironmentVariable("PATH", "Machine")

查詢目前環境變數是否有輸入

檢查的話複製紅框部分,然後打開資料夾貼上路徑欄並打開,檢查看看是不是真的有東西。

  • 噴這個錯誤 LNK1104 無法開啟檔案 'opencv_world401d.lib',也是回來檢查紅框路徑。
  • 記得VS在此之前不要打開歐,如果已經先打開了,這邊做完後關閉重新啟動VS就好了。
  • 終端機要用管理權限開啟,不然那行指令會沒作用。




VS2019設定

讓我們先建立新專案吧

直接選擇空白專案

這邊隨意打一個名稱就可以下一步了

創建好專案再來就設置opencv吧~先新增屬性表

這張圖多看幾眼,右鍵的位置點錯就錯了…

然後新增名稱 opencv401d.props 這邊不要自己改,照著打稍後會說明

好了之後會出現在這個位置,點他兩下

加入 include 路徑 和 lib 路徑

include目錄的最前面加上 C:\opencv\build\include;
函式庫目錄最前面加上 C:\opencv\build\x64\vc15\lib;
(他原本是有東西的,原本的東西要留著中間用分號隔開)

加入 lib 檔案

這邊點那個小三角,在按編輯

然後輸入 opencv_world401d.lib

這邊補充說明一下 opencv_world401d.lib 中的 401 是 opencv 的版本 4.0.1版本,如果下載的是別的版本,記得要自己修正。




測試代碼

現在讓我們新增一份新的程式碼

直接就預設名稱下一步吧

接下來輸入測試程序

/**********************************************************
Name :
Date : 2016/05/29
By   : CharlotteHonG
Final: 2016/05/29
**********************************************************/
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char const* argv[]) {
 /* 畫布 */
 Mat img(270, 720, CV_8UC3, Scalar(56, 50, 38));
 /* 直線 */
 line(img, Point(20, 40), Point(120, 140), Scalar(255, 0, 0), 3);
 /* 實心方塊 */
 rectangle(img, Point(150, 40), Point(250, 140), Scalar(0, 0, 255), -1);
 /* 實心圓 */
 circle(img, Point(330, 90), 50, Scalar(0, 255, 0), -1);
 /* 空心橢圓 */
 ellipse(img, Point(460, 90), Size(60, 40), 45, 0, 360, Scalar(255, 255, 0), 2);
 /* 不規則圖形 */
 Point points[1][5];
 int x = 40, y = 540;
 points[0][0] = Point(0 + y, 50 + x);
 points[0][1] = Point(40 + y, 0 + x);
 points[0][2] = Point(110 + y, 35 + x);
 points[0][3] = Point(74 + y, 76 + x);
 points[0][4] = Point(28 + y, 96 + x);
 const Point * ppt[1] = { points[0] };
 int npt[] = { 5 };
 polylines(img, ppt, npt, 1, 1, Scalar(0, 255, 255), 3);
 /* 繪出文字 */
 putText(img, "Test Passed !!", Point(10, 230), 0, 3, Scalar(255, 170, 130), 3);
 /* 開啟畫布 */
 namedWindow("OpenCV Test By:Charlotte.HonG", WINDOW_AUTOSIZE);
 imshow("OpenCV Test By:Charlotte.HonG", img);
 waitKey(0);
 return 0;
}

像這個樣子

記得確認一下上方是不是 debug/x64 模式,因為剛剛只有設置這個模式。

然後就按F5測試吧

恭喜完成 opencv 的設置~到這邊就已經設置完畢。

練習

趁著現在記憶猶新,趕快來練習,現在就試著設置 relese 模式吧~
目前是設置 debug/x64 模式,如果要設置 release 模式,最初一開始的時候屬性表要加在 release | x64 裡面。

而在 release 最後面加入lib的時候要使用沒有 d 結尾的 `opencv_world401.lib,才是正確的檔案,這邊設置錯誤會無法編譯。

設置完畢代碼不需要更動,編譯的時候VS上方從 debug/x64 模式更改為 release/x64 模式即可~

至於 x86 模式因為 官方給的檔案並沒有幫你預先編譯好,就沒辦法做了,想要使用x86模式需要自己重新編一,詳細可以參考這邊站內文章重新編譯。
https://charlottehong.blogspot.com/2017/07/opencv-320-contrib-visual-studio.html


重複使用

現在已經設置完畢了,並且你會發現,在你的專案目錄會有一個 opencv401d.props
剛剛要你不要更改就是因為連同版本號一起打上來,這樣比較好識別。

這個把他複製出來存好,他是可以重複使用的
下次開別的新專案直接新增進來就好,完全不用再設置opencv。

使用方式像這樣,加入這個屬性表

需要注意的是屬性表建議是複製一份到專案內,然後才按上圖紅框的加入現有屬性表!而不是打開A專案,然後瀏覽到B專案的位置,加入B專案的屬性表,
這是為了確保A專案的獨立性,不這樣做哪天B專案砍掉了,或是B專案有變動到時候A會跟著壞掉…



最後

有什麼問題可以在下方留言發問喔。

最後如果還是不行的話可以參考我幫你設置好的專案,載下來打開就可以用瞜。
(裡面有設置好的 debug/rekease 屬性表,你也可以載下來直接複製過去用。)
https://github.com/hunandy14/CHG_OpenCV_test/tree/OpenCV-4.0.1

覺得本篇教學章寫的很清楚,很有幫助的話,不妨留個言讓我知道吧~
最重要的是,分享給你的朋友們,讓他們一起來學習opencv吧~
短網址幫你設置好了

http://bit.ly/2U0DEiQ [圖文] OpenCV 4.0.1 安裝配置在 Visual Studio 2019



其他關連文章

最新 OpenCV 4.5.1 文章可以參考這邊,用另一種方式配置只要搞一次就好,往後開新專案都是直接用,完全不需要設置(有懶人包一鍵配置)

https://charlottehong.blogspot.com/2021/01/opencv-451-visual-studio-2019.html

舊版的 Visual Studio 2017 可以參考這篇https://charlottehong.blogspot.com/2017/06/opencv-320-vc14-visual-studio-2017.html 

58 則留言:

  1. 我到powershell就卡住了 是否要安裝?

    回覆刪除
    回覆
    1. "卡住" 是怎麼樣再詳細說明一下~

      還有使用什麼系統 win7 或是 win10

      刪除
    2. 我用舊方法加入環境變數 已解決 還有記得要用x64不能用x86

      刪除
    3. 我用win7 找不到powershell

      刪除
    4. ok~
      對的,官方只有提供x64檔案。

      刪除
  2. 超仔細超讚的教學分享

    回覆刪除
  3. LNK1104 無法開啟檔案 'opencv_world401d.lib'
    我甚麼我發生這個錯誤,是哪裡做錯了嗎?

    回覆刪除
    回覆
    1. lib 路徑設置錯誤,找不到那個檔案

      刪除
    2. https://blog.csdn.net/az9996/article/details/89715309

      我也遇到同樣問題,是利用此文4.1~4.2的方法解決的

      刪除
    3. 痾我剛剛花時間找bug把錯誤處修好了,現在才看這則留言就是答案了...
      那時候不知道為什麼漏掉這篇,這篇文章現在已經修好了~

      刪除
  4. 嗨嗨我想請教一下
    我已按照上面全程都試過了
    且在debug的模式下使用上面的程式碼也可以正常運行

    但我想使用IplImage的資料結構卻顯示undefined
    請問跟沒設定完成有關係嗎?

    回覆刪除
    回覆
    1. 應該不是,你可以嘗試刪除 include 看是不是 cout 也會噴這個錯誤,是的話應該就知道意思了~~~

      要去找那個資料結構要引入什麼,還有版本是否正確,opencv 各個版本函式庫都有點不一樣。

      刪除
  5. 括號內的送出後不見了,上面的 include 是 iostream

    回覆刪除
  6. 請問一下 如果我只有python 可以麻煩交一下要如何在python下用vs2019配置opencv
    因為我後面想用yolo

    回覆刪除
    回覆
    1. 可以參考這篇新文章
      https://charlottehong.blogspot.com/2019/05/python-opencv-401-visual-studio-2019.html

      刪除
  7. 大大 你的ib 路徑設置的檔案名稱打錯囉~
    opencv_world401d.lib要改成opencv_world410d.lib
    我去查了一下資料夾裡的檔案
    謝謝你的分享 新手感激不盡

    回覆刪除
    回覆
    1. 因為opencv版本更新到4.1.0了,所以更動為410了,文章中使用的版本號是4.0.1。

      感謝提醒,確實沒想到這個問題,或許有其他人會跳坑,已加上說明~~

      刪除
  8. 超詳細 一定要留言鼓勵一下 感謝~

    回覆刪除
  9. 請問無法開啟來源檔,這個要怎麼解決

    回覆刪除
    回覆
    1. ㄜ~~訊息太少,我不知道妳現在是做到哪一步驟

      刪除
  10. 請問release模式設置步驟,在設定屬性表的名稱opencv401d.props,是不是也要將d拿掉?謝謝

    回覆刪除
  11. 請問在屬性頁加include路徑和lib路徑的時候,有些人是加在組態屬性的VC++目錄中,想請問有什麼差別?謝謝

    回覆刪除
    回覆
    1. 最終實現的功能是一樣的,只是差別在於設定值儲存的位置不同而已。

      可以參考看看文末的"重複使用"這個大標題,打在"屬性頁"會儲存在單一的檔案裡面,可以帶走這個檔案,下次開新專案的後就不用重新做一次文中那一堆麻煩事了,直接載入這個設定檔就好。

      如果輸入在"態屬性的VC++目錄"之中,那就不會是一個單獨的檔案,可以讓你那麼好方便攜帶了,攜帶的話會連帶整個專案的其他設置一起帶走,沒辦法直接加到方案B。

      我覺得這種方法有攜帶性會比較方便,所以才用這個方法~

      刪除
    2. 瞭解了!謝謝你!!

      刪除
  12. 您好~
    我是使用vs2019 C++ 但執行測試時候,程式碼都出現紅色底線,顯示未定義,和無法開啟來源檔案opencv2/opencv.hpp,請問這該怎麼解決呢?謝謝!

    回覆刪除
    回覆
    1. 可能是屬性檔案的配置那邊有做錯,或是沒有把opencv安裝在預設位置,安裝到別的地方。
      確認一下 "加入 include 路徑" 這個步驟中的路徑是不是真的有東西。

      刪除
  13. 寫得太好了! 謝謝您拯救了我的一天

    回覆刪除
  14. 我使用的是opencv450的版本,完全按您的设置了,为什么还是会LNK2019呢?

    回覆刪除
    回覆
    1. 不知道是不是新版本有變動,這幾天我再測試看看。

      注意一下看是不是路徑、檔名輸入的時候直接複製教學文而導致錯誤。
      因為版本的不同路徑與檔名都會變。

      比如說link檔案結尾就是用版本為結尾。
      opencv_world401d.lib <---- 這是4.01

      刪除
    2. 我找到原因了,原來有一個步驟是錯的...因為還有人說感謝以為沒錯誤。

      關於 include 和 lib 的函式庫位置設置要從這裡https://i.imgur.com/I3Juooq.jpg

      刪除
  15. 這邊留一個公告,今天發現一個問題

    按照這篇設置的時候不知道為什麼會出現 「LNK1181 無法開啟輸入檔 'opencv_aruco341.lib'」

    暫時不清楚原因,目前推測是少數電腦會出現的問題,解決方法是lib路徑用舊方法輸入就好,舊方法可以參考最頂部的「舊版的 Visual Studio 2017 可以參考這篇」。我要是有找因原因在更新出來這篇。

    回覆刪除
    回覆
    1. 文章已修正,直接照著文章的路徑走就可以了

      刪除
  16. 不好意思我想問一下 環境設定方面都確定沒有問題,可是出現無法解析的外部符號,可能是哪邊出了呢?

    回覆刪除
    回覆
    1. 文末最後面設置好的專案檔載下來也是一樣嗎?

      刪除
  17. Hi,你好,感謝您的文章,有成功在本機執行
    想請問要如何在其他電腦執行呢?會出現找不到opencv_world451.dll
    感謝

    回覆刪除
    回覆
    1. 看不太懂意思,你是想要把編譯好的 exe 轉移到別的電腦嗎?
      還是到另外一電腦也要編譯程式碼?這樣的話那台電腦也要照著這篇的步驟重新再做一次。

      刪除
    2. 如果只是要在別台執行exe檔案,那台電腦也要安裝opencv並且設置環境變數;或者把dll檔挖出來放在exe檔案旁邊再開啟也可以。

      刪除
  18. 不好意思,本人照著您的安裝程序成功的在VS2019上裝了4.5.1版本的openCV,也順利地跑出了你的範例,不過在做其他練習時出現了一些無法解決的問題,像是擲回例外狀況之類的,想請問該如何解決

    回覆刪除
    回覆
    1. 例外是運行錯誤,不是設置的環境的問題了。
      常見的運行錯誤有圖片檔名打錯找不到圖檔之類的,陣列的存取位置超出當前長度等等。
      要去看哪裡噴例外具體從VS2019可以看到例外名稱,並追蹤到哪一行代碼噴的,去看哪裡出狀況了。

      刪除
  19. 超仔細超讚的教學分享

    回覆刪除
  20. 感謝分享 節省了一大堆時間在撞牆

    回覆刪除
    回覆
    1. 您好 想請問我按照您上述步驟執行完畢是可以完成操作的
      但是我目前使用的code base還是為win32平台 這樣會造成編譯失敗
      如果我去找x86(32bit)的library 理論上來說可以解決這個問題嗎
      感謝

      刪除
    2. 是的,官方沒有32位元的預編譯檔案,要自己手動編譯。
      編譯完成之後步驟都跟這篇一樣,就可以加入了,不過現在電腦CPU都x64了怎麼還會有32位元的~

      編譯的話文末那篇站內文可以參考如何用VC自己編譯。

      刪除