2012-01-18 53 views
3

我正在使用OpenCV在C++中编写项目。 我有四个顶点的坐标存储在Point2f的向量中。 我想访问这个四边形的所有像素(以检查它的区域中黑色像素的百分比是多少)。opencv-access tetragon中的所有像素

任何想法如何做到这一点?

P.S.这个四边形不是一个矩形 - 这将是小菜一碟。

编辑: 为了弄清楚事情:我想遍历四边形内的每个像素(由4个顶点给出)来访问它的RGB值。

回答

1

这种操作类似于光栅化,比如在OpenGL中绘制实际的多边形,所以任何有关光栅化的信息都可以帮助你。使用OpenGL进行光栅化会更有效率,因为显卡只有硬件,但由于您的问题是关于OpenCV的,所以我们使用OpenCV中提供的函数。首先,我们将调用cvFillConvexPoly()或cvFillPoly()与您的顶点创建一个蒙版图像,然后我们可以调用您有兴趣使用原始图像加上蒙版的任何函数。这样,当在像素上循环时,我们只需要考虑其相应掩码值不为零的像素。

+0

所以,你的意思是我应该创建与我的工作图像完全相同的其他图像大小,例如用白色,然后调用cvFillPoly()创建四边形的黑色蒙版。然后遍历图像的每个像素以查找它是否是黑色 - 这就是我如何获取四边形内的每个像素。我对你有正确的理解吗? – Wookie88 2012-01-18 09:05:11

+1

OpenCV函数使用黑色背景和白色前景的蒙版,所以我们不妨遵循该惯例,但是,您的理解是正确的。但这是一个非常普遍的过程,我们是否可以做得更好取决于您打算如何处理所有这些像素...... – 2012-01-18 13:20:42

1

我不知道我是否正确理解你的问题。

但是要找到四边形内的区域,找到四边形的轮廓并用不同的颜色填充它,然后找到具有该颜色的像素数量。这样你可以得到百分比。

或者您可以使用矩量法来找到该区域。或者试试下面的链接:

http://tech.groups.yahoo.com/group/OpenCV/message/58943 http://tech.groups.yahoo.com/group/OpenCV/message/44428

如果您要访问的四边形的每个像素,第一你可以找到它的轮廓并尝试“cvGetSeqElem”功能。尝试下面的一些代码链接:

http://osdir.com/ml/lib.opencv/2006-04/msg00044.html http://comments.gmane.org/gmane.comp.lib.opencv/15170

请告诉我,如果误解了这个问题。

+0

你已经很明白我的问题,我需要访问里面的每一个像素tetragon.So第二对你的链接有点帮助。 cvGetSeqElem可能会做的工作,但我只有它的顶点时,我怎么能得到我的四边形轮廓? – Wookie88 2012-01-18 09:20:04

+0

然后首先使用OpenCV函数绘制多边形。 1)http://opencv.itseez.com/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.html 2)http://opencv.willowgarage.com/documentation/python/drawing_functions。html#polyline 3)http://opencv.willowgarage.com/documentation/python/drawing_functions.html#fillpoly然后像往常一样,找到轮廓并使用cvGetSeqElem函数。 – 2012-01-18 14:07:39

+0

我试过findContours函数,但后来我只通过四边形的轮廓,而不是通过其内部的像素迭代。在这种情况下你能帮助我吗? – Wookie88 2012-01-19 21:17:15

1

我认为你应该做一些解析几何。你可以把你的四角形看作是两个三角形的组合。使连接两点的虚线不连通。然后,可以使用围绕它的3条线的方程来计算三角形上的点。

enter image description here

+0

您误解了这个问题。我不是在寻找我的四边形区域,我需要访问它内部的每个像素。 – Wookie88 2012-01-18 09:07:46

0

也许你可以将四边形分成两个三角形,并利用三角形光栅算法来解决这个问题.the遵循可以帮助你TriangleRasterization link

相关问题