基于Opencv实现的多彩隔空画图

2023-11-02

1.问题概述

人工智能带火了计算机视觉的人才需求,作为计算机视觉应用开发框架OpenCV也越来越受到欢迎,市场需求大增。因此,在学习Python的基础上,进行Opencv技术的学习是十分重要且有必要的。该项技术不仅有着成熟的学习框架,更有广泛的应用。学习一定的Opencv技术对于大学生来说,有着不同寻常的意义所在。

2.课程设计基本要求

设计报告的基本内容至少包括封面、正文、参考文献三部分。

1.封面

封面按照模版填写,不得随意更改。

2.正文

正文是设计报告的主体,具体由以下几部分组成:

(1)背景介绍、问题描述

描述要求编程解决的问题。

(2) 基本要求

给出程序要达到的具体的要求。

(3)需求分析
  以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?并明确规定:
   输入的形式和输入值的范围;
   输出的形式;
   程序所能达到的功能;
   测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
(4)概要设计
  说明本程序中主程序的流程以及各程序模块之间的层次(调用)关系。
(5)详细设计
  实现概要设计中定义的所有数据类型,给出关键部分源程序的清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。
(6)调试分析
  内容包括:调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;  
(7)用户使用说明
  说明如何使用你编写的程序,详细列出每一步的操作步骤。
(8)测试结果
设计测试数据,或具体给出测试数据。要求测试数据完整和严格,能全面地测试所设计程序的功能。
(9) 总结
(10)参考文献
  列出参考的相关资料和书籍。

3.Opencv识别设计需求分析

在理论研究中,物体识别在最近的十几年中一直是计算机视觉领域中的热门研究点。在每年的顶尖会议和期刊中,有很多这个方向的相关工作。在某些细化的应用场景,如人脸识别和指纹识别已经有了比较成熟的应用。本文通过研究物体识别的相关理论,基于OpenCV设计实现了一个多彩隔空画图,来试图解决一些颜色路径识别,完成的主要工作如下: 基于颜色特征的物体识别方案: 本文首先的研究内容是颜色识别相关的算法,其中主要包含两大部分:特征的提取和特征的匹配。深入地理解特征检测算法有助于在实际应用时针对特定的场景选取合适的算法并进行优化。

4.多彩隔空画图设计概要分析

本项目主要是为了实现,通过摄像头读取展示给摄像头的视觉信息,从中分析出需要识别的颜色,通过圆点标志出颜色,并连续不断的进行圆点绘制,以达到画图的最终效果。其中可能会用到窗口的调用恢复,窗口反转;腐蚀,消除噪声斑点;膨胀,连通被噪声、阴影分割的区域;开运算,先腐蚀后膨胀;闭运算,先膨胀后腐蚀;形态梯度; “礼貌” ; “黑帽” ;尺寸的调整;窗口合并;按钮添加进行参数调节;阀值化等等的技术。通过不同的模块的学习,将其整合为一个总体的项目。
本项目主要根据Opencv在Github的官方文档中不同章节涉及的Opencv知识进行学习以及完成该项目。

4.1多彩隔空画图开发环境

电脑型号:机械革命X6Ti版本
系统OS:Windows 10 专业版
版本号 20H2
安装日期 2020/9/10
操作系统版本 19042.610
体验 Windows Feature Experience Pack 120.2212.31.0
使用软件:PyCharm 2020.1 x64,VSCode,Python3.6

4.2Opencv技术

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。
OpenCV可以在Windows,Android,Maemo,FreeBSD,OpenBSD,iOS,Linux 和Mac OS等平台上运行。使用者可以在 SourceForge 获得官方版本,或者从 SVN 获得开发版本。OpenCV也是用CMake。
在Windows上编译OpenCV中与摄像输入有关部分时,需要DirectShow SDK中的一些基类。该SDK可以从预先编译的Microsoft Platform SDK(or DirectX SDK 8.0 to 9.0c / DirectX Media SDK prior to 6.0)的子目录Samples\Multimedia\DirectShow\BaseClasses获得。
Python是由Guido van Rossum发起的通用编程语言,很快就非常流行,主要是因为它的简单性和代码可读性。它使程序员可以用较少的代码行表达想法,而不会降低可读性。
与C/C++之类的语言相比,Python速度较慢。也就是说,可以使用C/C++轻松扩展Python,这使我们能够用C/C++编写计算密集型代码并创建可用作Python模块的Python包装器。这给我们带来了两个好处:首先,代码与原始C/C++代码一样快(因为它是在后台运行的实际C++代码),其次,在Python中比C/C++编写代码更容易。OpenCV-Python是原始OpenCV C++实现的Python包装器。
OpenCV-Python利用了Numpy,这是一个高度优化的库,用于使用MATLAB样式的语法进行数值运算。所有OpenCV数组结构都与Numpy数组相互转换。这也使与使用Numpy的其他库(例如SciPy和Matplotlib)的集成变得更加容易。

