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

2018-08-28 15:09 更新

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

先決條件

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

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

安裝

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

Image Watch與任何使用OpenCV圖像對(duì)象(例如,cv :: Mat)的現(xiàn)有項(xiàng)目配合工作。在這個(gè)例子中,我們使用一個(gè)最小的測(cè)試程序來(lái)加載文件中的圖像并運(yùn)行一個(gè)邊緣檢測(cè)器。要構(gòu)建程序,請(qǐng)?jiān)赩isual Studio中創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序項(xià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;
}

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

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

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

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

Mat edges;

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

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

Image Watch

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

Image Watch

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

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

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

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

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

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

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

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

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

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

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

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

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

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

更多 ...

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

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

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

help_button


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)