使用OpenCV访问四边形中的所有像素

3
我正在使用OpenCV和C++编写一个项目。我在Point2f向量中存储了四个四边形顶点的坐标。我想要访问该四边形的所有像素(以检查其面积内黑色像素的百分比)。您有什么好的想法吗?
附言:这个四边形不是矩形,否则这将非常容易。
编辑:为了更清晰地表达,我想遍历四个顶点给出的四边形内的每个像素,以访问其RGB值。
4个回答

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

请告诉我是否误解了问题。


你已经相当理解我的问题了,我需要访问四边形内的每个像素。因此,你提供的第二组链接有点有用。cvGetSeqElem可能会起作用,但是当我只有它的顶点时,我该如何获得四边形的轮廓? - Wookie88
然后使用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函数。 - Abid Rahman K
我尝试使用findContours函数,但我只遍历四边形的轮廓而不是其中的像素。你能在这种情况下再帮我吗? - Wookie88
它是用Python而不是C++编写的,但我理解你的想法。这与Samuel Audet提供的解决方案非常相似。我正在寻找更复杂和更自动化的东西,但我认为没有其他方法可以做到这一点。 - Wookie88

1

这种操作类似于光栅化,例如在OpenGL中用于绘制实际的多边形,因此任何关于光栅化的信息都可以帮助您。使用OpenGL进行光栅化会更有效,因为显卡有专门的硬件来处理,但由于您的问题涉及OpenCV,让我们使用OpenCV中可用的函数。

首先,我们将使用您的顶点调用cvFillConvexPoly()或cvFillPoly()来创建掩膜图像,然后我们可以调用您感兴趣的任何函数来处理原始图像和掩膜。这样,在循环像素时,我们只需要考虑相应掩膜值不为零的像素。


那么你的意思是我应该创建其他与我的工作图像完全相同大小的图像,并用白色填充它,然后调用cvFillPoly()来创建四边形的黑色掩码。然后迭代图像的每个像素,以查找它是否为黑色-这就是我如何获得四边形内的每个像素。我理解你的意思了吗? - Wookie88
1
OpenCV函数使用黑色背景和白色前景的掩码,因此我们最好遵循这个惯例,但是,是的,您的理解是正确的。但这是一个非常通用的过程,我们能否做得更好取决于您打算如何处理所有这些像素... - Samuel Audet

1

我认为你应该进行一些解析几何。你可以将四边形看作两个三角形的组合。连接两个未相连的点,形成一条虚拟线。然后,你可以使用围绕它的三条直线的方程计算三角形上的点。

enter image description here


你误解了问题。我不是在寻找四边形的面积,我需要访问其中每一个像素。 - Wookie88

0
也许你可以将四边形分成两个三角形,并使用三角形光栅化算法来解决问题。以下可能会对你有所帮助:TriangleRasterization link

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接