【问题标题】:How to see image data using opencv in visual studio?如何在 Visual Studio 中使用 opencv 查看图像数据?
【发布时间】:2012-08-10 12:10:21
【问题描述】:

我在 VS2010 中编写了一个 OPENCV 项目,结果与我预期的不一样,所以我运行调试器来查看问题出在哪里。当我想查看加载的图像中的数据时,我不知道该怎么做,所以如果我想查看图像中的数据,我应该怎么做? 在 matlab 中查看图像的不同通道非常简单,即

a=imread('test.jpg');
p1 = a(:,:,1)
p2 = b(:,:,2)

.
.

在 opencv 中我写了同样的东西,但我不知道如何像 Matlab 一样一次看到所有元素。

a= imread("test.jpg")
split(a,planes);
    vector<Mat> T1;
    T1 = planes[0];  

//调试代码时如何查看T1里面的数据?

【问题讨论】:

标签: image visual-studio-2010 debugging opencv


【解决方案1】:

我认为这就是您正在寻找的 - 这是一个很棒的 Visual Studio 插件

https://bitbucket.org/sergiu/opencv-visualizers

只需下载安装程序,确保 VS 已关闭,运行它,重新打开 VS,瞧!现在,当您指向 OpenCV 数据结构时,会显示各种漂亮的信息。

限制:我发现多通道图像存在一些问题(它仅显示第一个通道),并且在显示大型矩阵时也存在问题。如果您想查看大矩阵中的原始数据,可以使用带有调试变量的旧 VS 技巧:在断点处停止,转到 Watch 选项卡,然后在此处写入

((float*)myMat.data) ,10

其中 float 是矩阵类型,myMat 是您的矩阵,10 是您要打印的值的数量。它将在 myMat.data 的内存位置显示前 10 个值。如果你没有正确选择数据类型,你会看到垃圾。在我的示例中,myMat 的类型为 cv::Mat。

永远不要忘记可视化工具的力量:

imshow("Image", myMat);

如果您的数据适合图像。您可以使用 contrib 模块的颜色图来增强您的可视化工具。

【讨论】:

  • 只是一个问题 - Image Watch 也绘制了实际图像 - 请参阅链接中屏幕截图中的橙色和其他水果。 opencv-visualizers 做同样的事情吗?因为我正在寻找那个功能,一开始我认为 opencv-visualizers 确实可以做到这一点,但现在我安装了它,我怀疑它没有,它只是以稍微更好的方式显示数据。
【解决方案2】:

我真的不敢相信还没有人建议Image Watch。这是有史以来最神奇的插件。它在调试时向您显示包含所有 Mat 变量(图像(灰色和颜色)、矩阵)的视图,其中包含缩放或对比度拉伸等有用的东西,您甚至可以直接在插件中实时应用更复杂的功能。它使任何类型的图像操作的调试变得轻而易举,如果您使用 cv::Mat 矩阵进行计算和线性代数,它会非常有帮助。

【讨论】:

  • 不过,它需要 VS2012,所以它不适用于 VS2010(这是 OP 正在使用的,顺便说一句,我也是)。
  • 好吧,如果你没有一个非常好的理由来使用 VS2010,那么无论如何你都应该升级,如果不是为了插件,那么为了标准一致性。现在有一个免费的 VS2013 社区版。
  • 其实我发现 NativeViewer 适用于 VS2010 - stackoverflow.com/questions/27156160/…
【解决方案3】:

我建议使用NativeViewer 扩展名。它实际上在预览窗口中显示图像的内容,而不仅仅是格式正确的信息。

【讨论】:

    【解决方案4】:

    如果您不想使用 Visual Studio 的插件或扩展,可以通过键入以下内容在调试监视选项卡中逐个访问元素:

    T1.data[T1.step.buf[0]*i + T1.step.buf[1]*j];

    其中 i 是您要查看的行,j 是列。

    【讨论】:

      【解决方案5】:

      下载 imagewatch 后使用 watch 窗口中的命令 (imagesLoc._Myfirst)[0]

      向量中图像的索引

      【讨论】:

        【解决方案6】:

        你可以像这样使用立即窗口和扩展方法

            /// <summary>
            /// Displays image
            /// </summary>
            public static void Display (this Mat m, Rect rect = default, string windowName = "")
            {
                if (string.IsNullOrEmpty(windowName))
                {
                    windowName = m.ToString();
                }
                var img = rect == default ? m : m.Crop(rect);
        
                double coef = Math.Min(1600d / img.Width, 800d / img.Height);
        
                Cv2.ImShow(windowName, img.Resize(new Size(coef * img.Width, (coef * img.Height) > 1 ? coef * img.Height : 1)));
                Cv2.WaitKey();
            }
        

        然后在断点处停止并在即时窗口中调用 yourImage.Display()。

        【讨论】:

          【解决方案7】:

          如果您可以使用 CLion,则可以使用 OpenCV Image Viewer 插件,该插件在调试时只需单击即可显示矩阵。

          https://plugins.jetbrains.com/plugin/14371-opencv-image-viewer

          【讨论】:

            猜你喜欢
            • 2012-02-10
            • 2012-06-26
            • 2013-02-01
            • 2012-08-22
            • 2021-06-06
            • 2010-10-29
            • 2023-04-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多