直线
生成直线很简单,在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<leng:
cv2.line(img, (x,y),(xs[i+1],ys[i+1]),255)
return img
img = Power(img,1,30,n=2,colour=255,h=500)
#Power(5,10)
cv2.imshow('img',img)
局限性:这种方法不能随时调整曲线角度
思路二,画弧线,
利用圆心,半径,角度,求圆上的点坐标,然后画线
公式:
要圆上任一点为:(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:坐标轴原点是圆的中心点,画的不好,请见谅。
所以 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 后消失