讓 Visual C++ 2012 在偵錯的時候可以直接看到圖片的內容


一般在寫影像處理、或是多媒體的程式,如果要針對影像的內容作檢查的時候,通常都得把它畫出來、或是存成圖檔,其實相當地麻煩,不但要去改程式的內容,而且也不方便。

而現在,微軟有針對 VisualStudio 2012 推出了「Image Watch」這個外掛,可以讓 Visual Studio 在偵錯的時候,使用類似本來的監看變數的功能,針對設定好的型別、直接顯示他的影像內容、來做簡單的檢查了!

這個外掛的頁面在:http://visualstudiogallery.msdn.microsoft.com/e682d542-7ef3-402c-b857-bbfba714f78d,兒上圖就是官方的展示圖。

要使用這個外掛,需要先把 VisualStudio 2012 升級到 Update 1 以後的版本,如果要有完整的擴充功能,則需要更新到 Update 2。而在安裝好了之後,就可以在選單的「檢視」、「其他視窗」裡面,找到「Image Watch」的選項,把這個視窗叫出來;或者在偵錯模式、中斷的時候把滑鼠游標移到可以監看的變數上,在浮動的變數監看框(上右圖)上,變數的右方也會出現一個放大鏡的圖案,點下去就會自動把這個變數,加到 Image Watch 的監看清單中。

如此一來,之後如果要針對影像作偵錯的時候,就可以不需要刻意加上顯示或是輸出的程式碼,就可以直接設定中斷點,進去看圖片的內容了!這點是相當方便的!

而且,他的影像顯示功能也算滿完整的,可以放大縮小(滾輪)、也可以移動,滑鼠移上去後,也會顯示目前的座標和色彩值~甚至,也可以針對影像做簡單的操作(參考)、並且直接透過他的介面,把影像儲存成圖檔,用來做後續的驗證。這對於大部分的影像處理視覺上的檢查來說,應該算是相當夠用了。

目前的版本(1.1),主要是針對 OpenCV 做設定,直接內建支援 OpenCV 的影像格式,包括了 cv::Matcv::Mat_<>CvMat_IplImage 這幾種格式;所以如果是使用 OpenCV 來開發程式的話,是可以直接體驗到它的好處的!

如果是用其他的影像格式的話呢?基本上他也留有擴充空間,讓使用者針對自己的影像格式作去定義一個 XML 形式的 natvis 檔(參考)、讓 Image Watch 可以解讀這種格式、並把他顯示出來;這部分可以參考官方的說明(連結),實際上,Heresy 也已經成功地幫自己這邊的影像格式,寫好了專用的設定檔、並可以正常使用了~

而如果以 OpenNI2VideoStreamRef 的部分,也是可以滿簡單地透過同樣的方法,來做定義的。下面就是 Heresy 寫的內容:

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer 
  xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}"
                Id="1" MenuName="Add to Image Watch"/>
 
  <Type Name="openni::VideoFrameRef">
    <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
  </Type>
 
  <Type Name="openni::VideoFrameRef">
    <DisplayString Condition="m_pFrame==0">Empty Frame</DisplayString>
    <Expand>
      <Synthetic Name="[type]" Condition='m_pFrame->sensorType == 1'>
        <DisplayString>UINT16</DisplayString>
      </Synthetic>
      <Synthetic Name="[type]" Condition='m_pFrame->sensorType == 2'>
        <DisplayString>UINT8</DisplayString>
      </Synthetic>
      <Synthetic Name="[type]" Condition='m_pFrame->sensorType == 3'>
        <DisplayString>UINT16</DisplayString>
      </Synthetic>
      <Synthetic Name="[channels]" Condition='m_pFrame->sensorType == 1'>
        <DisplayString>1</DisplayString>
      </Synthetic>
      <Synthetic Name="[channels]" Condition='m_pFrame->sensorType == 2'>
        <DisplayString>RGB</DisplayString>
      </Synthetic>
      <Synthetic Name="[channels]" Condition='m_pFrame->sensorType == 3'>
        <DisplayString>1</DisplayString>
      </Synthetic>
      <Item Name="[width]">m_pFrame->width</Item>
      <Item Name="[height]">m_pFrame->height</Item>
      <Item Name="[data]">m_pFrame->data</Item>
      <Item Name="[stride]">m_pFrame->stride</Item>
 
    </Expand>
 
  </Type>
</AutoVisualizer>

只要把這些內容,存成一個「OpenNI2.natvis」的檔案(也可以到這邊下載),然後放到「%USERPROFILE%\My Documents\Visual Studio 2012\Visualizers\」這個資料夾裡,就可以透過 Image Watch 這個外掛,在 Visual Studio 裡面,直接看到 OpenNI 2 定義的 openni::VideoFrameRed 的影像了~

不過,由於深度影像的值的範圍有限,直接看會是一片黑的,所以需要透過圖形介面開啟「Auto Maximize Contrast」的功能(Image Watch 視窗的右鍵選單),來調整值的顯示範圍才能比較容易看的到資料。下圖就是執行時的狀況:

基本上,這樣對程式的除錯,應該會更為方便了~


不過,目前已知這個東西有兩個問題,一個比較不嚴重,是在 const 指標和參考型別上,可以把變數快速加到監看清單的放大鏡無法顯示出來。

而另一個比較糟糕的是,如果中斷的時候,「自動變數」的監看視窗裡面會顯示某個函式回傳的值、而這個值又剛好是 Image Wtach 會去做處理的型別的時候,整個 Visual Studio 會完全死當。這個問題 Heresy 一開始沒注意到,所以就讓整個 VS 當了好幾次…這個問題目前的解法,就是不要開啟、或不要切換到「自動變數」監看視窗…

而這兩個問題,預計會在下個版本的 Visual Studio 裡做修正。

對「讓 Visual C++ 2012 在偵錯的時候可以直接看到圖片的內容」的想法

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.