【OpenCV學習】之如何在“ Microsoft Visual Studio”中使用OpenCV構建應用程序

前言

該文章翻譯自官方文檔,英語水平有限,望海涵。

原文鏈接:https://docs.opencv.org/master/dd/d6e/tutorial_windows_visual_studio_opencv.html

 

正文

我在這裏描述的所有內容都適用於OpenCV的C\C ++接口。 我假設您已經閱讀併成功完成了Windows教程中的安裝。 因此,在繼續操作之前,請確保具有包含OpenCV頭文件和二進制文件的OpenCV目錄,並且已按照此處所述設置環境變量。設置OpenCV環境變量並將其添加到系統路徑

                                                             OpenCV_Install_Directory.jpg

 

在Microsoft Windows操作系統上發佈的OpenCV庫位於動態鏈接庫(DLL)中。 具有的優點是,庫的所有內容僅在運行時按需加載,並且無數程序可以使用相同的庫文件。 這意味着如果您有十個使用OpenCV庫的應用程序,則每個應用程序都不需要一個版本。 當然,您需要在要運行應用程序的所有系統上擁有OpenCV的dll。

另一種方法是使用具有lib擴展名的靜態庫。 您可以按照Windows安裝指南中的說明使用源文件來構建它們。 使用此庫時,該庫將加載到您的exe文件中。 因此,由於某種原因,用戶沒有機會刪除它們。 缺點就是您的應用程序將變得更大,並且在啓動過程中將花費更多的時間來加載它。

要使用OpenCV構建應用程序,您需要做兩件事:

  • 告訴編譯器OpenCV庫。 您可以通過使用頭文件來做到這一點。
  • 告訴鏈接器何時何地需要OpenCV的功能或數據結構。
  • 如果您使用lib,則必須設置庫文件所在的路徑並指定要在其中查找的文件之一。 在構建過程中,鏈接器將尋找這些庫並將所有已使用函數和數據結構的定義和實現添加到可執行文件中。

    如果您使用DLL系統,則必須指定所有這一切,但是現在還有其他原因。 這是Microsoft OS專用的東西。 似乎鏈接器需要知道DLL運行時在何處搜索數據結構或函數。 此信息存儲在lib文件中。 但是,它們不是靜態庫。 它們被稱爲導入庫。 這就是爲什麼當您在Windows中製作一些DLL時,您還會得到一些lib擴展庫的原因。 好的是在運行時僅需要DLL。

要將所有這些信息傳遞給Visual Studio IDE,您可以在全局(這樣所有將來的項目都將獲得此信息)或在本地(這樣纔對您當前的項目)進行。 全局的優點是您只需要執行一次。 但是,可能不希望一直將所有這些信息都包含在您的所有項目中。 如果是全局變量,您的操作取決於您使用的Microsoft Visual Studio。 有2008年和以前的版本以及2010年的方式。 在本教程的全局部分中,我將說明主要區別是什麼。

Visual Studio中項目的基本項是解決方案。 一個解決方案可能包含多個項目。 項目是應用程序的構建模塊。 每個項目都會實現一些事情,您會有一個整合所有問題的主項目。 如果有許多簡單的應用程序(就像許多教程一樣),則無需將應用程序分解爲模塊。 在這些情況下,您的主要項目將是現有唯一的項目。 現在,通過選擇文件–>新建–>項目菜單,在Visual Studio中創建一個新的解決方案。 選擇``Win32控制檯應用程序''作爲類型。 輸入名稱,然後選擇創建路徑。 然後確保在接下來的對話框中創建一個空項目。

                                                 NewProjectVisualStudio.jpg

本地方法

每個項目都與其他項目分開構建。因此,每個項目都有自己的規則。在此規則中存儲了IDE有關構建項目所需的所有信息。對於任何應用程序,至少都有兩種構建模式:一種發佈(Release)和一種調試(Debug)模式。調試具有許多功能,因此您可以在應用程序中查找和解決一些簡單的錯誤。相反,Release是一個優化版本,其目標是使應用程序儘可能快地運行或儘可能小。您可能會發現,在構建過程中,這些模式還需要使用不同的規則。因此,每種構建模式都有不同的規則。這些規則在IDE中稱爲項目屬性,您可以使用屬性管理器查看和修改它們。您可以使用“視圖”->“屬性頁面”(對於Visual Studio 2013及更高版本,請轉到“視圖”->“其他Windows”->“屬性管理器”)啓動此功能。展開它,您可以看到現有的規則包(稱爲屬性表)。

                                                                  PropertyPageExample.jpg

這些真正有用之處是您可以一次創建一個規則,以後可以將其添加到新項目中。 一次創建一次,以後再使用。 我們要創建一個新的屬性表,其中將包含編譯器和鏈接器需要知道的所有規則。 當然,我們將需要一個單獨的調試版本和發佈版本。 如下圖所示,使用Debug啓動:

                                                                  AddNewPropertySheet.jpg

例如使用OpenCV_Debug名稱。 然後通過選擇工作表右鍵單擊–>屬性。 在下面的內容中,我將展示如何在本地設置OpenCV規則,因爲我發現不必要用我不使用的自定義規則去污染項目。 轉到C ++組的“常規”條目,然後在*“其他包含目錄” *下,將路徑添加到您的OpenCV包含。 如果沒有*“ C/C ++” *組,則應將任何.c/.cpp文件添加到項目中。

$(OPENCV_DIR)\..\..\include

                                        PropertySheetOpenCVInclude.jpg

