python用cv2生成直线和曲线

直线

生成直线很简单,在cv2中有现成的方法
cv2.line(img,pt1,pt2,color,thickness)
第一个参数 img:要划的线所在的图像;
第二个参数 pt1:直线起点
第三个参数 pt2:直线终点
第四个参数 color:直线的颜色
第五个参数 thickness=1:线条粗细
例子:

#创建一个图像,300×400大小,数据类型无符号8位
img=np.zeros((300,400,3),np.uint8)
cv2.line(img,(10,10),(200,200),(0,255,0),3)#绿色,3个像素宽度

曲线

思路一,利用曲线函数,取整点画直线
例如,幂函数

import cv2
import numpy as np
from collections import Counter
#绘制初始的图像(即初始化一个500*500的矩阵,并画上一条线)
img = np.zeros([500,500]).astype(np.uint8)                              #创建一个矩阵

def Power(img,x1,x2,n=2,colour=255,h=500):
    #xs,坐标x的集合 x2-x1+1控制步长为1使其不会出现小数,
    xs = np.linspace(x1,x2,x2-x1+1,dtype=np.int32)
    ys = np.power(xs,n,dtype=np.int32)
    leng = len(xs)-1
    print(len(xs))
    
    for i,(x,y) in enumerate(zip(xs,ys)):
        if y>=h:
            break#画线超出图片长度就不画了
        if i

局限性:这种方法不能随时调整曲线角度

思路二,画弧线,

利用圆心,半径,角度,求圆上的点坐标,然后画线
公式:
要圆上任一点为:(x1,y1)
且,x0,y0圆心,r半径,A角度,公式如下
x1 = x0 + r * cos( A )
y1 = y0 + r * sin( A )

公式解析:
sin是正弦,就是直角三角形中这个角(小于90度)的对边和斜边的比值; 对边/斜边
sin A = b/c
cos是余弦,就是直角三角形中这个角(小于90度)的邻边和斜边的比值; 邻边/斜边
cos A = a/c

ps:坐标轴原点是圆的中心点,画的不好,请见谅。


三角形与圆.png

所以 r=c,r * cos( A ) = c * a / c= a=坐标x,r * sin( A )=c * b / c=坐标y
加上原点就是点坐标了。

好了知道了如何计算圆上面的点坐标,我们就可以开始写代码了。

import cv2
import numpy as np

img = np.zeros((800, 800, 3), np.uint8) #生成一个空灰度图像

def DrawArc(img,op,r,extent):
    '''
    :param img:  图片
    :param op: o_point原点坐标
    :param r:半径
    :param extent:角度
    '''
    #brim=int(extent//10)
    Dots = []
    for i in range(extent):
        #sin,cos直接计算,计算的弧度不是角度,所以把它转成弧度
        x = op.x + r * np.cos(i*np.pi/180)
        y = op.y + r * np.sin(i*np.pi/180)
        Dots.append((int(x+0.5),int(y+0.5)))
    Dots = sorted(set(Dots),key=Dots.index)
    print(Dots)
    for i in range(len(Dots)-1):
        #print(Dots[i])
        cv2.line(img,Dots[i],Dots[i+1],(0,0,255),2)

class Point:
    def __init__(self,x,y):
        self.x=x
        self.y=y

op = Point(400,400)
DrawArc(img,op,100,60)


cv2.imshow('image', img)
cv2.waitKey (10000) # 显示 10000 ms 即 10s 后消失

你可能感兴趣的:(python用cv2生成直线和曲线)