当今时代最令人头疼的事情就是找不到停车位,尤其是找20分钟还没有找到停车位。

根据复杂性和效率的不同,任何问题都具有一个或多个解决方案。目前智能停车系统的解决方案,主要包括基于深度学习实现,以及基于重量传感器、光传感器实现等。

本期我们将一起通过使用摄像头和少量代码来实现最简单的智能停车系统。该解决方案所使用的概念非常简单。它由具有以下两个脚本组成:

1. 选择停车位的坐标并将其保存到文件中。

2. 从文件中获取坐标,并确定该点是否可用。

将该解决方案分成两个脚本的原因是,避免在每次确定是否有可用停车位的时候,就进行停车位的选择。

为了使这一过程尽可能简单,从现在开始,我们将这两个脚本称为selector和detector。

相关依赖

在本文中,我们使用python 3.7.6,但其他版本(例如3.6或3.8)当然也可以使用。首先我们要检查python的版本,我们通过在控制台中编写python –version,即可返回已安装的python版本。

C:\Users\Razvan>python --version
Python 3.7.6

在开始构建该系统依赖项之前,我们可以设置一个虚拟环境。通过以下链接我们可以了解更多有关虚拟环境的信息https://docs.python.org/3.7/tutorial/venv.html。

也可以使用conda创建和管理环境。有关更多信息见https://docs.anaconda.com/anaconda/。

在python中设置完所有内容后, 最重要的依赖关系将是OpenCV库。通过pip将其添加到虚拟环境中,可以运行pip install opencv-python。

要检查所有设置是否正确,我们可以使用以下cv2.__version__命令打印环境中可用的当前OpenCV版本。

(OpenCV) C:\Users\Razvan>python
Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
4.2.0
>>>

在第一行中,我们可以看到在该项目中使用了名为OpenCV的虚拟环境。

步骤

首先,我们需要安装一个停车场摄像头。由于我们并没有一个窗户可以看到的任何停车场,因此我们选择使用旧汽车玩具和印刷纸。另外,我在停车场上方设置了一个网络摄像头,以获取良好的图像,因此我们正在处理的图像如下所示:

selector选择器

接下来,我们来介绍编码部分。首先,我们需要构建选择器。我们从导入所需模块开始

import cv2
import csv

之后,我们开始获取图像,在该图像上选择停车位。为此,我们可以选择摄网络摄像头提供的第一帧,保存并使用该图像选择停车位。下面的代码是这样的:

1. 打开image变量中的视频流;suc确定流是否成功打开。

2. 将第一帧写入frame0.jpg。

3. 流被释放,所有窗口都关闭。

4. 新保存的图片将以img变量形式读取。

VIDEO_SOURCE = 1cap = cv2.VideoCapture(VIDEO_SOURCE)
suc, image = cap.read()
cv2.imwrite("frame0.jpg", image)
cap.release()
cv2.destroyAllWindows()
img = cv2.imread("frame0.jpg")

现在,我们已经保存了第一帧并在img变量中将其打开,可以使用selectROIs函数标记停车位。ROI被定义为感兴趣的区域,代表图像的一部分,我们将在其上应用不同的函数以及滤波器来获取结果。

返回到selectROIs函数,这将返回一个列表(类型:numpy.ndarray),其中包含我们组装图像所需的数字及其边界ROI。

r = cv2.selectROIs('Selector', img, showCrosshair = False, fromCenter = False)

我们的列表将保存在变量r中。赋予cv2.selectROIs函数的参数如下:

1. “选择器”是允许我们选择投资回报率的窗口的名称。

2. img是包含我们要选择图像的变量。

3. showCrosshair = Flase删除选区内部的中心线。可以将其设置为True,因为对结果没有影响。

4. fromCenter = False是一个非常重要的参数,因为如果将其设置为True,则正确的选择会困难得多。

选择所有停车位之后,是时候将它们写入.csv文件了。为此,我们需要将r变量转换为python列表,可以使用rlist = r.tolist()命令实现。

拥有适当的数据后,我们将其保存到.csv文件中,以备将来使用。

with open('data/rois.csv', 'w', newline='') as outf:csvw = csv.writer(outf)csvw.writerows(rlist)

detector探测器

现在我们已经选择了停车位,是时候进行一些图像处理了。解决这个问题的方法如下:

1. 从.csv文件获取坐标。

2. 从中构建新图像。

3. 应用OpenCV中可用的Canny函数。

4. 计算新图像内的白色像素。

5. 建立一个点内的像素范围将被占用。

6. 在实时供稿上绘制一个红色或绿色矩形。