4.3多彩隔空画图的总体结构设计

图1 多彩隔空画图的总体结构设计

图1为多彩隔空画图总体结构设计,总体分为摄像头读取图像框、获取颜色、基本单位圆点、实现绘制路径四个模块。其中摄像头读取图像框模块主要是在屏幕中创建一个窗口,在这个窗口中实现画图路径的绘制;在获取颜色模块,主要借用cv2中腐蚀,消除噪声斑点;膨胀等函数,进行所需识别颜色的获取与识别;在基本单位模块中,主要是绘制出一个带有颜色的圆形,这个圆形就是绘制路径的基本单位,通过不断的重复这个圆形,从而画出路径;在实现绘制路径模块中,主要通过函数,不断地重复基本单元圆点,以实现路径的绘制。

5.多彩隔空画图的详细设计

在四个模块中,一开始为摄像头读取图形框设计,然后是进行简单的识别,之后通过添加调节按钮来实现移动按钮以获取最佳的识别效果,从而获取到需要识别颜色的RGB值。通过获得到的RGB值,可以再调用Opencv函数,来实现基本单位圆形的绘制,再将其连起来,从而实现路径绘制的实现。过程中需要多次实验调试,每个模块可能有多次修改,从初步的设计到代码的书写,算法的编写,再到算法代码的优化。

5.1摄像头读取图像框设计

我们需要找到我们的颜色,并且需要使用网络摄像头,然后我们可以在找到颜色的任何地方放置不同的点来创建绘画示例。
所以首先我们需要的是网络摄像头,所以我们要做的是,根据官方文档的第一章内容,调用我们的网络摄像头。

import cv2

frameWidth = 640  # chapter1
frameHeight = 480  # chapter1
cap = cv2.VideoCapture(1)  # chapter1
cap.set(3, frameWidth)  # chapter1
cap.set(4, frameHeight)  # chapter1
cap.set(10, 150)  # chapter1

