OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
影像監視:在 Visual Studio 偵錯程式中檢視記憶體中的影像

上一個教程: 如何在“Microsoft Visual Studio”中使用 OpenCV 構建應用程式
下一個教程: Java 開發入門

原始作者Wolf Kienzle
相容性OpenCV >= 3.0
警告
本教程可能包含過時的資訊。

影像監視是 Microsoft Visual Studio 的一個外掛,允許您在除錯應用程式時視覺化記憶體中的影像(例如,cv::MatIplImage_ 物件)。這有助於追蹤錯誤,或者僅僅是為了理解給定的程式碼片段的作用。

先決條件

本教程假設您已具備以下條件

  1. 安裝了 Update 1 的 Visual Studio 2012 Professional(或更高版本)。Update 1 可以從此處下載。
  2. Windows 機器上安裝了 OpenCV(教程:Windows 中的安裝)。
  3. 能夠在 Visual Studio 中建立和構建 OpenCV 專案(教程:如何在“Microsoft Visual Studio”中使用 OpenCV 構建應用程式)。

安裝

下載影像監視安裝程式。(Visual Studio 2019 | Visual Studio 2017 | Visual Studio 2012、2013、2015) 安裝程式採用帶有 .vsix 副檔名的單個檔案(Visual Studio 擴充套件)。要啟動它,只需在 Windows 資源管理器中雙擊 .vsix 檔案。安裝程式完成後,請務必重新啟動 Visual Studio 以完成安裝。

示例

影像監視適用於任何使用 OpenCV 影像物件(例如,cv::Mat)的現有專案。在本示例中,我們使用一個最小的測試程式,該程式從檔案載入影像並執行邊緣檢測器。要構建程式,請在 Visual Studio 中建立一個控制檯應用程式專案,將其命名為“image-watch-demo”,然後插入以下原始碼。

// Visual Studio 影像監視偵錯程式擴充套件的測試應用程式
#include <iostream> // std::cout
#include <opencv2/core/core.hpp> // cv::Mat
#include <opencv2/imgcodecs/imgcodecs.hpp> // cv::imread()
#include <opencv2/imgproc/imgproc.hpp> // cv::Canny()
using namespace std;
using namespace cv;
void help()
{
cout
<< "----------------------------------------------------" << endl
<< "這是 Visual Studio 的影像監視偵錯程式外掛的測試程式" << endl
<< "該程式從檔案載入影像並執行 Canny 邊緣檢測器" << endl
<< "沒有輸出顯示或寫入磁碟。"
<< "沒有輸出顯示或寫入磁碟。"
<< endl
<< "用法:" << endl
<< "image-watch-demo inputimage" << endl
<< "----------------------------------------------------" << endl
<< endl;
}
int main(int argc, char *argv[])
{
help();
if (argc != 2)
{
cout << "引數數量錯誤" << endl;
return -1;
}
cout << "正在載入輸入影像:" << argv[1] << endl;
Mat input;
input = imread(argv[1], IMREAD_COLOR);
cout << "正在檢測輸入影像中的邊緣" << endl;
Mat edges;
Canny(input, edges, 10, 100);
return 0;
}
n 維密集陣列類
定義 mat.hpp:830
int main(int argc, char *argv[])
定義 highgui_qt.cpp:3
定義 core.hpp:107
STL 名稱空間。

確保您的活動解決方案配置(構建 –> 配置管理器)設定為除錯版本(通常稱為“除錯”)。這應該停用編譯器最佳化,以便在偵錯程式中檢視變數可以可靠地工作。

構建您的解決方案(構建 –> 構建解決方案,或按 F7)。

在繼續之前,不要忘記將輸入影像的命令列引數新增到您的專案(右鍵單擊專案 –> 屬性 –> 配置屬性 –> 除錯,然後使用影像的位置設定欄位命令引數)。

現在在原始碼行上設定一個斷點,該行顯示

