首页 / 行业
怎样在树莓派上使用OpenCV构建简单的绘图应用程序
2019-07-26 11:30:00
该应用程序将有四个轨道栏:三个将用于更改颜色(B,G,R),第四个将用于选择在矩形,圆形,直线或自由线之间。
也可以将轨迹栏用作开关。默认情况下,OpenCV没有按钮功能,但我们可以将轨迹栏用作按钮。
我们可以在这个应用程序中使用的另一个有用的功能是鼠标回调函数,它将在鼠标事件发生时执行。
我们可以使用不同的形状使用我们的OpenCV绘图应用程序绘制。
Python代码
以下是用于创建简单绘画应用程序的完整Python代码:
import math
import cv2
def nothing(x):
pass
# Load an image
img = cv2.imread(‘obama.webp’)
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.webp’)
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’)
最新内容
手机 |
相关内容
什么是带阻三极管,带阻三极管的基本
什么是带阻三极管,带阻三极管的基本结构、工作原理、电阻比率、常用型号、应用、检测、操作规程及发展历程,三极管,检测,工作原理,什么是高压接触器,高压接触器的组成
什么是高压接触器,高压接触器的组成、特点、原理、分类、常见故障及预防措施,高压,分类,闭合,用于,操作,损坏,AD694ARZ高压接触器是什么是射流继电器,射流继电器的基本
什么是射流继电器,射流继电器的基本结构、技术参数、工作原理、负载分类、如何选用、操作规程及发展历程,继电器,工作原理,分类,负什么是互感器,互感器的组成、特点、
什么是互感器,互感器的组成、特点、原理、分类、操作规程及发展趋势,发展趋势,分类,输入,计量,用于,信号,AD574AKD互感器是一种用于位移传感器结构类型及工作原理与应
位移传感器结构类型及工作原理与应用,工作原理,类型,结构,位移传感器,常见,效应,FDV302P位移传感器是一种用于测量物体位移或位置的射频连接器使用技巧与注意事项
射频连接器使用技巧与注意事项,连接器,选择,频率,类型,连接,传输,射频连接器是一种用于连接射频电路的电子元件,常用于无线通信系统加特兰毫米波雷达SoC芯片赋能室内
加特兰毫米波雷达SoC芯片赋能室内安防新应用,毫米波雷达,芯片,用于,稳定性,目标,感知,室内安防是一个重要的领域,随着技术的进步和人晶振在激光雷达系统中的作用
晶振在激光雷达系统中的作用,作用,系统,激光雷达,晶振,可靠性,选择,激光雷达(Lidar)是一种利用激光进行测距的技术,广泛应用于自动驾驶