while True:
    success, img = cap.read()
    cv2.imshow("Result", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
       break

图2 调用网络摄像头代码

首先我们需要导入库,通过import cv2导入Opencv库。我们设置两个变量,一个是窗口的宽为640,一个是窗口的高为480,通过frameWidth = 640和frameHeight = 480实现。然后为窗口的宽和高分别设置ID号,分别为3号和4号。同时我们设置窗口的亮度,在经过测试后,我们选定150的亮度为窗口屏幕亮度。VideoCapture函数为调用摄像头的函数,参数为1代表不调用,参数为0代表调用,开始我们设置为1,在需要调用时,我们再设置为0。

然后我们循环获取图像的位置,使用imshow功能函数,并且将窗口名称设置为Result。为了有退出的功能,我们设置按键盘上的“Q”进行退出。

此时我们进行测试,预期效果为现实摄像头。

运行程序,进行摄像头测试,结果摄像头读取成功,此处展示四个手指,在屏幕上也能看到四个手指,测试成功。

然后进行程序退出功能的测试,按键盘上的Q进行退出,测试结果为成功退出,在输入法为中文模式时,需要先改变成英文模式再摁Q进行退出即可。

5.2获取颜色设计

在窗口创建成功之后,就是颜色的获取。我们要做的就是找到我们的颜色,以便找到我们的颜色。我们需要引入颜色检测的代码,这一部分的内容在官方文档的第7章有涉及介绍,我们可以阅读相关内容进行函数学习,以及代码的编写。
我们需要检测上限阀值和下限阀值,同时我们还需要将窗口转化为HSV空间。
在代码中,我们需要定义一个函数来查找我们的颜色,具体代码如下。

def findColor(img, myColors, myColorValues):  # 查找颜色函数
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # chapter2
    count = 0  # 计数器来计算实际计数多少次
    newPoints = []
    for color in myColors:
        lower = np.array(color[0:3])  # chapter2 这里改为取前三个值
        upper = np.array(color[3:6])  # chapter2 这里改为取3-6的值
        mask = cv2.inRange(imgHSV, lower, upper)  # chapter2
        x, y = getContours(mask)  # 调用获取轮廓的函数
        # 绘制圆,中心点由x和y坐标确定,半径定为8,获取识别的颜色,然后进行圆的填充
        cv2.circle(imgResult, (x, y), 8, myColorValues[count], cv2.FILLED)
        # 在计数前,如果x和y不等于0,每次记录新的点进行追加
        if x != 0 and y != 0:
            newPoints.append([x, y, count])
        count += 1
        # cv2.imshow(str(color[0]),mask)
    return newPoints

图3 查找颜色代码

在第一步,我们先进行检测测试,将函数的输入设置为一个ing值即可,之后需要将其转化为HSV空间。为了检测是否正常工作,我们加入cv2.imshow()来进行测试。

def findColor(img):  # 查找颜色函数
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lower = np.array([h_min,s_min,v_min])
    upper = np.array([h_max,s_max,v_max])
    mask = cv2.inRange(imgHSV,lower,upper)
cv2.imshow("img",mask)

图4 查找颜色初步测试代码

在此处的cv2.imshow(“img”,mask)只是为了测试,在之后会将其进行删除。

我们不想只找到一种颜色,我们想找到不同的颜色,所以当我们调用findColor()函数时,我们想找到不同类型的颜色以及任何存在的颜色,并且将其作为输出。所以我们可以在函数上面,先以列表的形式定义一些内容,例如颜色的最小值和最大值。我们定义一个名为myColors的列表,这里基本上就是我们要检测的颜色列表。所以我们需要在赋值的时候,给出最小和最大色相饱和值。此处我们选择一些特定的颜色,例如红色,蓝色,绿色等颜色,实现给出颜色预订值。这可以帮助我们使用网络摄像头选择正确的色相饱和度值。

下方为检测预订设置颜色代码

import cv2
import numpy as np

frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(1)
cap.set(3, frameWidth)
cap.set(4<
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Opencv实现的多彩隔空画图 的相关文章

  • 在 Django 中定义视图和 url。为什么调用函数时不使用括号?

    我已经在经历 Python速成课程 目前正在进行 Django Web应用程序项目 学习日志 阶段 有些东西与我已经学到的相矛盾 views py file from django shortcuts import render def i
  • 打印 scrapy 请求的“响应”

    我正在尝试学习 scrapy 在遵循教程的同时 我正在尝试进行细微的调整 我想简单地从请求中获取响应内容 然后我会将响应传递到教程代码中 但我无法发出请求并获取响应内容 建议就好 from scrapy http import Respon
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现

随机推荐

  • vue 动态组件component标签

    vue 提供了一个内置的
  • python笔记:#013#高级变量类型

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 int 浮点型 float 布尔型 bool 真 True 非 0 数 非零即真 假 Fal
  • Ubuntu root账户登陆电脑

    vi etc pam d gdm autologin 屏蔽 auth required pam succeed if so user root quiet success vi etc pam d gdm password 屏蔽auth r
  • nextLine().split(“[\\s]“)的意思

    Scanner sc new Scanner System in String a sc nextLine split s 这句话的意思是 把输入的字符串以 s 为条件分割成一个String数组 s表示空格 回车 换行等空白符 当然 单表示
  • 学python的第十五天---简单数论

    模运算 一 刷题统计 二 快速幂 三 RSA解密 GCD LCM 四 核桃的数量 最小公倍数 五 Hankson 的趣味题 六 寻找整数 素数 七 笨小孩 八 质数 九 分解质因数 模运算 ab mod m a mod m b mod m
  • Java实现比较版本号

    涉及到客户端的系统中经常需要用到比较版本号的功能 但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法 这就需要我们总结版本号的通用规则 设计一个比较算法并封装成通用方法来使用 通常版本号如 1 3 20 8 6 8
  • RS-485总线前世今生;

    一 RS232和RS485的区别 RS 232采取的是单端不平衡传输方式 其收发端的数据信号都是相对于地信号的 所以共模抑制能力 差 再加上双绞线分布电容的影响 其最大传输距离仅为15米 最高传输速率只有20kbit s 2560Byte
  • bash脚本调试方法

    本文全面系统地介绍了shell脚本调试技术 包括使用echo tee trap等命令输出关键信息 跟踪变量的值 在脚本中植入调试钩子 使用 n 选项进行shell脚本的语法检查 使用 x 选项实现shell脚本逐条语句的跟踪 巧妙地利用sh
  • Bandizip已管理员身份运行

    系列文章目录 文章目录 系列文章目录 前言 一 Bandzib是什么 二 使用步骤 1 引入库 前言 在解压krita源码包时Bandizip报错 一 Bandzib是什么 bandzip官网 Bandizip 是一款压缩软件 它支持Zip
  • 3D空间堆叠PCB设计 ——PCB线路优化项目总结

    3D空间PCB堆叠设计适用于线路板安装空间狭小场合使用 PCB空间排布大大提高空间利用率更加高效 前言 19年的5月下旬有人找我做一个项目 他们要3块比手掌张开还大的电路板 如下图 优化到可以放入水杯类似的圆柱体中 高度越底越好 这种 主体
  • 利用python爬取招聘网站上的相关岗位信息

    这段代码是一个爬取Boss直聘网站上数据岗位信息的爬虫程序 它使用了异步编程库asyncio和网页自动化测试库pyppeteer来实现异步的网页爬取和数据提取 import asyncio 异步编程库 import random 随机数生成
  • 不用看网课就能学到python的文章(第三天)

    紧接着上一篇不用看网课就能学到python的文章 第二天 Why does it work的博客 CSDN博客 如果说到语句 那我们应该了解一些一些python python最具特色的就是使用缩进来表示代码块 不需要使用大括号 行与缩进 i
  • google Guava之EventBus

    文章目录 EventBus基本用法 1 创建Listener 2 创建EventBus并发送消息 Listener之间的继承关系 Subscriber 不同类型参数的Subscribe event 继承关系的event DeadEvent
  • 树莓派3B安装python3 opencv环境

    树莓派3b 若干年前买的 软件具体配置不记得 python缺省版本为3 53 直接用pip命令安装不成功 显示一堆的红字 update upgrade一下 耗时挺长 再安装 成功了 如下图 sudo apt get update sodu
  • C++11 并发指南系列

    本系列文章主要介绍 C 11 并发编程 计划分为 9 章介绍 C 11 的并发和多线程编程 分别如下 C 11 并发指南一 C 11 多线程初探 本章计划 1 2 篇 已完成 1 篇 C 11 并发指南二 std thread 详解 本章计
  • 微信小程序:cavans的使用(一)

    最近用到这个canvas画布这个组件 其实还是挺有意思的 优点是可以给用户绘制宣传海报什么的 这个现在好多小程序都有这个 比如给你一个专属海报有你的头像还有你的二维码 你可以保存在你的相册里 你可以取拿它去拉人 微信小程序canvas组件官
  • 因为好兄弟一句话竞。。。

    职教云查同学考试成绩 本来在打游戏 好兄弟微信问了我一句职教云未公开的考试能不能 打包好的软件下载地址在文章后面 然后在想 考试未公开 只有那老师能看班里同学成绩 先试了抓一下包 发现在学生端啥也没有只能获得考试的ID 好家伙 突然灵光一闪
  • 继承与多态(Java实现)

    继承和多态 一 类的继承 1 继承的实现 语法格式 class 子类名 extends 父类名 类体 注 extends是关键字 Java中只支持单继承 所以子类只有一个父类 但可以多层继承 子类通过继承可以获得父类的public prot
  • PCL 计算点云的高斯曲率和平均曲率

    目录 一 算法原理 二 代码实现 三 结果展示 四 相关链接 一 算法原理 已知某点的主曲率为 k 1 k 2 k 1 k 2 k
  • 基于Opencv实现的多彩隔空画图

    1 问题概述 人工智能带火了计算机视觉的人才需求 作为计算机视觉应用开发框架OpenCV也越来越受到欢迎 市场需求大增 因此 在学习Python的基础上 进行Opencv技术的学习是十分重要且有必要的 该项技术不仅有着成熟的学习框架 更有广