1. OpenCV 4.2.0 圖像監視 —— 在 Visual Studio 調試器中查看內存中的圖像(OpenCV 官方文檔翻譯)

官方文檔鏈接:https://docs.opencv.org/4.2.0/d4/d14/tutorial_windows_visual_studio_image_watch.html


圖像監視是 Microsoft Visual Studio 的一個插件,可以用於在調試應用程序時可視化內存中的圖像。(例如,cv::Mat 或者 IplImage_ 對象)。可以有效地跟蹤漏洞或者簡單的理解代碼功能。


先決條件 (Prerequisites)

你需要具備的條件:

  1. Visual Studio 2012 專業版或者更高版本。
  2. 已經安裝了 OpenCV
  3. 具備在 Visual Studio 中創建 OpenCV 項目的能力

安裝 (Installation)

這裏下載圖像監視安裝器。安裝器是一個單獨的文件,擴展名爲 .vsix (Visual Studio 的擴展程序)。直接在 Windows 資源管理器中雙擊 .vsix 文件來啓動它。當安裝完畢,重啓 Visual Studio 來完成安裝。

注意
在 Visual Studio 2019 Professional 版本中,可能採用上述方式無法安裝圖像監控器,可採用如下方式:

  1. 點擊 Visual Studio 2019 界面上部的 “擴展” --> “管理擴展”
    在這裏插入圖片描述

  2. 在新窗口中選擇 “聯機”,在右上角搜索欄中輸入 “Image Watch”
    在這裏插入圖片描述

  3. 點擊 “Image Watch 2019” 並下載安裝即可


示例 (Example)

圖像監視器適用於使用 OpenCV 圖像對象 (例如:cv::Mat) 的現有項目。在這個示例中,我們使用最小的測試程序來從文件中加載圖像並運行邊緣檢測。爲了開發這個程序,需要在 Visual Studio 中創建控制檯應用程序,命名爲 “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()
#include <opencv2/highgui/highgui.hpp>      // cv::imshow(), cv::waitKey()
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);

    imshow("input", input);
    waitKey(0);
    return 0;
}

請確保你的活動解決方案配置(生成 -> 配置管理器)設置爲調試構建(通常稱爲“調試”)。

構建你的解決方案(生成 -> 生成解決方案)

在繼續之前,先要在 VS 中添加命令行參數,也就是程序中要使用的輸入圖像(右鍵項目 -> 屬性 -> 配置屬性 -> 調試,在 “命令參數” 中填寫圖像文件位置。

在這裏插入圖片描述
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sGxYVGhP-1584098454057)(02CCB6A46717444E93E978A8EA52C862)]

運行結果
在這裏插入圖片描述

現在在如下行前面加斷點。

Mat edges;

在這一行上右鍵,在右鍵菜單中選擇 “斷點” -> “插入斷點” 來添加斷點。

在調試器中啓動程序(調試 -> 開始調試,或者按 F5)。當運行到斷點,程序會暫停。此時,Visual Studio 會在斷點處顯示黃色指令指針:
在這裏插入圖片描述
現在可以查看程序的狀態。例如,可以打開本地窗口(調試 -> 窗口 -> 自動窗口),VS 將顯示當前範圍內的變量的名稱和值。
在這裏插入圖片描述
注意,內置的 “自動窗口” 將只顯示文本。使用 Image Watch 插件,像是使用另一個 “自動窗口”,但內置了圖像查看器。選擇 “視圖” -> “其他窗口” -> “Image Watch” 將運行 Image Watch。
在這裏插入圖片描述
像是 Visual Studio 的自動窗口一樣,Image Watch 可以停靠在 Visual Studio IDE 中。
在這裏插入圖片描述
此外,Visual Studio 將記錄是否打開過 Image Watch,以及它在調試會話之間的位置。這意味着你只需要打開一次,下一次你啓動調試時,Image Watch 將回到你離開它的位置。

左上角的單選按鈕(Locals / Watch)用於選擇圖像列表中現實的內容:Locals 列出了當前作用域內的所有 OpenCV 圖像對象(這個列表將自動填充)。Watch 顯示了已固定以進行連續檢查的圖像表達式(此處未描述,請參閱 Image Watch 文檔瞭解詳細信息)。圖像列表顯示基本信息,如寬度、高度、通道數量以及縮略圖(如果可以的話)。在這個示例中,圖像列表包含兩個局部圖像變量 input 和 edges。

如果圖像列表中顯示了縮略圖,單擊圖像將選中它並在右邊的圖像監視器中顯示以進行詳細地查看。監視器允許平移(拖動鼠標)和縮放(鼠標滾輪)。它還顯示了當前鼠標位置的像素座標和值。

在這裏插入圖片描述
注意在列表中的第二幅圖像,edges,顯示 “invalid”。這表示這個圖像對象的某些數據成員的值已損壞或者爲無效值(例如,圖像寬度爲負數)。在此程序中,這種現象是合理的,因爲 edges 的 C++ 構造函數還沒有運行,因此它的成員有未定義的值(在調試模式中,它們通常填充有 “0xCD” 字節)。

從此斷點處開始,你可以但不調試代碼並觀察像素變化:如果在 “Mat edges” 上單步執行一次,則 edges 圖像的狀態將從 “invalid” 更改爲 “empty”,這意味着它現在處於有效狀態(默認構造),即使它尚未被初始化(例如,使用 cv::Mat::create())。如果在 cv::Canny() 調用上再執行一步,你將在圖像列表中看到 edges 圖像的縮略圖。

現在假設你想對 cv::Canny() 實現過程進行一次可視化健全性檢查。通過在圖像列表中選擇 edges 圖像,將其帶到監視器中,並縮放到具有清晰定義邊緣的區域。

在這裏插入圖片描述
在圖像查看器上右鍵打開菜單啓用鏈接視圖。

在這裏插入圖片描述

“鏈接視圖” 的功能是可以在相同尺寸大小的圖像之間翻轉時保持視圖區域的固定。若要查看它的工作原理,請從圖像列表中選擇 input 圖像,你現在應該可以看到 input 圖像相應的區域。

先放大 edges 圖像,調整區域
在這裏插入圖片描述

查看 input 圖像
在這裏插入圖片描述

可以看到相應的區域。

也可以使用上下方向鍵來回切換以查看 input 和 edges 圖像,這樣就可以很容易地驗證檢測到的邊緣是否與輸入圖像中的數據很好地對齊。


更多 (More) …

Image Watch有很多更先進的功能,例如:

  1. 將圖像固定到監視列表以便於跨作用域或在調試會話之間進行檢查。
  2. 直接在監視器窗口內夾緊、閾值化或差異化圖像。
  3. 將內存中的圖像映像與文件中的引用映像進行比較。

有關詳細信息,請參考在線 Image Watch 文檔,亦可以在圖像監視器窗口中點擊 “Help” 鏈接訪問文檔頁。

在這裏插入圖片描述

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