Image Watch:在Visual Studio調(diào)試器中查看內(nèi)存中的圖像

2018-08-28 15:09 更新

Image Watch是Microsoft Visual Studio的插件,可讓您在調(diào)試應(yīng)用程序時,可視化內(nèi)存映像(例如,cv :: Mat或IplImage_對象)。這可能有助于跟蹤錯誤,或者簡單地了解給定的代碼塊在做什么。

先決條件

本教程假設(shè)您有以下可用:

  1. Visual Studio 2012 Professional(或更好)安裝Update 1。
  2. Windows機(jī)器上的OpenCV安裝(教程:在Windows中安裝)。
  3. 能夠在Visual Studio中創(chuàng)建和構(gòu)建OpenCV項目(教程:如何使用OpenCV在“Microsoft Visual Studio”中構(gòu)建應(yīng)用程序)。

安裝

下載 Image Watch安裝程序。安裝程序在一個擴(kuò)展名為.vsix(Visual Studio Extension)的文件中。要啟動它,只需在Windows資源管理器中雙擊.vsix文件即可。安裝程序完成后,請確保重啟Visual Studio以完成安裝。

Image Watch與任何使用OpenCV圖像對象(例如,cv :: Mat)的現(xiàn)有項目配合工作。在這個例子中,我們使用一個最小的測試程序來加載文件中的圖像并運行一個邊緣檢測器。要構(gòu)建程序,請在Visual Studio中創(chuàng)建一個控制臺應(yīng)用程序項目,將其命名為“image-watch-demo”,并在下面插入源代碼。

// Test application for the Visual Studio Image Watch Debugger extension
#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
        << "This is a test program for the Image Watch Debugger " << endl
        << "plug-in for Visual Studio. The program loads an     " << endl
        << "image from a file and runs the Canny edge detector. " << endl
        << "No output is displayed or written to disk."
        << endl
        << "Usage:"                                               << endl
        << "image-watch-demo inputimage"                          << endl
        << "----------------------------------------------------" << endl
        << endl;
}
int main(int argc, char *argv[])
{
    help();
    if (argc != 2)
    {
        cout << "Wrong number of parameters" << endl;
        return -1;
    }
    cout << "Loading input image: " << argv[1] << endl;
    Mat input;
    input = imread(argv[1], IMREAD_COLOR);
    cout << "Detecting edges in input image" << endl;
    Mat edges;
    Canny(input, edges, 10, 100);
    return 0;
}

確保您的主動解決方案配置(Build - > Configuration Manager)設(shè)置為調(diào)試版本(通常稱為“調(diào)試”)。這應(yīng)該禁用編譯器優(yōu)化,以便在調(diào)試器中查看變量可以可靠地工作。

構(gòu)建您的解決方案(Build - > Build Solution,或按F7)。

在繼續(xù)之前,不要忘記將輸入圖像的命令行參數(shù)添加到項目中(右鍵單擊項目 - >屬性 - >配置屬性 - >調(diào)試,然后將字段命令參數(shù)設(shè)置為圖像的位置)。

現(xiàn)在在源代碼行設(shè)置一個斷點

Mat edges;

要設(shè)置斷點,請右鍵單擊源代碼行,然后從上下文菜單中選擇斷點 - >插入斷點。

在調(diào)試器中啟動程序(調(diào)試 - >啟動調(diào)試,或按F5)。當(dāng)斷點被擊中時,程序暫停,Visual Studio在斷點處顯示一個黃色指令指針:

Image Watch

現(xiàn)在你可以檢查你的程序狀態(tài)。例如,您可以打開本地窗口(Debug - > Windows - > Locals),該窗口將顯示當(dāng)前范圍中變量的名稱和值:

Image Watch

請注意,內(nèi)置的“ 本地”窗口將僅顯示文本。這是Image Watch插件所在的位置。Image Watch就像另一個Locals窗口,但內(nèi)置了一個圖像查看器。要啟動Image Watch,請選擇View - > Other Windows - > Image Watch。像Visual Studio的“ 本地”窗口一樣,Image Watch可以??吭赩isual Studio IDE上。此外,Visual Studio會記住您是否打開了Image Watch,以及調(diào)試會話之間的位置。這意味著您只需要執(zhí)行一次 - 下次開始調(diào)試時,Image Watch將返回到您離開的地方。這是??吭趫D像監(jiān)視窗口在我們的斷點:

