如何找到图像的 Non-Square ROI?

Posted

技术标签:

【中文标题】如何找到图像的 Non-Square ROI?【英文标题】:How to find the Non-Square ROI of an image? 【发布时间】:2014-07-07 21:00:03 【问题描述】:

我正在寻找一种方法来找到一个非方形的感兴趣区域。我在这里看到了所有基于矩形的示例。例如here they find the tilted rectangle。我看过像 this SO page 这样的代码示例,当您将鼠标从一个角落拖到另一个角落时,它们会绘制一个矩形。

我的目标是拍一张像下面这样的图像,然后用手勾勒出道路。这是可能的还是我只需要在它上面画一个矩形?

编辑:我最初的想法是建立在其中一种算法的基础上,而不是将鼠标单击标记为角,我认为我可以将访问的每个点存储在向量中。然后我可以使用 cv::Mat 来填充两者之间的所有点。不确定它是否会起作用,但这是一个开始。

【问题讨论】:

【参考方案1】:

顺便说一句,图片不错。因此,通常使用盒子,因为它们很简单。但是正如您正确指出的那样,它们对于道路和天空等无定形的“东西”并不是那么好。你有几个选择。

    创建一个与原版大小相同的蒙版图像。图像,并且对于图像中作为“道路”的每个像素,在掩码中将其设置为 1,否则为零,这类似于在图像中“着色”,就像孩子在着色书中一样。

    使用大致围绕道路边界的多边形。多边形中的点越多,分割越准确。

我通常在 GIMP 中做这种事情,然后将遮罩加载到 OpenCV 中。对于一个完整的 OpenCV 小鬼,我怀疑你可能需要深入研究支持的 QT 或 OpenGL 来制作一个小的图像编辑工具。

我在这里找到了一个 QT 链接 http://qt-project.org/doc/qt-4.8/opengl-2dpainting.html

但请注意,我自己并没有尝试实现这样的事情,我的回答只是让您了解两种尝试的可能性。

【讨论】:

嘿抱歉花了一段时间才回来,但感谢您的意见。我考虑使用 QT 来生成 ROI,可能仍然会但从未搞砸过。【参考方案2】:

你也可以用你的图片绘制一个窗口,然后调用:

cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param=NULL )

每次单击列表、数组、字典中的 x、y 位置时保存,无论您想要什么 :)。使用此信息构建一个新的 Mat 作为掩码。使用多边形进行近似:

// Create Polygon from vertices
vector<Point> ROI_Poly;
approxPolyDP(ROI_Vertices, ROI_Poly, 1.0, true);

// Fill polygon white
fillConvexPoly(mask, &ROI_Poly[0], ROI_Poly.size(), 255, 8, 0);       

更多信息在这里:

http://www.pieter-jan.com/node/5

【讨论】:

哇,好漂亮。 很抱歉延迟回信,但这非常有效。感谢您的帮助。【参考方案3】:

如果您想手动标记区域,则可以使用图形图像编辑环境(如 GIMP、Photoshop 或 MATLAB)来省去麻烦。

【讨论】:

他已经明确提到使用 OpenCV

以上是关于如何找到图像的 Non-Square ROI?的主要内容,如果未能解决你的问题,请参考以下文章

如何裁剪图像的 roi

在openCV中,如何替换图像中的RGB ROI

我如何保存图像和 roi 来训练分类器

如何在 OpenCV c++ 中从图像中裁剪特定的矩形部分(ROI)

如何在不同大小的矩形中裁剪相同的 ROI

Opencv:如何计算矩形向量的镜像