我在我的图像上画了一个圆圈,我想找到圆和特定轮廓相交的任何点。
我如何找到轮廓和圆之间的交叉点?
由于
答案 0 :(得分:2)
好的,这里有一个关于如何做到这一点的想法:
如果您知道圆的中心和半径,也可以通过CV_CHAIN_APPROX_NONE :
Translates all the points from the chain code into points.
获得您拥有的轮廓
然后你可以简单地浏览序列的所有点,看看哪些点与圆心相等于半径。(可以有两个以上的交点)
如果没有使用CV_CHAIN_APPROX_NONE获得轮廓,那么你可以检查序列中的每对2点并处理那些有一个外部(距离高于半径)和一个内部(距离低于半径)或者可能在圈子(幸运案例)。然后你会知道交点在这2个点之间,你可以通过求解2方程系统找到它:
-point位于由2点
构成的线上-point距离圆心的距离等于半径
如果您不知道圆圈的位置或半径,您可以使用cvFindContours
得到它的轮廓,然后从另一个轮廓中检查每组2个点并使用:
double cvPointPolygonTest(
const CvArr* contour,
CvPoint2D32f pt,
int measure_dist
);
特别是,如果参数measure_dist非零,则函数返回 到最近轮廓边的距离;如果该点位于该距离内,该距离为0 如果该点在外面则为轮廓和正值。如果measure_dist参数为0则为 返回值只是+ 1, - 1或0,具体取决于该点是在内部,外部, 或分别在边缘(或顶点)上。轮廓本身可以是序列或 n-by-1双通道点阵。
从这里你得到2分,一个在外面,一个在内部或在圆上,以及每个圆与圆的距离。再次,足够的信息来计算确切的点。
PS:您可以通过首先检查2个轮廓的边界矩形是否至少相交来优化算法。您可以使用cvMinAreaRect2