对于所有这些操作,我们需要定义一个要应用于每个位置的函数。该函数如下所示:

def drawRectangle(img, a, b, c, d):sub_img = img[b:b + d, a:a + c]edges = cv2.Canny(sub_img, lowThreshold, highThreshold)pix = cv2.countNonZero(edges)if pix in range(min, max):cv2.rectangle(img, (a, b), (a + c, b + d), (0, 255, 0), 3)spots.loc += 1else:cv2.rectangle(img, (a, b), (a + c, b + d), (0, 0, 255), 3)

现在我们已经实现了所需的功能,如果我们直接将其应用于.csv文件中的每组坐标效果可能并不好。因此我们做如下处理

首先,我们的有一些参数如果可以在脚本运行时(也可以在通过GUI)实时调整它们,那就更好了。为此,我们需要构建一些轨迹栏。OpenCV为我们提供这项功能。

我们需要一个回调函数,该函数不执行任何操作,但作为使用OpenCV创建轨迹栏的参数是必需的。实际上,回调参数具有明确定义的用途,但我们在此不使用它。要了解有关此内容的更多信息,查阅OpenCV文档。

def callback(foo):pass

现在我们需要创建轨迹栏。我们将使用cv2.namedWindow和cv2.createTrackbar功能。

cv2.namedWindow('parameters')
cv2.createTrackbar('Threshold1', 'parameters', 186, 700, callback)
cv2.createTrackbar('Threshold2', 'parameters', 122, 700, callback)
cv2.createTrackbar('Min pixels', 'parameters', 100, 1500, callback)
cv2.createTrackbar('Max pixels', 'parameters', 323, 1500, callback)

现在,我们已经创建了用于操作参数的GUI,只剩下一件事了。这就是图像中可用斑点的数量。在drawRectangle中定义为spot.loc。这是一个静态变量,必须在程序开始时进行定义。该变量为静态变量的原因是,我们希望调用的每个drawRectangle函数都将其写入相同的全局变量,而不是每个函数都使用一个单独的变量。这样可以防止返回的可用空间数量大于实际的可用空间数量。

为了实现这一点,我们只需要使用它的loc静态变量创建spots类。

class spots:loc = 0

现在我们已经准备就绪,只需要从.csv文件中获取数据,将其所有数据转换为整数,然后在无限循环中应用构建的函数即可。

with open('data/rois.csv', 'r', newline='') as inf:csvr = csv.reader(inf)rois = list(csvr)rois = [[int(float(j)) for j in i] for i in rois]
VIDEO_SOURCE = 1
cap = cv2.VideoCapture(VIDEO_SOURCE)while True:spots.loc = 0ret, frame = cap.read()ret2, frame2 = cap.read()min = cv2.getTrackbarPos('Min pixels', 'parameters')max = cv2.getTrackbarPos('Max pixels', 'parameters')lowThreshold = cv2.getTrackbarPos('Threshold1', 'parameters')highThreshold = cv2.getTrackbarPos('Threshold2', 'parameters')for i in range(len(rois)):drawRectangle(frame, rois[i][0], rois[i][1], rois[i][2], rois[i][3])font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(frame, 'Available spots: ' + str(spots.loc), (10, 30), font, 1, (0, 255, 0), 3)cv2.imshow('Detector', frame)canny = cv2.Canny(frame2, lowThreshold, highThreshold)cv2.imshow('canny', canny)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

拓展

在我们的循环中实际上只是调用的构建函数要复杂一点。

首先,我们将空间的数量初始化为0,以防止每帧添加数字。

其次,我们进入两个处理流以显示真实图像和已处理的图像。这有助于更好地了解此脚本的工作方式以及图像的处理方式。

然后,我们需要在每次迭代中获取我们创建的参数 GUI中的参数值。这是通过cv2.getTrackbarPos功能完成的。

接下来最重要的部分,将drawRectangle函数应用到Selector脚本获取的所有坐标上。

最后,在结果图像上写下可用斑点的数量,显示Canny函数的结果,显然,这是一种众所周知的停止循环的方法。

我们现在便完成了一个智能停车项目!

总结

如今,智能停车已成为热门话题之一,并且有许多实现方式可以导致良好的功能系统。我们这处理方法并不是完美的,有许多方法可以更好地优化结果,并且可以在更多情况下使用。但是,即使这不能解决停车场危机,也可能是导致危机 的主要原因。

往期精彩回顾适合初学者入门人工智能的路线及资料下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载本站qq群955171419,加入微信群请扫码:

