C++_opencv_多边形绘制 polylines函数


    Point PointSet[5] = { Point(100,100),Point(350,100),Point(450,280),Point(320,450),Point(80,400) };
    Point* SetPointer = &PointSet[0];
    polylines(emptyImg, SetPointer, true, Scalar(255, 0, 0), -1, LINE_8, 0);
      // 为什么这里 用 Point 申请一个数组 polylines 函数不可以用,即 第二个参数传入有误
      // 但是用 vector<Point> 申请一个数组就可以用

因为opencv规定cv::polylines的第二个参数即你说的Point,它的类型必须是InputArrayOfArrays
而这个InputArrayOfArrays在cv中的定义追根溯源是_InputArray,虽然_InputArray可以有以下多种方式,但polylines采用的是蓝色框这种,所以不能用指向point数组的指针

img

在 OpenCV 中,可以使用 cv::polylines 函数绘制多边形。该函数如下:

void cv::polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)

其中:

img:要绘制多边形的图像。
pts:一个包含多个多边形顶点坐标的数组,需要是一个二维数组,其中每一行对应一个多边形。
isClosed:指定多边形是否闭合,即是否连接首尾顶点。
color:多边形的颜色。
thickness:多边形线条的粗细。
lineType:线条的类型,比如是实线、虚线等。
shift:顶点坐标的位置精度。
以下是一个简单的例子,绘制了一个多边形:

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char* argv[]) {
  // Create a black image
  cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3);

  // Define the polygon points
  std::vector<cv::Point> polygon;
  polygon.push_back(cv::Point(100, 100));
  polygon.push_back(cv::Point(200, 50));
  polygon.push_back(cv::Point(300, 100));
  polygon.push_back(cv::Point(400, 200));
  polygon.push_back(cv::Point(150, 300));

  // Draw the polygon
  cv::polylines(image, polygon, true, cv::Scalar(255, 0, 0), 2);

  // Display the image
  cv::imshow("Polygon", image);
  cv::waitKey(0);

  return 0;
}

在此代码中,我们首先创建了一张黑色的图像,然后定义了一个多边形的顶点数组。最后使用 cv::polylines 函数绘制多边形,并将其显示在窗口中。

该回答引用ChatGPT
请参考下面的解决方案,如果可行还请点击,采纳,感谢!
使用 OpenCV 在 C++ 中绘制一个多边形:

#include <opencv2/opencv.hpp>

int main() {
    // 创建一个 400x400 的图像
    cv::Mat image(400, 400, CV_8UC3, cv::Scalar(255, 255, 255));

    // 创建多边形顶点数组
    std::vector<cv::Point> vertices;
    vertices.push_back(cv::Point(100, 100));
    vertices.push_back(cv::Point(200, 200));
    vertices.push_back(cv::Point(300, 100));
    vertices.push_back(cv::Point(300, 300));
    vertices.push_back(cv::Point(100, 300));

    // 绘制多边形
    cv::polylines(image, vertices, true, cv::Scalar(0, 0, 255), 2);

    // 显示图像
    cv::imshow("Polygon", image);
    cv::waitKey(0);

    return 0;
}

其中,cv::polylines 函数的第一个参数是目标图像,第二个参数是多边形顶点数组,第三个参数指定是否将多边形封闭,第四个参数是颜色,第五个参数是线宽。

img


你这种相当于需要调用下面的这个api才行,不然你用指针数组的形式,opencv并不知道你这个数组有几行,每行有几个。而用vector的话,是可以用vector.size()来获取这些信息的。
也就是需要转成二维数组指针point **,然后再npts这个数组里面指定pts每行有几个点,在ncontours这个参数指定一共有几行才行,麻烦的很,所以还是换回vector吧

另外,这个函数里面线条粗细不能选-1,无法像绘制其他图像那样使用-1表示填充的,

img