我正在尝试将一些直线连接成一条曲线。
例如,如果我有三行这样的内容
我想画一条这样的曲线:
我尝试使用OpenCV line 和 polylines 函数。
for (size_t i = 0;i < lines.size();i++)
{
for (size_t j = 0;j < lines.size();j++)
{
//first line
Vec4i l1 = lines[i];
Point p1 = Point(l1[0], l1[1]);
Point p2 = Point(l1[2], l1[3]);
//second line
Vec4i l2 = lines[j];
Point p3 = Point(l2[0], l2[1]);
Point p4 = Point(l2[2], l2[3]);
if ((cv::norm(p1 - p3) < 20) || (cv::norm(p1 - p4) < 20) || (cv::norm(p2 - p3) < 20) || (cv::norm(p2 - p4) < 20))
{
vector<Point> pointList;
pointList.push_back(p1);
pointList.push_back(p2);
pointList.push_back(p3);
pointList.push_back(p4);
const Point *pts = (const cv::Point*) Mat(pointList).data;
int npts = Mat(pointList).rows;
polylines(img, &pts, &npts, 1, true, Scalar(255, 0, 0));
}
}
}
但是它不起作用,因为它连接了彼此相距较远的线。 另外,有没有我可以尝试的更快版本?
答案 0 :(得分:3)
贝塞尔曲线可能会有所帮助(https://en.wikipedia.org/wiki/B%C3%A9zier_curve)。
答案 1 :(得分:1)
@Pete建议确实好主意。您需要计算贝塞尔曲线的点:
vector<Point> bezierPoints;
bezierPoints.push_back(lines[0][0]);
for (size_t i = 1; i < lines.size(); i++) {
Point mid = (lines[i-1][1] + lines[i][0]) / 2.0;
bezierPoints.push_back(mid);
}
bezierPoints.push_back(lines.back()[1]);
在此之后,您可以build完整的贝塞尔曲线路径。