OpenCV:如何在多边形中找到像素?

gal*_*ica 4 opencv

假设我们正在处理前景为黑色且背景为白色的二进制图像.有没有有效的方法在多边形中找到黑色像素,这是由顶点坐标列表指定的?

从多边形计算边界框并不理想,因为可能存在许多紧密位移的多边形,其边界框可能重叠.

当然,蛮力方式将首先从整个图像中找到黑色像素,然后对每个黑色像素运行多边形测试,这对于任务而言太耗时.

欢迎任何建议!

谢谢!

Phi*_*all 6

根据您的工作流程或最终目标,以下内容可能适合您.

使用cvFillPoly创建多边形的二进制掩码,然后使用cvCopy要使用创建的粉饰出来阵列面具,因此只有黑色的像素是指那些在多边形图像的副本.

或者不使用pointPolygonTest你可以使用光线投射算法,只检查像素是否为黑色,如果你有一个奇数的交叉点.

自己进行光线投射算法可以比调用pointPolygonTest节省大量时间.

您可能会遇到一个点所在的扫描线具有占据整个线的多边形的情况.

光线投射算法从一侧计算多边形线交叉,直到它到达被测点.如果有m个线段,我们执行m个线段光线交叉,对它们进行排序,并计算发生了多少个.

如果使用pointPolygonTest,则必须为每个点执行此操作,但是您为此线上的n个点测试的所有光线都与该线相交,并且它们与线段的交点全部出现在同一位置,因此您可以通过自己编写算法来保存所有这些重新计算,并在交叉次数为奇数时对其进行扩充以检查黑色像素.