怎样在树莓派上使用OpenCV构建简单的绘图应用程序

电子说

1.2w人已加入

描述

该应用程序将有四个轨道栏:三个将用于更改颜色(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’)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分