【问题标题】:OpenCV contours orientationOpenCV 轮廓方向
【发布时间】:2017-03-01 15:44:41
【问题描述】:

我需要知道cv2.findContours() 函数后轮廓的方向(顺时针/逆时针)。

我可以通过使用参数oriented 调用cv2.contourArea() 来实现。但是如何更快呢?也许轮廓总是指向一个方向?

谢谢!

【问题讨论】:

  • 获取轮廓周围的直矩形,并根据得到的矩形的长宽来定位。
  • 也许我不正确地提出我的问题。我需要知道轮廓旁路的方向。任务是计算每个点的法线外轮廓。
  • 一个示例图像和一个预期输出示例会有所帮助
  • There 一个方案。
  • here你可以找到一个示例c++代码

标签: python opencv opencv-contour


【解决方案1】:

在轮廓上搜索一个极值点 p,例如最右边的点。确定p的前任(pred)和后继(succ)。建立两个向量 a = pred - p, b = succ - p。然后叉积 a x b 的 z 分量的符号告诉您轮廓的方向。

bool contourOrientationCW(const std::vector<cv::Point>& contour) {
    if (contour.size() >= 3) {
        cv::Point rm;   // right most point
        size_t rmIdx;   // index of right most point

        for (size_t i = 0; i < contour.size(); i++) {
            const cv::Point& p = contour[i];

            if (p.x > rm.x || p.x == rm.x && p.y > rm.y) {
                rm = p;
                rmIdx = i;
            }
        }
        size_t i = rmIdx - 1; if (i < 0) i = contour.size() - 1;
        const cv::Point& pred = contour[i];
        i = rmIdx + 1; if (i == contour.size()) i = 0;
        const cv::Point& succ = contour[i];

        Vec2i a = pred - rm, b = succ - rm;
        return a[0]*b[1] >= a[1]*b[0];
    }
    return true;
}

【讨论】:

  • 然而,这在 cv::contourArea 方法失败的相同情况下失败,在面积为零的轮廓上(叉积将始终是零向量)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2017-05-15
  • 2016-10-23
  • 2021-09-14
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多