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
    +关注

    关注

    30

    文章

    628

    浏览量

    41252
  • 树莓派
    +关注

    关注

    116

    文章

    1697

    浏览量

    105510
收藏 人收藏

    评论

    相关推荐

    如何在树莓派上安装Docker容器

    1. 准备工作 开始之前,请确保你的树莓派已经安装了最新版本的Raspberry Pi OS。如果没有,请按照以下步骤操作: 下载最新的Raspberry Pi OS镜像:访问 Raspberry
    的头像 发表于 11-11 11:38 257次阅读

    树莓派上部署YOLOv5进行动物目标检测的完整流程

    卓越的性能。本文将详细介绍如何在性能更强的计算机上训练YOLOv5模型,并将训练好的模型部署到树莓派4B上,通过树莓派的摄像头进行实时动物目标检测。 一、电脑上训练YOLOv5模型
    的头像 发表于 11-11 10:38 325次阅读
    <b class='flag-5'>在</b><b class='flag-5'>树莓</b><b class='flag-5'>派上</b>部署YOLOv5进行动物目标检测的完整流程

    使用OpenVINO GenAI APIC++中构建AI应用程序

    许多桌面应用程序是使用 C++ 开发的,而将生成式AI(GenAI)功能集成到这些应用程序中可能会很具有挑战性,尤其是因为使用像 Hugging Face 这样的 Python 库的复杂性。C++
    的头像 发表于 10-12 09:36 296次阅读
    使用OpenVINO GenAI API<b class='flag-5'>在</b>C++中<b class='flag-5'>构建</b>AI<b class='flag-5'>应用程序</b>

    bootloader和应用程序之间共享FEE块

    电子发烧友网站提供《bootloader和应用程序之间共享FEE块.pdf》资料免费下载
    发表于 10-10 09:18 0次下载
    <b class='flag-5'>在</b>bootloader和<b class='flag-5'>应用程序</b>之间共享FEE块

    【龙芯2K0300蜂鸟板试用】5 搭建opencv开发环境

    用来调试程序的可靠性,基本方法与loongxix相似,最大的不同是编译器的选择不同,在此略过 buildroot搭建 最终的应用程序是要跑板子,准备地说,是跑buildroot制作
    发表于 08-27 15:08

    可以单个esp8266上安装两个NON OS SDK应用程序吗?

    一个简单的问题。我可以单个 esp8266 上安装两个 NON OS SDK 应用程序吗?我的自定义引导加载程序(包括 os libs)和我的自定义
    发表于 07-19 07:28

    opencv-python和opencv一样吗

    -Python是OpenCV的一个Python语言接口,它允许开发者使用Python语言来调用OpenCV库的功能。 虽然OpenCVOpenCV-Python
    的头像 发表于 07-16 10:38 955次阅读

    嵌入式学习-飞凌ElfBoard ELF 1板卡 - 如何在Ubuntu中编译OpenCV

    之前发布的文章中探讨了交叉编译OpenCV并部署至嵌入式系统的方法。然而,调试阶段,我们发现在 Ubuntu 环境下将 OpenCV 编译为 X86 架构可能更加方便和高效。 通过
    发表于 06-07 09:21

    使用Redis和Spring Ai构建rag应用程序

    整合如何通过简化的开发流程,让开发者能够更专注于创新而非底层实现。一、SpringAI简介由大型语言模型(LLM)驱动的应用程序中,向量数据库常作为人工智能应用程
    的头像 发表于 04-29 08:04 971次阅读
    使用Redis和Spring Ai<b class='flag-5'>构建</b>rag<b class='flag-5'>应用程序</b>

    应用程序中的服务器错误怎么解决?

    使用应用程序时,可能会遇到服务器错误的问题。这种错误通常会导致应用程序无法正常运行 ,给用户带来不便。下面将介绍应用程序中的服务器错误及其解决方法,帮助您快速解决这一问题。
    的头像 发表于 03-12 15:13 5740次阅读

    使用ADS .NET Framework构建一个应用程序,.s (汇编文件)文件无法编译的原因?

    我正在尝试使用 ADS .NET Framework 构建一个应用程序。 我遇到了以下错误,因为 .s (汇编文件)文件无法编译。
    发表于 03-04 06:58

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

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

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

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

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

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

    开发java应用程序的基本步骤是

    ava是一种面向对象的编程语言,广泛用于开发各种类型的应用程序开发Java应用程序时,有一些基本步骤需要遵循,以确保应用程序的正确性和可靠性。 1.确定需求:这是开发任何
    的头像 发表于 11-28 16:52 1519次阅读