0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:工程师吴畏 2019-07-26 11:30 次阅读

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

    关注

    29

    文章

    611

    浏览量

    40772
  • 树莓派
    +关注

    关注

    113

    文章

    1639

    浏览量

    104736
收藏 人收藏

    评论

    相关推荐

    u8g2应用程序无法moduStoolBox中构建是为什么?

    。 我对 ModuStoolBox 很陌生,我必须说,与 Creator 相比,学习曲线非常艰难。 不管怎样,为了让我的应用程序使用 ModuStoolBox 运行显示器,我一定会很感激能在这方面得到
    发表于 01-24 07:03

    在核桃派上实现USB摄像头的OpenCV颜色检测

    在前几周的文章中已经介绍过如何在核桃派上OpenCV读取图像并显示到pyqt5的窗口上,这里在上一篇文章的基础上,给开发板加入颜色检测功能,尝试将图像中所有蓝色的东西都用一个框标记出来。
    的头像 发表于 01-20 17:50 487次阅读
    在核桃<b class='flag-5'>派上</b>实现USB摄像头的<b class='flag-5'>OpenCV</b>颜色检测

    如何构建linux开发环境和编译软件工程、应用程序

    前文介绍了如何使用官方提供的镜像文件启动开发板,本文将说明如何构建linux开发环境和编译软件工程、应用程序
    的头像 发表于 01-03 12:31 465次阅读
    如何<b class='flag-5'>构建</b>linux开发环境和编译软件工程、<b class='flag-5'>应用程序</b>

    OpenCV基础知识入门

    OpenCV是计算机视觉中最受欢迎的库,最初由intel使用C和C ++进行开发的,现在也可以在python中使用。该库是一个跨平台的开源库,是免费使用的。OpenCV库是一个高度优化的库,主要关注实时应用程序
    的头像 发表于 10-29 11:29 398次阅读
    <b class='flag-5'>OpenCV</b>基础知识入门

    如何使用Tokio 和 Tracing模块构建异步的网络应用程序

    ,并在调试和故障排除时提供有用的信息。 在本教程中,我们将介绍如何使用 Tokio 和 Tracing 模块来构建一个异步的网络应用程序,并使用 Tracing 来记录应用程序的行为和性能。我们将从安装和配置开始,然后介绍如何使
    的头像 发表于 09-19 15:29 345次阅读

    如何在树莓派上面安装Windows

    早期,想要在树莓派上面安装Windows一直是个比较麻烦的事情,下载系统镜像,烧录、还有一系列复杂的配置。
    的头像 发表于 09-12 09:54 983次阅读
    如何在<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>面安装Windows

    使用GCC编译器1.0版DS-5中构建裸机应用程序

    1. 概览 此教程展示了您如何设置您的项目以使用 HCC 光金属编译器 。 然而, 通常我们建议您在 DS 5 中创建简单的 光金属 Hello World 应用程序, 最后 Cortex- A9
    发表于 08-24 07:36

    如何用PyArmNN加速树莓派上的ML推理

    NN推理引擎构建一个示例应用程序,将图像分类为火或非火。 本指南使用Raspberry Pi 3或4设备。树莓派设备是由Arm CPU驱动的 霓虹灯的架构。Neon是针对Arm处理器的优化架构扩展
    发表于 08-02 15:40

    构建一个简单的裸机程序使用Arm DS-5

    本教程将带您完成创建、配置和构建一个简单的裸机程序使用Arm DS-5。要在应用程序构建完成后运行它,本教程将带您完成配置到以软件实现的系统
    发表于 08-02 08:27

    树莓派机器人船构建

    电子发烧友网站提供《树莓派机器人船构建.zip》资料免费下载
    发表于 07-10 11:33 0次下载
    <b class='flag-5'>树莓</b>派机器人船<b class='flag-5'>构建</b>

    构建一个移动应用程序

    电子发烧友网站提供《构建一个移动应用程序.zip》资料免费下载
    发表于 07-04 14:33 0次下载
    <b class='flag-5'>构建</b>一个移动<b class='flag-5'>应用程序</b>

    使用Arduino Nano 33构建嵌入式语音识别应用程序

    电子发烧友网站提供《使用Arduino Nano 33构建嵌入式语音识别应用程序.zip》资料免费下载
    发表于 06-28 14:50 1次下载
    使用Arduino Nano 33<b class='flag-5'>构建</b>嵌入式语音识别<b class='flag-5'>应用程序</b>

    使用Arduino、Sigfox和Ubidot构建物联网应用程序

    电子发烧友网站提供《使用Arduino、Sigfox和Ubidot构建物联网应用程序.zip》资料免费下载
    发表于 06-20 09:20 0次下载
    使用Arduino、Sigfox和Ubidot<b class='flag-5'>构建</b>物联网<b class='flag-5'>应用程序</b>

    如何在python中实现ESP TOUCH协议?

    树莓派上使用了多个 esp8266。我可以使用 ESP TOUCH 的 Android 应用程序配置 esp 模块,但我也想使用相同的应用程序
    发表于 05-17 08:20

    电赛总结之上位机(树莓派python-opencv实时识别黑线)

    在准备电赛的这段时间里,我确实学到了很多东西,我会一点一点更新博客,从头到尾总结一下,本篇博客主要写一下树莓opencv的使用,在这里我不会赘述opencv的安装,这个网上有很多教程。 这里
    发表于 05-10 09:29 2次下载
    电赛总结之上位机(<b class='flag-5'>树莓</b>派python-<b class='flag-5'>opencv</b>实时识别黑线)