如何找到图像的 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?的主要内容,如果未能解决你的问题,请参考以下文章