Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用OpenCV绘制大轴椭圆_Python_Opencv_Cv2 - Fatal编程技术网

Python 用OpenCV绘制大轴椭圆

Python 用OpenCV绘制大轴椭圆,python,opencv,cv2,Python,Opencv,Cv2,我试图在图像中的两点之间画一条稍微弯曲的线(大半径的圆弧)。为此,我使用OpenCV中的eliple椭圆对于轴的大值(~5000)性能有限参数: startAngle参数的微小变化(~0.1度)不会影响绘制的椭圆。绘制的椭圆大约每0.9度更新一次。因为startAngle参数是float类型,我希望会有更精细的阶跃变化 看起来画的椭圆是由直线组成的。同样,我希望有更多的细节 要演示所描述的行为,请执行以下操作: 要复制的代码: import cv2 import numpy as np ra

我试图在图像中的两点之间画一条稍微弯曲的线(大半径的圆弧)。为此,我使用OpenCV中的
eliple
<代码>椭圆对于
轴的大值(~5000)性能有限
参数:

  • startAngle
    参数的微小变化(~0.1度)不会影响绘制的椭圆。绘制的椭圆大约每0.9度更新一次。因为
    startAngle
    参数是float类型,我希望会有更精细的阶跃变化
  • 看起来画的椭圆是由直线组成的。同样,我希望有更多的细节
  • 要演示所描述的行为,请执行以下操作:

    要复制的代码:

    import cv2
    import numpy as np
    
    radius = 5000
    center = (-2500, 4300)
    
    for i in range(31):
        img = np.zeros((500, 500, 3), dtype=np.uint8)
    
        start_angle = -59 + i / 10
    
        cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=-59, endAngle=-54, color=(0, 0, 255), thickness=1)
        cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=start_angle, endAngle=-54, color=(0, 255, 0), thickness=1)
        cv2.putText(img, 'Start angle: {} deg'.format(start_angle), (10, 450), color=(0, 0, 255), fontScale=1, fontFace=cv2.FONT_HERSHEY_SIMPLEX)
    
        cv2.imshow('', img)
        cv2.waitKey(100)
    
    cv2.imshow('', img)
    cv2.waitKey()
    
    有没有一种方法可以在图像中的两点之间画出不受上述限制的略微弯曲的线

    编辑: 根据Christoph的Rackwitz回答,我制作了一个基于cv2的绘制圆弧的函数。多段线:

    def arc(img, center, radius, start_angle, end_angle, points_count, color, thickness):
        pts = []
        for angle in np.linspace(start_angle, end_angle, points_count):
            x = int(center[0] + radius * np.cos(angle * np.pi / 180))
            y = int(center[1] + radius * np.sin(angle * np.pi / 180))
    
            pts.append([x, y])
    
        cv2.polylines(img, [np.array(pts)], isClosed=False, color=color, thickness=thickness)
    
    要与cv2.ellipse进行比较,请执行以下操作:

    import cv2
    import numpy as np
    
    
    def arc(img, center, radius, start_angle, end_angle, points_count, color, thickness):
        pts = []
        for angle in np.linspace(start_angle, end_angle, points_count):
            x = int(center[0] + radius * np.cos(angle * np.pi / 180))
            y = int(center[1] + radius * np.sin(angle * np.pi / 180))
    
            pts.append([x, y])
    
        cv2.polylines(img, [np.array(pts)], isClosed=False, color=color, thickness=thickness)
    
    
    radius = 5000
    center = (-2500, 4300)
    start_angle = -59
    end_angle = -54
    
    img = np.zeros((500, 500, 3), dtype=np.uint8)
    
    cv2.ellipse(img, center=center, axes=(radius, radius), angle=0, startAngle=start_angle, endAngle=end_angle, color=(0, 0, 255), thickness=1)
    arc(img, center, radius, start_angle, end_angle, points_count=101, color=(0, 255, 0), thickness=1)
    
    cv2.imshow('', img)
    cv2.waitKey()
    
    方法使用
    cv2.椭圆
    (红色)绘制直线,并基于
    cv2.多段线
    (绿色)根据需要绘制略微弯曲的直线


    您可以绘制一条多段线,并自己计算线段的坐标。

    直接增强油井。。。像素被组织在一个网格中,所以技术上它只能由像素的直线或对角线连接组成。也许可以看看“分数”参数,但我认为它只是为了中心和半径的亚像素精度。。。啊,看一看纪录片:这里解释了分段线性弧和多边形线的技巧…@Mika你是对的,shift(“分数”)参数用于中心位置和轴长度的亚像素精度。多边形线的技巧似乎很有希望,但参数“delta”(定义后续多段线顶点之间的角度)仅限于整数,结果类似/等于从cv2.ellipse获得的结果。请查看源代码并调整双精度delta。这里有一个函数用于获取圆弧多边形点: