OpenCV 轮廓方向
OpenCV contours orientation
我需要知道 cv2.findContours()
函数后如何定向 (clockwise/counterclockwise) 轮廓。
我可以通过使用参数 oriented
调用 cv2.contourArea()
来完成。但是如何更快地做到这一点?也许轮廓总是朝向一个方向?
谢谢!
在轮廓上搜索一个极值点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;
}
我需要知道 cv2.findContours()
函数后如何定向 (clockwise/counterclockwise) 轮廓。
我可以通过使用参数 oriented
调用 cv2.contourArea()
来完成。但是如何更快地做到这一点?也许轮廓总是朝向一个方向?
谢谢!
在轮廓上搜索一个极值点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;
}