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

    关注

    33

    文章

    651

    浏览量

    44427
  • 树莓派
    +关注

    关注

    122

    文章

    2069

    浏览量

    109728
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于树莓派(RaspberryPi)构建高效实时监控系统

    及安装 ZeroNews Agent 树莓派(Raspberry Pi)上下载并运行 ZeroNews。 第 2 步:树莓派上安装 Motion 监控 先在
    的头像 发表于 09-22 15:14 869次阅读
    基于<b class='flag-5'>树莓</b>派(RaspberryPi)<b class='flag-5'>构建</b>高效实时监控系统

    零成本钢铁侠手套!树莓派+OpenCV 秒变手势遥控器!

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与
    的头像 发表于 08-16 16:16 893次阅读
    零成本钢铁侠手套!<b class='flag-5'>树莓</b>派+<b class='flag-5'>OpenCV</b> 秒变手势遥控器!

    如何使用树莓派与OpenCV实现面部和运动追踪的云台系统?

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与
    的头像 发表于 08-14 17:45 976次阅读
    如何使用<b class='flag-5'>树莓</b>派与<b class='flag-5'>OpenCV</b>实现面部和运动追踪的云台系统?

    如何使用树莓派+OpenCV实现姿态估计和面部特征点追踪?

    大家好,这是一个树莓派和OpenCV的连载专题。使用树莓派与OpenCV实现姿态估计和面部特征点追踪使用树莓派与
    的头像 发表于 08-13 17:44 981次阅读
    如何使用<b class='flag-5'>树莓</b>派+<b class='flag-5'>OpenCV</b>实现姿态估计和面部特征点追踪?

    如何在树莓派上安装Ubuntu MATE ?

    ,而非GNOME。本文中,我将介绍如何轻松地树莓派上安装它。UbuntuMATE官方支持树莓派,因此每发布一个新版本,都会为
    的头像 发表于 08-12 18:56 2961次阅读
    如何在<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>安装Ubuntu MATE ?

    初学者指南:树莓派上搭建虚拟环境!

    在这篇简明扼要的指南中,我们将探讨如何在树莓派上设置和使用虚拟环境(或称为Venv)——包括终端和Thonny集成开发环境中。使用Bookworm操作系统或更高版本时,或在尝试安装Python
    的头像 发表于 07-27 13:24 640次阅读
    初学者指南:<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>搭建虚拟环境!

    如何在树莓派上设置并使用VNC?远程访问完整指南!

    为什么要在树莓派上使用VNC?使用VNC与树莓派的主要优势在于其提供的灵活性。我们可以“无头模式”(无物理显示器)下运行树莓派,同时仍能完
    的头像 发表于 07-26 20:42 5071次阅读
    如何在<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>设置并使用VNC?远程访问完整指南!

    C++ 与 Python:树莓派上哪种语言更优?

    Python是树莓派上的首选编程语言,我们的大部分教程都使用它。然而,C++物联网项目中同样广受欢迎且功能强大。那么,树莓派项目中选择哪
    的头像 发表于 07-24 15:32 649次阅读
    C++ 与 Python:<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>哪种语言更优?

    释放潜力:树莓派上运行安卓系统实现多样化应用!

    为什么要在树莓派上运行安卓系统?安卓系统以其庞大的应用生态系统和用户友好的界面而闻名,它能够将树莓派转变为功能强大的设备,能够处理从媒体消费到轻量级计算和物联网应用等各种任务。优势高度定制化:
    的头像 发表于 07-05 08:33 912次阅读
    释放潜力:<b class='flag-5'>在</b><b class='flag-5'>树莓</b><b class='flag-5'>派上</b>运行安卓系统实现多样化应用!

    如何在树莓派上安装并运行 Arduino 集成开发环境!

    使用树莓派单板计算机,你可以运行各种应用程序,包括广受欢迎的Arduino集成开发环境(IDE)。这意味着你可以用它轻松地为通过USB连接到树莓派计算机的微控制器编程,以创建交互式电子项目。下面
    的头像 发表于 07-01 17:41 4055次阅读
    如何在<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>安装并运行 Arduino 集成开发环境!

    请问是否可以通用Windows平台中构建OpenVINO™ GenAI C++ 应用程序

    无法通用 Windows 平台中构建OpenVINO™ GenAI C++ 应用程序
    发表于 06-24 07:35

    从初学到进阶:树莓派上最适合你的代码编辑器推荐!

    安装树莓派操作系统后,你就可以使用Python、Scratch、Java、C/C++等受Linux支持的多种编程语言进行编程了。其中,Python是树莓派上最受欢迎的编程语言。
    的头像 发表于 05-15 16:20 796次阅读
    从初学到进阶:<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>最适合你的代码编辑器推荐!

    树莓派云OS哪个最受欢迎?来看看Github Star 28.9k的项目!

    应用程序,简化管理过程,位于现有操作系统之上,将设备转变为自托管机器。2.安装与访问:树莓派上安装只需运行bash脚本,安装完成后通过终端给出的IP地址
    的头像 发表于 03-25 09:21 926次阅读
    <b class='flag-5'>树莓</b>派云OS哪个最受欢迎?来看看Github Star 28.9k的项目!

    树莓派上设置 DeepSeek R1:2025 年离线人工智能的未来

    概述《树莓派上设置DeepSeekR1:2025年离线人工智能的未来》是一份前瞻性技术指南,聚焦中国AI初创公司DeepSeek于2023年底推出的开源模型DeepSeekR1。该模型旨在通过提供
    的头像 发表于 03-25 09:20 1086次阅读
    <b class='flag-5'>在</b><b class='flag-5'>树莓</b><b class='flag-5'>派上</b>设置 DeepSeek R1:2025 年离线人工智能的未来

    人脸识别指南:如何在树莓派上安装和设置 Dlib

    学习如何在树莓派上安装Dlib并配置人脸识别功能,为您的AI项目奠定基础。树莓派上安装Dlib的详细步骤要为
    的头像 发表于 03-24 17:31 1260次阅读
    人脸识别指南:如何在<b class='flag-5'>树莓</b><b class='flag-5'>派上</b>安装和设置 Dlib