如何找到图像的非平方ROI?

时间:2014-07-07 21:00:04

标签: c++ opencv image-processing motion-detection roi

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

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

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

Long Windy Road

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

    但是请注意我自己没有尝试过这样的事情,我的回答只是让你知道尝试两种可能性。

答案 1 :(得分:1)

您还可以使用图像绘制一个窗口,然后调用:

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

答案 2 :(得分:0)

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