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为多彩隔空画图总体结构设计,总体分为摄像头读取图像框、获取颜色、基本单位圆点、实现绘制路径四个模块。其中摄像头读取图像框模块主要是在屏幕中创建一个窗口,在这个窗口中实现画图路径的绘制;在获取颜色模块,主要借用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
首先我们需要导入库,通过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
在第一步,我们先进行检测测试,将函数的输入设置为一个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)
在此处的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(