在Visual Studio調(diào)試器中查看內(nèi)存中的圖像

左上角的單選按鈕(Locals / Watch)選擇下面的圖像列表中顯示的內(nèi)容:Locals列出了當(dāng)前范圍內(nèi)的所有OpenCV圖像對象(該列表自動填充)。手表顯示已被固定為連續(xù)檢查的圖像表達(dá)式(此處未說明,有關(guān)詳細(xì)信息,請參閱Image Watch文檔)。圖像列表顯示基本信息,如寬度,高度,通道數(shù),以及可用的縮略圖。在我們的示例中,圖像列表包含我們的兩個局部圖像變量,輸入和邊。

如果圖像具有縮略圖,則左鍵單擊該圖像將在右側(cè)的圖像查看器中選擇它進(jìn)行詳細(xì)查看。觀看者可以平移(拖動鼠標(biāo))和縮放(鼠標(biāo)滾輪)。它還顯示當(dāng)前鼠標(biāo)位置的像素坐標(biāo)和值。

在Visual Studio調(diào)試器中查看內(nèi)存中的圖像

請注意,列表中的第二個圖像邊緣顯示為“無效”。這表示該圖像對象的某些數(shù)據(jù)成員具有損壞或無效的值(例如,負(fù)圖像寬度)。由于C ++構(gòu)造器的邊緣尚未運行,因此其成員具有未定義的值(在調(diào)試模式下,通常使用“0xCD”字節(jié)填充)。

從這里,您可以單步執(zhí)行代碼(Debug-> Step Over,或按F10)并觀察像素更改:如果您在Mat邊緣上步一次; 語句,邊緣圖像將從“無效”變?yōu)椤翱铡保@意味著它現(xiàn)在處于有效狀態(tài)(默認(rèn)構(gòu)造),即使尚未被初始化(使用cv :: Mat :: create(), 例如)。如果您再次進(jìn)行cv :: Canny()調(diào)用,您將看到邊緣圖像的縮略圖顯示在圖像列表中。

現(xiàn)在假設(shè)你想對cv :: Canny()實現(xiàn)進(jìn)行視覺完整性檢查。將邊緣圖像通過在圖像列表中選擇并放大到具有明確界限的區(qū)域:

在Visual Studio調(diào)試器中查看內(nèi)存中的圖像

右鍵單擊圖像查看器以顯示視圖上下文菜單并啟用鏈接視圖(菜單項旁邊的復(fù)選框指示是否啟用該選項)。

在Visual Studio調(diào)試器中查看內(nèi)存中的圖像

當(dāng)在相同大小的圖像之間翻轉(zhuǎn)時,鏈接視圖功能會使視圖區(qū)域固定。要了解如何工作,請從圖像列表中選擇輸入圖像,您現(xiàn)在應(yīng)該看到輸入圖像中相應(yīng)的放大區(qū)域:

在Visual Studio調(diào)試器中查看內(nèi)存中的圖像

您也可以使用上/下光標(biāo)鍵在觀看輸入和邊緣之間來回切換。這樣,您可以輕松地驗證檢測到的邊緣與輸入圖像中的數(shù)據(jù)很好地對齊。

更多 ...

圖像手表具有許多更先進(jìn)的功能,如

  1. 將圖像固定到監(jiān)視列表,以便在示波器之間或調(diào)試會話之間進(jìn)行檢查
  2. 在Watch窗口內(nèi)直接夾緊,閾值或分割圖像
  3. 將內(nèi)存中的圖像與來自文件的參考圖像進(jìn)行比較

有關(guān)詳細(xì)信息,請參閱在線圖像監(jiān)視文檔 - 您還可以通過單擊“圖像監(jiān)視”窗口中的“ 幫助”鏈接訪問文檔頁面:

help_button


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號