如何水平连接 OpenCV 轮廓?

Posted

技术标签:

【中文标题】如何水平连接 OpenCV 轮廓?【英文标题】:How to connect OpenCV contours horizontally? 【发布时间】:2015-02-08 23:48:26 【问题描述】:

我在 Opencv 2.9 (C++) 中使用 findContours。我得到的是一个向量>轮廓,它描述了我的轮廓。假设我有一个矩形,其轮廓存储在向量中。接下来我想做的是,用一条线将轮廓的左右两侧在任意点连接起来。例如。矩形左上角下方 10 像素到右上角下方 10 像素。该线应在轮廓所在的位置结束。如果pointPolygonTest 为真,那么是否有更好的方法,然后仅通过该通道扫描线并检查每个像素?

提前致谢!

【问题讨论】:

【参考方案1】:

假设您有角(左上角、右上角、右下角和左下角点),那么您可以轻松计算两条线之间的交点,每条线都由两个点定义。

例如line(P1,P4)line(R1,R2)相交,相交点为I: p>

如果线确实相交,这是一个用于计算交点的 sn-p 代码:

// Finds the intersection of two lines, or returns false.
// The lines are defined by (o1, p1) and (o2, p2).
bool intersection(cv::Point2f o1, cv::Point2f p1, cv::Point2f o2, cv::Point2f p2, cv::Point2f &r)

    cv::Point2f x = o2 - o1;
    cv::Point2f d1 = p1 - o1;
    cv::Point2f d2 = p2 - o2;

    float cross = d1.x*d2.y - d1.y*d2.x;
    if (std::abs(cross) < /*EPS*/1e-8)
        return false;

    double t1 = (x.x * d2.y - x.y * d2.x)/cross;
    r = o1 + d1 * t1;
    return true;

【讨论】:

以上是关于如何水平连接 OpenCV 轮廓?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 2.4.4 中的轮廓/连接组件

教你如何使用 OpenCV检测图像中的轮廓

教你如何使用 OpenCV检测图像中的轮廓

android如何在 java opencv 中查找最大轮廓

opencv查找轮廓后如何改变轮廓内的颜色C++

如何检测物体边框 opencv