该应用程序将有四个轨道栏:三个将用于更改颜色(B,G,R),第四个将用于选择在矩形,圆形,直线或自由线之间。
也可以将轨迹栏用作开关。默认情况下,OpenCV没有按钮功能,但我们可以将轨迹栏用作按钮。
我们可以在这个应用程序中使用的另一个有用的功能是鼠标回调函数,它将在鼠标事件发生时执行。
我们可以使用不同的形状使用我们的OpenCV绘图应用程序绘制。
Python代码
以下是用于创建简单绘画应用程序的完整Python代码:
import math
import cv2
def nothing(x):
pass
# Load an image
img = cv2.imread(‘obama.jpg’)
cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)
# Create trackbars for color change
cv2.createTrackbar(‘R’,‘image’,0,255,nothing)
cv2.createTrackbar(‘G’,‘image’,0,255,nothing)
cv2.createTrackbar(‘B’,‘image’,0,255,nothing)
# Create trackbars for drawing shapes
cv2.createTrackbar(‘Select’, ‘image’,0,3,nothing)
drawing = False # true if mouse is pressed
ix,iy = -1,-1
# mouse callback function
def draw(event,x,y,flags,param):
global ix,iy,drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if s == 3:
cv2.circle(img,(x,y),5,(b, g, r),-1)
elif event == cv2.EVENT_LBUTTONUP:
if drawing == True:
if s == 0:
cv2.rectangle(img,(ix,iy),(x,y),(b, g, r),5)
elif s == 1:
cv2.circle(img,(int((ix+x)/2), int((iy+y)/2)),int(math.sqrt( ((ix-x)**2)+((iy-y)**2) )),(b, g, r),5)
elif s == 2:
cv2.line(img,(ix,iy),(x,y),(b, g, r),5)
drawing = False
cv2.setMouseCallback(‘image’,draw)
while(1):
cv2.imshow(‘image’,img)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
# get current positions of four trackbars
r = cv2.getTrackbarPos(‘R’,‘image’)
g = cv2.getTrackbarPos(‘G’,‘image’)
b = cv2.getTrackbarPos(‘B’,‘image’)
s = cv2.getTrackbarPos(‘Select’,‘image’)
cv2.destroyAllWindows()
阅读图像
函数 cv2.imread()用于读取图像,其参数是图像的名称。如果图像在工作目录中,只需写入图像的名称。否则,您将必须提供图像的完整路径。
我们将创建一个窗口并将其标记为“图像”。所有轨迹都将附加到此窗口。
img = cv2.imread(‘obama.jpg’)
cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)
创建轨迹栏
要创建轨迹栏,我们使用 cv2.createTrackbar()函数,它有五个参数:
轨迹栏名称
它所附加的窗口名称
默认值
最大值
回调函数(每次跟踪栏值更改时执行)
回调函数始终具有默认参数,即轨迹栏位置。在我们的例子中,函数什么都不做,所以我们只是传递。
我们为红色,绿色和蓝色创建了三个轨迹栏。每个轨迹栏的默认值为0,最大值为255,并将它们附加到名为“image”的窗口。
接下来我们需要创建一个轨迹栏,在矩形,圆形,直线之间进行选择和自由行,默认值为0,最大值为3.我们将按如下方式设置值:
0:矩形
1:圆圈
2:直线
3:自由行
# Create trackbars for color change
cv2.createTrackbar(‘R’,‘image’,0,255,nothing)
cv2.createTrackbar(‘G’,‘image’,0,255,nothing)
cv2.createTrackbar(‘B’,‘image’,0,255,nothing)
# Create trackbars for drawing shapes
cv2.createTrackbar(‘Select’, ‘image’,0,3,nothing)
鼠标回调函数
我们现在可以创建一个鼠标回调函数,该函数在发生鼠标事件时执行。鼠标事件可以是与鼠标相关的任何事件:左键向下,左键向上,左键双击等。
该函数为我们提供每个坐标(x,y)鼠标事件。通过这个事件和位置,我们可以做任何我们喜欢的事情。
创建一个鼠标回调函数有一个特定的格式,在任何地方都是一样的。它仅在功能方面有所不同。在我们的例子中,回调函数是绘制函数,它将根据第四个轨迹栏的位置绘制矩形,圆形,直线或自由线。
def draw(event,x,y,flags,param):
global ix,iy,drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if s == 3:
cv2.circle(img,(x,y),5,(b, g, r),-1)
elif event == cv2.EVENT_LBUTTONUP:
if drawing == True:
if s == 0:
cv2.rectangle(img,(ix,iy),(x,y),(b, g, r),5)
elif s == 1:
cv2.circle(img,(int((ix+x)/2), int((iy+y)/2)),int(math.sqrt( ((ix-x)**2)+((iy-y)**2) )),(b, g, r),5)
elif s == 2:
cv2.line(img,(ix,iy),(x,y),(b, g, r),5)
drawing = False
cv2.setMouseCallback(‘image’,draw)
获取轨迹栏位置
Cv2.getTrackbarPos()函数用于获取轨迹栏的当前位置。它所采用的第一个参数是我们之前创建的轨迹栏的名称,第二个参数是它将附加到的窗口的名称。
# get current positions of four trackbars
r = cv2.getTrackbarPos(‘R’,‘image’)
g = cv2.getTrackbarPos(‘G’,‘image’)
b = cv2.getTrackbarPos(‘B’,‘image’)
s = cv2.getTrackbarPos(‘Select’,‘image’)
-
OpenCV
+关注
关注
31文章
635浏览量
41340 -
树莓派
+关注
关注
116文章
1707浏览量
105610
发布评论请先 登录
相关推荐
评论