python代码
import cv2
import numpy as np
def nothing(x):
pass
ix=-1
iy=-1
drawing=False
mode=ord('l')
def draw(event,x,y,flag,param):
r=cv2.getTrackbarPos('R','image') #在'image'窗口中获取名为'R'的trackbar的值
g=cv2.getTrackbarPos('G','image') #在'image'窗口中获取名为'G'的trackbar的值
b=cv2.getTrackbarPos('B','image') #在'image'窗口中获取名为'B'的trackbar的值
color=(b,g,r) #根据trackbar的值确定颜色
global ix,iy,drawing,mode #ix,iy为鼠标初始坐标点,drawing为是否画的标志位,mode为确定所画形状
if event==cv2.EVENT_FLAG_LBUTTON: #当鼠标左键按下,开始绘画,获得鼠标的初始点
drawing=True
ix,iy=x,y
elif event==cv2.EVENT_MOUSEMOVE and flag==cv2.EVENT_FLAG_LBUTTON:#当鼠标左键按下且鼠标移动,开始绘画具体的形状
if drawing ==True:
if mode == ord('l'): #当键盘按下'l',在鼠标处画一个小圆,移动鼠标,就画出了直线
cv2.circle(img,(x,y),3,color,-1)
elif mode== ord('r'): #当键盘按下'r',以鼠标初始点为左上角,终点为右下角,画矩形
cv2.rectangle(img,(ix,iy),(x,y),color,-1)
elif mode==ord('c'): #当键盘按下'c',以鼠标初始点为圆心,到终点的距离为半径,画圆
radius=int(np.sqrt((x-ix)**2+(y-iy)**2))
cv2.circle(img,(ix,iy),radius,color,-1)
elif event==cv2.EVENT_LBUTTONUP: #当鼠标左键松开时,停止绘画
drawing=False
img=np.zeros([248,248,3],dtype=np.uint8) #使用numpy的zeros()函数创建一张黑色的画布,Size为(248,248,3)
cv2.namedWindow('image',cv2.WINDOW_NORMAL) #无论是Mousecallback还是trackbar,还是imshow(),都与window息息相关,因此要创建一个window,可以调整window的大小
cv2.createTrackbar('R','image',0,255,nothing) #创建一个Trackbar,名字为'R',放在名为'image'的Trackbar中,范围为0-255,trackbar也需要回调函数,这里回调函数不需要完成什么,所以创建了一个nothing回调函数
cv2.createTrackbar('G','image',0,255,nothing) #创建一个Trackbar,名字为'G',放在名为'image'的Trackbar中,范围为0-255
cv2.createTrackbar('B','image',0,255,nothing) #创建一个Trackbar,名字为'B',放在名为'image'的Trackbar中,范围为0-255
while True:
cv2.imshow('image',img) #显示图片
k=cv2.waitKey(1)
if k==ord('r'): #当键盘按下r,mode切换为画矩形
mode=ord('r')
elif k==ord('c'): #当键盘按下c,mode切换为画圆
mode=ord('c')
elif k==ord('l'): #当键盘按下l,mode切换为画线
mode=ord('l')
elif k==ord('w'): #当键盘按下w,保存图片
cv2.imwrite('/home/xhsheng/文档/opencv_learn/用滑动条做调色板/myTrackbar_draw.jpg',img)
elif k==ord('q'): #当键盘按下q,退出while循环
break
cv2.destroyAllWindows() #记得程序结束后,清除所有window
运行结果