Mat edges;

要設定斷點,請右鍵單擊原始碼行,然後從上下文選單中選擇斷點 –> 插入斷點。

在偵錯程式中啟動程式(除錯 –> 啟動除錯,或按 F5)。當命中該斷點時,程式暫停,Visual Studio 在斷點處顯示一個黃色指令指標

現在您可以檢查程式的狀態。例如,您可以調出區域性變數視窗(除錯 –> 視窗 –> 區域性變數),該視窗將顯示當前範圍內的變數的名稱和值

請注意,內建的區域性變數視窗將僅顯示文字。這是影像監視外掛發揮作用的地方。影像監視就像另一個區域性變數視窗,但內建了影像檢視器。要調出影像監視,請選擇檢視 –> 其他視窗 –> 影像監視。與 Visual Studio 的區域性變數視窗一樣,影像監視可以停靠到 Visual Studio IDE。此外,Visual Studio 會記住您是否打開了影像監視,以及它在除錯會話之間的位置。這意味著您只需執行一次此操作——下次開始除錯時,影像監視將返回到您離開的位置。這是停靠的影像監視視窗在我們的斷點處的樣子

左上角的單選按鈕(區域性變數/監視)選擇下面影像列表中顯示的內容:區域性變數列出當前範圍內的所有 OpenCV 影像物件(此列表自動填充)。監視顯示已固定以進行連續檢查的影像表示式(此處未描述,有關詳細資訊,請參閱 影像監視文件)。影像列表顯示基本資訊,例如寬度、高度、通道數以及(如果可用)縮圖。在我們的示例中,影像列表包含我們的兩個區域性影像變數 inputedges

如果影像具有縮圖,則左鍵單擊該影像將選擇它以在右側的影像檢視器中進行詳細檢視。檢視器允許您平移(拖動滑鼠)和縮放(滑鼠滾輪)。它還顯示當前滑鼠位置的畫素座標和值。

請注意,列表中的第二個影像 edges 顯示為“無效”。這表示此影像物件的某些資料成員具有損壞或無效的值(例如,負影像寬度)。這是程式中此時預期的,因為 edges 的 C++ 建構函式尚未執行,因此其成員具有未定義的值(在除錯模式下,它們通常填充“0xCD”位元組)。

從這裡您可以單步執行程式碼(除錯 -> 單步跳過,或按 F10)並觀看畫素變化:如果您單步執行一次,越過 Mat edges; 語句,則 edges 影像將從“無效”更改為“空”,這意味著它現在處於有效狀態(預設構造),即使尚未初始化(例如,使用 cv::Mat::create())。如果您再次單步執行 cv::Canny() 呼叫,您將在影像列表中看到邊緣影像的縮圖。

現在假設您要對 cv::Canny() 實現進行視覺健全性檢查。透過在影像列表中選擇 edges 影像,將其帶入檢視器,並放大具有清晰定義的邊緣的區域

右鍵單擊影像檢視器以調出檢視上下文選單,並啟用連結檢視(選單項旁邊的複選框指示該選項是否已啟用)。

當在相同大小的影像之間切換時,連結檢視功能會保持檢視區域固定。要了解其工作原理,請從影像列表中選擇輸入影像——您現在應該在輸入影像中看到相應的放大區域

您還可以使用向上/向下游標鍵在檢視輸入和邊緣之間來回切換。這樣,您可以輕鬆地驗證檢測到的邊緣是否與輸入影像中的資料很好地對齊。

更多...

影像監視具有許多更高階的功能,例如

  1. 將影像固定到監視列表中,以便跨範圍或在除錯會話之間進行檢查
  2. 直接在監視視窗內夾緊、閾值化或差異化影像
  3. 將記憶體中的影像與檔案中的參考影像進行比較

有關詳細資訊,請參閱線上 影像監視文件——您也可以透過單擊影像監視視窗中的幫助連結轉到文件頁面