添加第三方庫設置時,通常最好使用環境變量的功能。 OpenCV庫的完整位置可能會在不同系統上發生變化。 此外,由於某種原因,您甚至可能最終會移動安裝目錄。 如果在屬性表中提供明確的路徑,則當您將其進一步傳遞給具有不同OpenCV安裝路徑的其他人時,項目最終將無法正常工作。 此外,解決此問題需要手動修改每個顯式路徑。 一個更優雅的解決方案是使用環境變量。 放在括號中的任何以美元符號開頭的內容都將在運行時被當前環境變量值替換。 設置OpenCV環境變量並將其添加到系統路徑中。

接下來轉到鏈接器–>常規,然後在*“其他庫目錄” *下添加libs目錄:

$(OPENCV_DIR)\lib

                                     PropertySheetOpenCVLib.jpg

然後,您需要指定鏈接器應在其中查找的庫。 爲此,請轉到鏈接器–>輸入,並在*“其他依賴項” *條目下添加要使用的所有模塊的名稱:

                                      PropertySheetOpenCVLibrariesDebug.jpg 

這些庫的名稱如下:

opencv_(The Name of the module)(The version Number of the library you use)d.lib

最新版本的完整列表將包含:

opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videoio300d.lib
opencv_videostab300d.lib

或者,您的OpenCV下載文件可能已內置到一個大的.lib文件中。 通過查看OpenCV \ build \ architecture \ vc14 \ lib進行檢查。 在這種情況下,對於版本3.3.0,您只需添加以下內容:

opencv_world330.lib

最後的字母d表示這些是debug調試所需的庫。 現在,單擊“確定”保存並使用“發佈規則”部分中的新屬性進行相同操作。 確保忽略庫名稱中的d字母,並使用上方的保存圖標保存屬性表。

                                                PropertySheetOpenCVLibrariesRelease.jpg

您可以在項目目錄中找到屬性表。 在這一點上,明智的決定是將它們備份到某個特殊目錄中,以便以後在每次創建OpenCV項目時始終可以使用它們。 請注意,對於Visual Studio 2010,文件擴展名是props,而對於2008,文件擴展名是vsprops。

                                                           PropertySheetInsideFolder.jpg

下次創建新的OpenCV項目時,只需使用屬性管理器中的“添加現有屬性表...”菜單項即可輕鬆添加OpenCV構建規則。

                                                            PropertyPageAddExisting.jpg

全局方法

如果您發現將屬性頁添加到每個項目中太麻煩了,您還可以將此規則添加到*“全局屬性頁” *中。 但是,這僅適用於其他包含和庫目錄。 您仍需要使用以下屬性手動指定要使用的庫的名稱:“屬性”頁面。

在Visual Studio 2008中,您可以在以下位置找到此工具:工具–>選項–>項目和解決方案–> VC ++目錄。

                                            VCDirectories2008.jpg

在Visual Studio 2010中,該屬性已移至全局屬性表,該屬性表會自動添加到您創建的每個項目中:

                                                                    VCDirectories2010.jpg

該過程與本地方法中描述的過程相同。 只需使用環境變量OpenCV_DIR添加包含目錄。

測試一下!

現在嘗試一下,下載我們的小測試源代碼,或者從OpenCV源的示例代碼文件夾中獲取它。 將此添加到您的項目並進行構建。 其內容如下:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
    if( argc != 2)
    {
        cout <<" Usage: " << argv[0] << " ImageToLoadAndDisplay" << endl;
        return -1;
    }
    Mat image;
    image = imread(argv[1], IMREAD_COLOR); // Read the file
    if( image.empty() ) // Check for invalid input
    {
        cout << "Could not open or find the image" << std::endl ;
        return -1;
    }
    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
    imshow( "Display window", image ); // Show our image inside it.
    waitKey(0); // Wait for a keystroke in the window
    return 0;
}

您可以從兩個地方開始Visual Studio構建。 在IDE的內部(鍵盤組合:Control-F5)或導航至構建目錄並雙擊啓動應用程序。 值得注意的是,這兩個並不相同。 從IDE啓動時,它的當前工作目錄是項目目錄,否則是應用程序文件當前所在的文件夾(通常是您的構建目錄)。 此外,如果從IDE啓動,則控制檯窗口一旦完成將不會關閉。 它將等待您的按鍵。

當您在代碼內部打開和保存命令時進行編碼時,記住這一點很重要。 您的資源將相對於您的工作目錄保存(並在打開時查詢!!!)。 除非您給出完整的顯式路徑作爲I / O功能的參數,否則這是必須的。 在上面的代碼中,我們打開此OpenCV徽標。 在啓動應用程序之前,請確保將映像文件放置在當前工作目錄中。 修改代碼中的圖像文件名,以在其他圖像上進行嘗試。 運行它並掩飾á:

                                                      SuccessVisualStudioWindows.jpg

Visual Studio的命令行參數

在其他一些教程中,您將看到程序的主要輸入法是通過提供運行時參數。 爲此,您可以僅啓動命令窗口(在開始菜單中使用cmd + Enter),導航到可執行文件並使用參數啓動它。 因此,例如在我的上層項目中,它看起來像:

D:
CD OpenCV\MySolutionName\Release
MySolutionName.exe exampleImage.jpg

在這裏,我首先更改了驅動器(如果您的項目不在OS本地驅動器上),導航到我的項目並使用示例圖像參數啓動它。 在Linux系統下,經常在Microsoft Windows上弄亂控制檯窗口是很常見的,許多人幾乎從未使用過它。 此外,在測試應用程序時一次又一次地添加相同的參數在某種程度上是一項繁瑣的任務。 幸運的是,在Visual Studio中,有一個菜單可以自動執行所有操作:                                                       VisualStudioCommandLineArguments.jpg 

在此處指定輸入的名稱,並在從Visual Studio環境啓動應用程序時自動傳遞參數。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章