1. 程式人生 > 實用技巧 >OpenCV4學習筆記(1)原始碼編譯安裝 | OpenCV4.3.0以及Contrib | Win10 | CMake-GUI | VS2019 | HTTP代理

OpenCV4學習筆記(1)原始碼編譯安裝 | OpenCV4.3.0以及Contrib | Win10 | CMake-GUI | VS2019 | HTTP代理

目錄

本篇部落格會持續更新,將自己的心得體會、遇到的問題和解決方案記錄下來。

目標

  • 原始碼編譯的方式安裝OpenCV與相應的Contrib擴充套件模組
    ,但是不使用CUDA的相關功能(我的機器上沒有配置CUDA的開發環境,所以無法編譯CUDA相關的檔案)
  • 使用HTTP代理解決CMake的Configure、Generate階段的檔案下載失敗問題,而非手動下載必要檔案。
  • 使用新建配置檔案的方法在VS2019上配置OpenCV開發環境,後續工程直接匯入已有的配置檔案即可,無需重複配置。

ATTENTION!

有些事情真的只有經歷了,才相信它確實存在,但是這種事還是想少經歷點好。。。唉,眼淚好鹹。。。

  • 所有演示操作均已本人的裝置、環境為例,讀者可以根據需要自行修改、配置,需要遵守的規則我都會說明。
  • 有些操作過程可能需要等待較長的時間,請一定要耐心等待,中途絕對不能強制停止,特別是使用VS的編譯過程,強制停止可能會導致正在編譯的檔案損壞,甚至無法進行第二次編譯。
  • 使用命令提示符和PowerShell均可(之後統稱為控制檯,可以互相替換),但是必須執行在管理員許可權下。
  • 如果你的環境本身無法進行CUDA開發,那麼就不能在預編譯的時候選擇CUDA的相關選項。不然的話,之後使用VS編譯的時候會由於缺少相關檔案,而發生編譯錯誤。
  • 這個教程只適用於Win10系統,Mac和Linux系統預編譯之前,需要手動安裝大量的依賴庫,安裝不全會導致編譯完的OpenCV中的某些方法損壞,無法正常使用,此時只能安裝必要依賴庫後,重新預編譯和編譯OpenCV,才能正常使用。

下載CMake、配置CMake環境變數、下載OpenCV和OpenCV_Contrib原始碼、下載VS2019

下載CMake

  • 下載Installer即可,字尾名為.msi,下載完成後即可直接安裝。
  • 這裡我使用的是3.17.0版本,建議讀者也使用該版本,當然也可以根據需要自行選擇其他版本下載、安裝。

配置CMake環境變數

  • 因為需要從控制檯啟動CMake,所以需要將其新增到系統環境變數中,新增環境變數的操作在此不做演示,操作步驟與配置g++、gcc的環境變數是完全相同的。
  • 配置完成後,以管理員身份執行控制檯,輸入cmake-gui,安裝成功會彈出cmake-gui介面,否則不成功。

下載OpenCV和OpenCV_Contrib原始碼

到官方的Github裡下載這兩份原始碼,注意版本必須匹配,這裡演示的版本為4.3.0。

下載OpenCV原始碼

  • 下載字尾名為.zip格式的原始碼即可。
  • 待下載完成後,在本地的目標資料夾下解壓,保證檔案目錄除碟符名之外的其他所有資料夾名稱均無中文,目標資料夾就是希望OpenCV安裝到的資料夾,安裝完成之後不能修改!

下載OpenCV_Contrib原始碼

  • 下載字尾名為.zip格式的原始碼即可。

  • 待下載完成後,在本地的目標資料夾下解壓,保證檔案目錄除碟符名之外的其他所有資料夾名稱均無中文

  • OpenCV和OpenCV_Contrib的原始碼,路徑之間不互相影響,沒有特定的包含關係,但是編譯、安裝完成之後不能隨意挪動OpenCV_Contrib包的位置。

下載VS2019

使用CMake預編譯OpenCV原始碼

配置HTTP代理