【CV】基于python和OpenCV构建智能停车系统相关推荐

  1. 基于 Python 和 OpenCV 构建智能停车系统

    作者 | 努比 来源 | 小白学视觉 当今时代最令人头疼的事情就是找不到停车位,尤其是找20分钟还没有找到停车位. 根据复杂性和效率的不同,任何问题都具有一个或多个解决方案.目前智能停车系统的解决方案 ...

  2. 基于python和OpenCV构建智能停车系统

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 当今时代最令人头疼的事情就是找不到停车位,尤其是找20分钟还没有找 ...

  3. python和arduino哪个好_基于Python和Arduino的智能花盆系统

    基于 Python 和 Arduino 的智能花盆系统 杨吉云 YANG Ji-yun :徐乾淏 XU Qian-hao :沈莲 SHEN Lian :章晓敏 ZHANG Xiao-min [摘 要] ...

  4. 基于ssm和mysql的智能停车系统、javaweb实现bs结构的停车场智能车位出入管理

    java实现的停车场管理,基于SSM的智能停车系统 ssm实现的校园或者说小区智能停车系统.系统分为普通员工.管理员两个角色,目前系统是基于ssm实现.后期抽空会实现一个springboot版本的. ...

  5. web课程设计网页规划与设计 基于HTML+CSS+JavaScript制作智能停车系统公司网站静态模板

  6. 基于Python的OpenCV+TensorFlow+Keras人脸识别实现

    前言:本节要讲的人脸识别主要是借鉴了 一位研究生前辈的文章 我只是在他的基础上进行了改动,让代码能在现在的TensorFlow2.X 等的环境下运行 先看一下效果图 完整工程及源代码请点击链接下载:人 ...

  7. 基于Python通过OpenCV实现的口罩识别系统理论篇

    基于Python通过OpenCV实现的口罩识别系统理论设计篇 一.项目实现环境 基于Python 3.8.1版本 opencv-python 4.2.0.34版本 需要自己下载OpenCV的库文件,添 ...

  8. android移动停车车位管理系统的分析与设计,基于Android与WiFi的智能停车管理系统的设计与实现...

    摘要: 伴随着我国人民平均收入的不断提高,汽车已经成为人们出行的主流交通工具,城区商业金融和医疗服务中心的"停车难"成为阻碍城市交通发展的一大难题.传统的停车引导方式缺乏高效的停车 ...

  9. 基于Python+百度语音的智能语音ChatGPT聊天机器人(机器学习+深度学习+语义识别)含全部工程源码 适合个人二次开发

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 Python 环境 Pycharm 环境 ChatterBot 环境 模块实现 1. 模型构建 2. 服务器端 3. 客户端 4. 语音录入 ...

最新文章

  1. 这次我让你彻底弄懂 RESTful
  2. 直播回顾|基于格雷码结合相移技术的高鲁棒性高效率动态三维面形测量
  3. 如何写好数据分析师简历
  4. pyton中的self具体含义,加self与不加self有什么区别?
  5. 嵌入式Linux LED,键盘,AD驱动程序开发
  6. python 图片转视频ffmpeg_python图片转视频(opencv),ffmpeg压缩视频
  7. java学习(24):if..else...if
  8. 老项目换unicorn的大致步骤
  9. new file 的路径问题_cmake系列 - 解决__FILE__ 宏绝对路径的问题(相对路径)
  10. ICPC程序设计题解书籍系列之一:刘汝佳:《算法竞赛入门经典》(第2版)
  11. How to make your 100k to 10k (5)
  12. [译]C语言实现一个简易的Hash table(2)
  13. 关于javaweb中sql语句中使用变量的情况
  14. 一个校园互联网实验室的纳新试题(我的服务端开发笔试题)
  15. 【傻瓜教程】手把手教你安装pip
  16. LoadLibrary加载dll失败, 报告找不到指定的模块 的问题的解决
  17. macOS Mojave(软件篇):微信 for Mac 防撤回插件(WeChatTweak-macOS)
  18. linux进程kill后显示deduct,oracle问题
  19. canvas示例样式_使用js canvas和atari vcs trivia制作基本html游戏的快速示例
  20. java基础知识复习(上半)

热门文章

  1. canvas用2d渲染出3d的感觉
  2. eclipse 安装tomcat
  3. 无限的hypotheses 变成有限的dichotomies
  4. Mac开发环境配置 就喜欢折腾
  5. 【Beta阶段】M2事后分析
  6. linux内核及其模块的查询,加载,卸载 lsusb等
  7. 如何打开.etl文件?
  8. Windows常用软件列表(2012.03 Update)
  9. 配置MySQL5.7基于GTID的复制
  10. AVL树平衡旋转详解