opencv polylines
时间: 2024-05-09 15:13:37 浏览: 146
OpenCV的polylines函数是用来绘制多边形轮廓的。它可以在一张图像上绘制一组连接的线段,从而形成一个封闭的多边形。该函数支持绘制不同颜色和线宽的多边形,也可以选择是否闭合多边形。
在使用polylines函数时,需要指定一个点数组,用于描述多边形的每一个顶点的坐标。除此之外,还需要指定顶点的数量,以及是否闭合多边形。
以下是一个绘制多边形轮廓的示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = Mat::zeros(500, 500, CV_8UC3);
// 定义多边形顶点数组
Point pts = { Point(100, 100), Point(300, 100), Point(400, 300), Point(200, 400) };
// 绘制多边形轮廓
const Point* ppts[] = { pts };
int npt[] = { 4 };
polylines(img, ppts, npt, 1, true, Scalar(0, 0, 255), 2);
imshow("image", img);
waitKey(0);
return 0;
}
```
相关问题
cv2.polylines(img,lines,False, (0,0,255), 3) cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\drawing.cpp:2434: error: (-215:Assertion failed) p.checkVector(2, CV_32S) >= 0 in function 'cv::polylines'报错了
这个错误提示是因为 `cv2.polylines()` 函数的第二个参数需要传入一个由多个线段组成的列表,每个线段都是一个由点坐标组成的列表或者数组。而你传入的 `lines` 可能不符合这个要求,导致出现了这个错误。
你可以检查一下 `lines` 是否是一个由多个线段组成的列表,每个线段都是一个由点坐标组成的列表或者数组。如果不是,你需要修改 `lines` 的格式,使其符合要求。例如,你可以将 `lines` 改为一个包含三个线段的列表,每个线段都是一个包含两个点的列表,如下所示:
```
lines = [[[10, 10], [100, 100]], [[20, 20], [200, 20]], [[30, 30], [30, 300]]]
cv2.polylines(img, lines, False, (0,0,255), 3)
```
这样应该就可以正常运行了。如果你的 `lines` 格式不同,你需要相应地修改代码,使其符合 `cv2.polylines()` 函数的要求。
使用Opencv的circle函数绘制圆转成使用polylines函数绘制圆,并将外轮廓坐标点输出
好的,我知道了。这是一个关于OpenCV的问题,你可以使用`polylines`函数来绘制圆。具体步骤如下:
1. 定义一个圆的半径和圆心坐标。
```c++
int radius = 50;
Point center(100, 100);
```
2. 定义一个空向量来存储圆的所有点。
```c++
std::vector<Point> points;
```
3. 遍历圆的每个角度,使用三角函数计算出每个点的坐标。
```c++
for (int angle = 0; angle < 360; angle += 10) {
int x = cvRound(center.x + radius * cos(angle * CV_PI / 180));
int y = cvRound(center.y + radius * sin(angle * CV_PI / 180));
points.push_back(Point(x, y));
}
```
4. 最后,使用`polylines`函数绘制圆,并将所有坐标点输出。
```c++
std::vector<std::vector<Point>> contours;
contours.push_back(points);
polylines(image, contours, true, Scalar(255, 0, 0), 2);
std::cout << "Contours: " << contours[0] << std::endl;
```
这里的`image`是你要绘制圆的图像,`true`表示绘制封闭的轮廓,`Scalar(255, 0, 0)`表示轮廓的颜色,`2`表示轮廓的线宽。
输出的`contours[0]`是一个向量,包含了所有圆的坐标点。
完整代码如下:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main() {
Mat image = Mat::zeros(200, 200, CV_8UC3);
// Define circle center and radius
int radius = 50;
Point center(100, 100);
// Define a vector to store all the points on the circle
std::vector<Point> points;
// Calculate the coordinates of each point on the circle
for (int angle = 0; angle < 360; angle += 10) {
int x = cvRound(center.x + radius * cos(angle * CV_PI / 180));
int y = cvRound(center.y + radius * sin(angle * CV_PI / 180));
points.push_back(Point(x, y));
}
// Draw the circle using polylines function
std::vector<std::vector<Point>> contours;
contours.push_back(points);
polylines(image, contours, true, Scalar(255, 0, 0), 2);
// Print out all the contour points
std::cout << "Contours: " << contours[0] << std::endl;
imshow("Circle", image);
waitKey(0);
return 0;
}
```
阅读全文