這裡是和其他部落格最與眾不同的地方,先來說一下原因。其實很簡單,是因為按照網上大部分部落格給出的解決方案,即手動下載檔案放到指定目錄的方法在我的機器上無效,而且暫時還沒有找出問題的原因。最後只能放棄這個方法,另尋他路。

由於相關的資料十分匱乏,單就部落格來說,大部分國內的部落格都是手動下載缺失檔案,而國外的部落格則沒有這些顧慮,自然就沒有對這個問題的討論,所以這部分的摸索屬實不易。

我不是專門學習計算機網路相關的專業,所以有些用詞可能不當,如有誤導或錯誤,望大家指出,定及時更正!

需要藉助代理伺服器來下載編譯過程中所需的檔案,所以需要先對代理軟體進行配置。

  1. 開啟確保可以使用的代理軟體(各種協議使用的軟體不同,但是一般都可以轉換成HTTP協議的代理,注意找一下自己使用軟體的相關設定選項),確定同時開啟了HTTP代理。

  2. 將HTTP代理伺服器的IP地址和埠號複製下來,注意一定是HTTP代理伺服器的IP地址和埠號,而不是SOCKS4/5代理伺服器的IP地址和埠號,如果弄錯了是無法使用的,下面以我的為例:

  3. 將HTTP代理伺服器的IP地址和埠號新增到環境變數中,按理來說,可以在控制檯中設定臨時的HTTP代理,但是我這麼設定是無效的,而新增到環境變數中是有效的。

    具體格式如下:(兩行都需要新增

    • 這兩行說明HTTP代理伺服器的IP地址為127.0.0.1,即回送地址,埠號為7890。

    • 這只是我在軟體中設定的埠號,一定要根據實際情況填寫自己的HTTP代理伺服器的IP地址和埠號,自己軟體的埠號不一定是7890,要是有專門的HTTP代理伺服器,IP地址也不是回送地址,直接照抄我的設定是無法正常工作的。

  4. 此時如果有控制檯處於開啟狀態,需要先將其關閉,在保證代理伺服器配置完成並打開了HTTP代理的時候重新開啟控制檯,保證環境變數被正常載入。

  5. 使用Cmake預編譯完成之後,一定要記得刪除這兩條環境變數,不然的話會影響其他應用的聯網。

使用CMake預編譯OpenCV的原始碼

  1. 進入之前下載好的OpenCV-4.3.0資料夾。

  2. 建立一個名為build的資料夾,用來存放預編譯輸出的內容。

  3. 進入build資料夾之後,點選左上角的“檔案”選單項,以管理員身份開啟PowerShell。

  4. 輸入命令cmake-gui,開啟cmake-gui介面。

  5. 輸入原始碼路徑和要生成編譯好的二進位制檔案的路徑。

    原始碼路徑是整個opencv-4.3.0資料夾,二進位制檔案路徑是剛剛建立的build資料夾,下面以我的路徑為例:

  6. 點選Configure,注意選擇VS2019作為generator,之後,如果之前的HTTP代理伺服器配置全部正常,這裡的檔案會全部下載成功,稍作等待,完成後會提示Configure done。

  7. 配置Contirb擴充套件模組的路徑,這裡只進行必須的兩項設定,其他設定項讀者可以根據需要自行設定或者到網上查閱相關資料。

    這裡需要注意的是,不要選擇任何跟CUDA有關的選項,除非你的VS之前可以編譯、執行CUDA程式,不然的話,用VS編譯OpenCV原始碼的過程中,會由於缺少檔案導致編譯錯誤。

    • 搜尋extra關鍵詞,配置Contirb擴充套件模組的路徑,最後一級檔案路徑必須到modules,而不是opencv_contrib-4.3.0,這裡以我的路徑為例:

    • 搜尋world關鍵詞,並將該項選中,表示啟用拓展模組。

  8. 點選Generate,如果之前的HTTP代理伺服器配置正常,這裡的檔案會全部下載成功,無需手動下載。稍作等待,完成後會提示Generate done。

  9. 點選Open Project,預編譯好的專案解決方案檔案OpenCV.sln將被VS2019開啟,等待整個專案載入完成。

使用VS2019編譯OpenCV原始碼

  1. 配置解決方案平臺,對應生成的編譯好的OpenCV只能在當前選擇的平臺上執行,這裡我選擇的是配置為Debug模式、平臺為x86-64。

  2. 按下組合鍵Ctrl + Alt + L,開啟解決方案資源管理器。

  3. 找到當前解決方案下的CMakeTargets資料夾中的ALL_BUILD專案和INSTALL專案,不需要開啟。

  4. 右鍵點選ALL_BUILD專案,選擇重新生成,等待編譯完成。(參考時間:i9 9900KF為五分鐘,Jetson TX2共計四十分鐘左右)

  5. 右鍵點選INSTALL專案,選擇重新生成,等待編譯完成。(參考時間:i9 9900KF為五分鐘)

  6. 編譯完成之後,就完成了OpenCV的原始碼編譯安裝。

配置VS2019的OpenCV開發環境

採用建立配置檔案的方式配置開發環境, 新建工程之後不需要重複配置,直接匯入配置檔案即可。基本按照參考網站中給出的部落格進行配置,有些地方稍作修改。

  1. 找到當前專案的屬性管理器,如果沒有這個側邊欄,需要在頂部選單欄檢視-其他視窗中開啟

  2. 在x64 Debug下,建立一個新的配置檔案,檔名稱最好能夠包含如下資訊:

    1. 這是一個OpenCV的配置檔案。
    2. 適用於機器字長為64位的計算機。
    3. 在VS的Debug模式下執行,而非Release模式。
  3. 雙擊開啟建立的配置檔案

  4. 配置通用屬性->VC++目錄下的包含目錄,這裡以我的路徑為例:

  5. 配置通用屬性->VC++目錄下的庫目錄,這裡以我的路徑為例:

  6. 配置通用屬性->連結器->輸入下的附加依賴項,這裡以我的路徑為例:

    • 配置附加依賴項的時候,直接新增新的絕對路徑即可,不要把庫檔案複製到VS的根目錄下,然後只新增相對路徑,配置OpenCV的過程本來就很頭疼,沒必要讓步驟變得更加繁瑣。
  7. 配置完之後,一定要右鍵單擊剛才配置的檔案,然後點選儲存

測試程式

  • 注意預設生成的解決方案.sln檔案和mian.cpp不在同一個路徑下,使用相對路徑時,要注意圖片的路徑!

    #include <opencv2/highgui.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char** argv) {
        Mat image;
        image = imread(samples::findFile("rubberwhale1.png"), IMREAD_ANYCOLOR);
    
        if (image.empty())                
        {
            cout << "Could not open or find the image" << std::endl;
            return -1;
        }
    
        namedWindow("Display window", WINDOW_AUTOSIZE); 
        imshow("Display window", image);                
        waitKey(0); 
        destroyAllWindows();
    
        return 0;
    }
    

如果你的圖片能夠正常顯示,那麼恭喜你!到此為止,所有的配置已經完成了!

附加

VC執行庫版本、Visual Studio版本的對應關係

  • Visual Studio 6:vc6
  • Visual Studio 2003:vc7
  • Visual Studio 2005:vc8
  • Visual Studio 2008:vc9
  • Visual Studio 2010:vc10
  • Visual Studio 2012:vc11
  • Visual Studio 2013:vc12
  • Visual Studio 2015:vc14
  • Visual Studio 2017:vc15
  • Visual Studio 2019:vc16

VC執行庫、OpenCV版本的對應關係

  • opencv 2.4.10:vc10、vc11、vc12
  • opencv 2.4.13:vc11、vc12
  • opencv 3.4.0:vc14、vc15
  • opencv 3.4.1:vc14、vc15
  • opencv 2.4.10:vc10、vc11、vc12
  • opencv 2.4.13:vc11、vc12
  • opencv 3.4.0:vc14、vc15
  • opencv 3.4.1:vc14、vc15

參考網站