opencv 如何使用natvis debug visualizer创建特定视图?

bgtovc5b  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(69)

bounty还有7天到期。回答此问题可获得+400声望奖励。touraille希望引起更多关注此问题。

我正在使用Microsoft扩展Image Watch来预览OpenCV图像。
我试图通过添加容器键来可视化容器中的图像,但是Visual Studio调试器监 windows 口不支持直接在容器中添加变量。
举例来说:

#include <opencv2/opencv.hpp>

struct MyStruct {
    cv::Mat img;
};

int main() {

    cv::Mat img(64, 64, CV_8UC3, cv::Scalar(0, 0, 255));
    map["a"].img = img;
    cv::Mat myImg = map["a"].img;
}

字符串
当我尝试通过添加到监 windows 口map["a"].img来可视化图像时,它无效。
我需要从检查/迭代Map开始添加它,直到找到所需的键:
x1c 0d1x的数据
只有输入这个名字才有效:((std::_Tree_node<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,MyStruct>,void *>*)0x0000026e1a358a70)->_Myval.second.img
经过大量的搜索,我发现了这个:Natvis framework的函数。
我想知道它是否能为这个用例工作,我以前从未使用过Natvis。
我按照教程的要求,在我的项目中添加了一个新的.natvis
Project > Add new item > Visual C++ > Utility > Debugger visualization file (.natvis).

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> 
</AutoVisualizer>


现在我完全迷路了,我已经重新阅读了示例,但我仍然无法弄清楚如何创建特定的视图,以便能够通过其键预览图像,即。map["a"].img

qoefvg9y

qoefvg9y1#

是的,Natvis框架可以帮助可视化存储在Map等容器中的OpenCV图像等对象。这里有一种方法来做到这一点:
1.在.natvis文件中,添加以下内容:

<Type Name="std::map&lt;std::string,MyStruct&gt;">
  <DisplayString>{{ size = {_Mysize} }}</DisplayString>
  <Expand>
    <Item Name="[key]">_Mypair._Myvalsecond</Item> 
  </Expand>
</Type>

<Type Name="MyStruct">
  <DisplayString>{{img}}</DisplayString>
</Type>

字符串
这告诉Visual Studio如何可视化std::map<string, MyStruct>-它将显示大小并允许扩展Map以显示存储在每个键下的MyStruct值。
1.要可视化OpenCV映像,您需要添加以下内容:

<Type Name="cv::Mat">
  <DisplayString>{{rows={rows} cols={cols} type={type()}}}</DisplayString>
  <Expand>
    <Item Name="[Image]">$T2</Item>
  </Expand>
</Type>


这将显示有关垫子的一些信息,并让您展开它以显示图像。
1.最后,在您的手表窗口中,您现在可以输入类似map["a"]的内容,并将其展开以查看键“a”下的OpenCV图像!
关键的事情是自定义Map和OpenCV Mat的可视化,以允许在调试器中扩展它们。

相关问题