绘图
#绘图
#创建一个图片
img=np.zeros((512,512,3),np.uint8)
#画直线:图像,起点,终点,线条颜色,线条类型
cv2.line(img,(20,20),(500,500),(255,255,0),1)
#画矩形:图像,左上角坐标,右下角坐标,线条颜色,线条类型
cv2.rectangle(img,(280,0),(450,128),(0,255,0),3)
#画圆:图像,中心点坐标,半径大小,线条颜色,线条类型=1时,表示填充
cv2.circle(img,(355,60),55,(255,0,255),-1)
#画椭圆:图像,中心点坐标,(长轴距离,短轴距离),椭圆沿逆时针方向旋转的角度,椭圆弧沿顺时针方向起始的角度和结束的角度,线条颜色,线条类型
cv2.ellipse(img,(256,256),(150,50),0,0,180,(0,255,0),-1)
#画多边形,这里画一个黄色的具有5个顶点的多边形
pts=np.array([[30,60],[80,90],[110,160],[150,310],[180,290]],np.int32)#将各个点的坐标记录下来,数据类型一定要为int32
pts=pts.reshape((-1,1,2))#矩阵重组,1在哪里,表示这一维的长度是由为1的维度确定的,(1,-1)表示行,(-1,1)表示列
cv2.polylines(img,[pts],True,(0,255,255))#画很多条线,参数:图像,矩阵,第三个如果是False,我们得到的图像不是闭合的,线条颜色
#在图片上添加文字
font=cv2.FONT_HERSHEY_SIMPLEX
'''
其中字体可以选择
FONT_HERSHEY_SIMPLEX
Python: cv.FONT_HERSHEY_SIMPLEX
normal size sans-serif font
FONT_HERSHEY_PLAIN
Python: cv.FONT_HERSHEY_PLAIN
small size sans-serif font
FONT_HERSHEY_DUPLEX
Python: cv.FONT_HERSHEY_DUPLEX
normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
FONT_HERSHEY_COMPLEX
Python: cv.FONT_HERSHEY_COMPLEX
normal size serif font
FONT_HERSHEY_TRIPLEX
Python: cv.FONT_HERSHEY_TRIPLEX
normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
FONT_HERSHEY_COMPLEX_SMALL
Python: cv.FONT_HERSHEY_COMPLEX_SMALL
smaller version of FONT_HERSHEY_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX
Python: cv.FONT_HERSHEY_SCRIPT_SIMPLEX
hand-writing style font
FONT_HERSHEY_SCRIPT_COMPLEX
Python: cv.FONT_HERSHEY_SCRIPT_COMPLEX
more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_ITALIC
Python: cv.FONT_ITALIC
flag for italic font
'''
cv2.putText(img,'opencv',(20,500),font,4,(255,255,255),5)#图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
cv2.imshow('image',img)
cv2.waitKey(0)
#cv2.destroyAllWindows()
把鼠标当画笔
函数格式都一样,拥有的函数:
#['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON',
# 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK',
# 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP',
# 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK',
# 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
##双击过的地方画圆
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)==ord('q'):
break
cv2.destroyAllWindows()
根据我们选择的模式再拖动鼠标是绘制矩形或圆形或矩形
#根据我们选择的模式再拖动鼠标是绘制矩形或圆形或矩形
#当鼠标按下时变为True
drawing=False
#如果mode为True 绘制矩形。按下m后变成绘制曲线
mode=True
ix,iy=-1,-2
#创建回调函数
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode#这个一定要写啊
#按下左键是返回起始坐标位置
if event==cv2.EVENT_LBUTTONDOWN:
drawing=True
ix,iy=x,y
#当鼠标左键按下并移动是绘制图形。event可以查看移动,flag查看是否按下
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
if drawing==True:
if mode==True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
#绘制圆圈,小圆点连在一起就成了线,3代表了笔画的粗细
cv2.circle(img,(x,y),3,(0,255,0),-1)
elif event==cv2.EVENT_LBUTTONUP:
drawing=False
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k=cv2.waitKey(1)
if k==ord('m'):
mode=not mode
elif k==27:
break
cv2.destroyAllwindows()
#用滑动条做调色板
def nothing(x):
pass
img=np.zeros((300,512,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,nothing)#滑条名字,放置的窗口的名字,滑条的默认位置,滑条的最大值,回调函数
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
switch='0:OFF\n1:ON'
cv2.createTrackbar(switch,'image',0,1,nothing)
while(1):
cv2.imshow('image',img)
k=cv2.waitKey(1)
if k==27:
break
r=cv2.getTrackbarPos('R','image')
g=cv2.getTrackbarPos('G','image')
b=cv2.getTrackbarPos('B','image')
s=cv2.getTrackbarPos(switch,'image')
if s==0:
img[:]=0
else :
img[:]=[b,g,r]
cv2.destroyAllWindows()