为什么绘制出来的是折线,不是连续曲线
时间: 2024-03-05 14:47:35 浏览: 154
在OpenCV中,`cv::polylines()`函数默认绘制的是折线,而非连续曲线。如果想要绘制连续曲线,可以通过两种方法实现:
1. 增加控制点的数量,使曲线更加平滑。
2. 使用OpenCV的插值函数,如`cv::approxPolyDP()`,对控制点进行插值,从而得到更平滑的曲线。
下面是方法二的代码示例,其中`epsilon`是插值的精度:
Python:
```python
import cv2
import numpy as np
# 创建一个黑色背景的图像
img = np.zeros((512, 512, 3), np.uint8)
# 定义控制点
pts = np.array([[100, 200], [200, 400], [400, 300]], np.int32)
# 绘制控制点
for i in range(len(pts)):
cv2.circle(img, tuple(pts[i]), 5, (0, 0, 255), -1)
# 对控制点进行插值
pts = pts.reshape((-1, 1, 2))
pts = cv2.approxPolyDP(pts, epsilon=10, closed=False)
# 绘制贝塞尔曲线
cv2.polylines(img, [pts], False, (0, 255, 0), 3)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
C++:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 创建一个黑色背景的图像
Mat img = Mat::zeros(Size(512, 512), CV_8UC3);
// 定义控制点
Point pts[] = { Point(100, 200), Point(200, 400), Point(400, 300) };
int npts = sizeof(pts) / sizeof(pts[0]);
// 绘制控制点
for (int i = 0; i < npts; i++) {
circle(img, pts[i], 5, Scalar(0, 0, 255), -1);
}
// 对控制点进行插值
vector<Point> pts_vec(pts, pts + npts);
vector<Point> curve;
approxPolyDP(pts_vec, curve, 10, false);
// 绘制贝塞尔曲线
const Point* ppt[1] = {curve.data()};
int npt[] = {curve.size()};
polylines(img, ppt, npt, 1, false, Scalar(0, 255, 0), 3);
imshow("image", img);
waitKey(0);
destroyAllWindows();
return 0;
}
```
运行以上代码,可以得到更平滑的曲线。
阅读全文