python Opencv实现停车位识别思路详解

目录
  • 1.实现的思路
  • 2.整体代码实战
  • 3.停车位视频下载

1.实现的思路

(1)首先使用一个处理画框的程序,将图片中的有车和无车的停车位给画出来,并且保存坐标(如果画错了,将鼠标移至要删除的框中,右击鼠标,即可删除);

#定义回调函数
def mouseClick(events,x,y,flags,params):
    #按下鼠标左键,将点击的坐标(x,y)保存到position列表中
    if (events&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN):
        position.append((x,y))
    #按下鼠标右键时,移除选中的框
    if (events&cv2.EVENT_RBUTTONDOWN==cv2.EVENT_RBUTTONDOWN):
        for i,pos in enumerate(position):
            (x1,y1)=pos
            if (x1<x<x1+img_width and y1<y<y1+img_height):
                position.pop(i)

(2)画好之后,关闭窗口,即可看到已经保存好坐标的文件,下次再运行程序时,不用再画框;程序会读出当前文件,将之前保存好的坐标加载出画出框。

#首先查看文件是否已经包含了CarParkPos文件
try:
    with open('CarParkPos','rb') as fp:
        position=pickle.load(fp)
except:
    # 存储所有停车位的坐标列表
    position=[]

(3)主程序的思路
将摄像头读取的图片进行处理
Opencv基础知识点:
https://www.jb51.net/article/254006.htm
高斯去噪:
https://www.jb51.net/article/198212.htm
局部二值化:
https://www.jb51.net/article/248000.htm
中值滤波:
https://www.jb51.net/article/198212.htm
Opencv中获取卷积核:
https://www.jb51.net/article/254013.htm
腐蚀操作:
https://www.jb51.net/article/214725.htm

#转换为灰度图
    gray=cv2.cvtColor(src=frame,code=cv2.COLOR_BGR2GRAY)
    #高斯去噪
    gauss=cv2.GaussianBlur(src=gray,ksize=(3,3),sigmaX=0)
    #图像二值化处理
    thresh=cv2.adaptiveThreshold(src=gauss,maxValue=255,adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            thresholdType=cv2.THRESH_BINARY_INV,blockSize=21,C=16)
    # 中值滤波操作
    median=cv2.medianBlur(src=thresh,ksize=3)
    #腐蚀操作
    dilate=cv2.dilate(src=median,kernel=kernel,iterations=1)
    for pos in position:
        (x,y)=pos
        mask=dilate[y:y+img_height,x:x+img_width]
        # cv2.imshow(str(x*y),mask)
        #返回灰度值不为0的像素数,可用来判断图像是否全黑。
        count=cv2.countNonZero(mask)
        #当计算的count低于800,表示是一个空位
        if count<800:
            countBlackCar+=1
            color=(0,255,0)
            thickness=3
        else:
            color=(0,0,255)
            thickness=2

        cv2.rectangle(img=frame, pt1=(pos[0], pos[1]),
                      pt2=(pos[0] + img_width, pos[1] + img_height),
                      color=color, thickness=thickness)
        cvzone.putTextRect(img=frame, text=str(count), pos=(x + 3, y + img_height - 5),
                           scale=0.8, thickness=1, offset=0,colorR=color)

参考视频教程:https://www.bilibili.com/video/BV14Z4y1Q7au?t=3992.0(建议看懂视频中的思路)
注:代码不重要,主要是学会给出的链接中这位博主的思路。使用更加简单的方法解决问题,但是呢?这种方法我认为主要是为解决那种固定摄像头拍摄的停车位,因为我们标注的坐标是固定的(但是可以利用深度学习提取有车和无车的特征进行识别,定位的可以使用Opencv来解决)。

2.整体代码实战

(1)ParkingSpacePicker.py

import os
import cv2
import pickle

#首先查看文件是否已经包含了CarParkPos文件
try:
    with open('CarParkPos','rb') as fp:
        position=pickle.load(fp)
except:
    # 存储所有停车位的坐标列表
    position=[]

#停车位的高宽
img_width,img_height=47,88
#定义回调函数
def mouseClick(events,x,y,flags,params):
    #按下鼠标左键,将点击的坐标(x,y)保存到position列表中
    if (events&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN):
        position.append((x,y))
    #按下鼠标右键时,移除选中的框
    if (events&cv2.EVENT_RBUTTONDOWN==cv2.EVENT_RBUTTONDOWN):
        for i,pos in enumerate(position):
            (x1,y1)=pos
            if (x1<x<x1+img_width and y1<y<y1+img_height):
                position.pop(i)

    with open('CarParkPos','wb') as fp:
        pickle.dump(position,fp)

while True:
    img=cv2.imread('images/packing.png')
    for pos in position:
        cv2.rectangle(img=img,pt1=(pos[0],pos[1]),
                      pt2=(pos[0]+img_width,pos[1]+img_height),
                      color=(0,255,0),thickness=2)

    cv2.imshow('Packing',img)
    #设置鼠标事件
    cv2.setMouseCallback('Packing',mouseClick)
    key=cv2.waitKey(1)
    if key==27:
        break

cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')

(2)main.py

import os
import cv2
import pickle
import cvzone

with open('CarParkPos', 'rb') as fp:
    position = pickle.load(fp)

#停车位的高宽
img_width,img_height=47,88

cap=cv2.VideoCapture('video/packing-3.mp4')

def checkParkingSpace(dilate):
    countBlackCar=0
    for pos in position:
        (x,y)=pos
        mask=dilate[y:y+img_height,x:x+img_width]
        # cv2.imshow(str(x*y),mask)
        #返回灰度值不为0的像素数,可用来判断图像是否全黑。
        count=cv2.countNonZero(mask)
        #当计算的count低于800,表示是一个空位
        if count<800:
            countBlackCar+=1
            color=(0,255,0)
            thickness=3
        else:
            color=(0,0,255)
            thickness=2

        cv2.rectangle(img=frame, pt1=(pos[0], pos[1]),
                      pt2=(pos[0] + img_width, pos[1] + img_height),
                      color=color, thickness=thickness)
        cvzone.putTextRect(img=frame, text=str(count), pos=(x + 3, y + img_height - 5),
                           scale=0.8, thickness=1, offset=0,colorR=color)
    return countBlackCar

#获取卷积核
kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(3,3))

while cap.isOpened():
    #循环播放视频文件
    if cap.get(cv2.CAP_PROP_POS_FRAMES)==cap.get(cv2.CAP_PROP_FRAME_COUNT):
        cap.set(cv2.CAP_PROP_POS_FRAMES,0)

    ret,frame=cap.read()
    # frame=cv2.resize(src=frame,dsize=(750,600))
    height,width,channel=frame.shape
    if not ret:
        break

    #转换为灰度图
    gray=cv2.cvtColor(src=frame,code=cv2.COLOR_BGR2GRAY)
    #高斯去噪
    gauss=cv2.GaussianBlur(src=gray,ksize=(3,3),sigmaX=0)
    #图像二值化处理
    thresh=cv2.adaptiveThreshold(src=gauss,maxValue=255,adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            thresholdType=cv2.THRESH_BINARY_INV,blockSize=21,C=16)
    # 中值滤波操作
    median=cv2.medianBlur(src=thresh,ksize=3)
    #腐蚀操作
    dilate=cv2.dilate(src=median,kernel=kernel,iterations=1)

    cntCar=checkParkingSpace(dilate)

    cvzone.putTextRect(img=frame,text="BlackPosition: "+str(cntCar),
                       pos=(20,height-80),scale=1.0,thickness=2)
    cv2.imshow('img',frame)
    # cv2.imshow('thresh',thresh)
    # cv2.imshow('median',median)
    # cv2.imshow('dilate',dilate)
    key=cv2.waitKey(30)
    if key==27:
        break
cv2.destroyAllWindows()
if __name__ == '__main__':
    print('Pycharm')

(3)视频效果

停车位识别演示

注:视频自己做的比较差,建议读者最好自己尝试实现这个思路。

3.停车位视频下载

https://699pic.com/movie/295567.html

到此这篇关于Opencv实现停车位识别的文章就介绍到这了,更多相关Opencv实现停车位识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python+OpenCV进行人脸面部表情识别

    目录 前言 一.图片预处理 二.数据集划分 三.识别笑脸 四.Dlib提取人脸特征识别笑脸和非笑脸 前言 环境搭建可查看Python人脸识别微笑检测 数据集可在https://inc.ucsd.edu/mplab/wordpress/index.html%3Fp=398.html获取 数据如下: 一.图片预处理 import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy import cv2 # 图像处理的库OpenCv import os

  • Python中使用Opencv开发停车位计数器功能

    目录 1. 环境安装 1.1 安装并激活虚拟环境 1.2 python包安装 2. 绘制停车位矩形框 2.1 导入停车场图片 2.2 绘制矩形框 定位停车位 2.3 鼠标添加.删除停车位 3. 停车位视频分析 3. 1 停车监控视频 3. 2 截取停车位 3. 3 图像处理 3. 4 判断停车位是否被占用 在这个项目中,我们将创建一个停车位计数器.我们会发现总共有多少辆车,以及有多少停车位是空的.关于本教程最好的一点是,我们将使用基本的图像处理技术来解决这个问题,没有使用机器学习.深度学习进行训

  • Python如何利用opencv实现手势识别

    目录 获取视频(摄像头) 肤色检测 轮廓处理 前言: 网上搜到了一些关于手势处理的实验,我在这儿简单的实现一下,主要运用的知识就是opencv,python基本语法,图像处理基础知识. 获取视频(摄像头) 这部分没啥说的,就是获取摄像头. cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件 #cap = cv2.VideoCapture(0)#读取摄像头 while(True): ret, frame = cap.re

  • OpenCV Python身份证信息识别过程详解

    目录 前置环境 识别过程 身份证区域查找 原始图像 灰度处理 中值滤波 二值处理 边缘检测 边缘膨胀 轮廓检测 轮廓排序 透视变换 固定图像大小 检测身份证文本位置 极度膨胀 轮廓查找文本区域 筛选出文本区域 对文本区域进行排序 识别文本 结语 代码 本篇文章使用OpenCV-Python和CnOcr来实现身份证信息识别的案例.想要识别身份证中的文本信息,总共分为三大步骤:一.通过预处理身份证区域检测查找:二.身份证文本信息提取:三.身份证文本信息识别.下面来看一下识别的具体过程CnOcr官网.

  • Python+Opencv答题卡识别用例详解

    使用Python3和Opencv识别一张标准的答题卡.大致的过程如下: 1.读取图片 2.利用霍夫圆检测,检测出四个角的黑圆位置,从确定四个角的位置 3.利用透视变换和四个角的位置,矫正图片(直接用的网上的图片,没有拍照,所以这一步没有实现) 4.裁剪四个边框,获取边框上小黑格的位置 5.根据小黑格的位置确定每个涂卡区域的位置 6.将答题卡腐蚀和膨胀,遍历所有的格子的区域,计算每个区域内像素值为0的个数,若数量达到某个值,那么就确认这个格子是被黑笔涂过,并记录该位置的题目选项. 具体的实现 一.

  • python Opencv实现停车位识别思路详解

    目录 1.实现的思路 2.整体代码实战 3.停车位视频下载 1.实现的思路 (1)首先使用一个处理画框的程序,将图片中的有车和无车的停车位给画出来,并且保存坐标(如果画错了,将鼠标移至要删除的框中,右击鼠标,即可删除): #定义回调函数 def mouseClick(events,x,y,flags,params): #按下鼠标左键,将点击的坐标(x,y)保存到position列表中 if (events&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN)

  • python计算机视觉opencv卡号识别示例详解

    目录 一.模板预处理 1.将模板设置为二值图 2.检测模板的轮廓 3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储 4.备注 二.图片预处理 1.初始化卷积核 2.图片预处理第一部分 3.图像预处理第二部分 三.轮廓处理 1.大轮廓过滤 2.小轮廓分割 模板图片如下: 需识别的图片如下: 一.模板预处理 1.将模板设置为二值图 2.检测模板的轮廓 3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储 排序的函数如下: 排序并存储: 4.备注 ①每一个数字对应的是二值图截出来的那个数字图的

  • Python OpenCV实现图形检测示例详解

    目录 1. 轮廓识别与描绘 1.1 cv2.findComtours()方法 1.2 cv2.drawContours() 方法 1.3 代码示例 2. 轮廓拟合 2.1 矩形包围框拟合 - cv2.boundingRect() 2.2圆形包围框拟合 - cv2.minEnclosingCircle() 3. 凸包 绘制 4. Canny边缘检测 - cv2.Canny() 4.1 cv2.Canny() 用法简介 4.2 代码示例 5. 霍夫变换 5.1 概述 5.2 cv2.HoughLin

  • Python+OpenCV实现图像识别替换功能详解

    OpenCV-Python是一个Python库,旨在解决计算机视觉问题. OpenCV是一个开源的计算机视觉库,1999年由英特尔的Gary Bradski启动.Bradski在访学过程中注意到,在很多优秀大学的实验室中,都有非常完备的内部公开的计算机视觉接口.这些接口从一届学生传到另一届学生,对于刚入门的新人来说,使用这些接口比重复造轮子方便多了.这些接口可以让他们在之前的基础上更有效地开展工作.OpenCV正是基于为计算机视觉提供通用接口这一目标而被策划的. 安装opencv pip3 in

  • Python+Opencv实现图像模板匹配详解

    目录 引言 一.匹配方法 二.匹配单个对象 三.匹配多个对象 引言 什么是模板匹配呢? 看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等. 模板匹配可以看作是对象检测的一种非常基本的形式.使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象. 一.匹配方法 cv2.matchTemplate(img, templ, method) 参数:(img: 原始图像.temple: 模板图像.method: 匹配度计算方法) 方法如下: cv2.TM_SQD

  • python实现爬山算法的思路详解

    问题 找图中函数在区间[5,8]的最大值 重点思路 爬山算法会收敛到局部最优,解决办法是初始值在定义域上随机取乱数100次,总不可能100次都那么倒霉. 实现 import numpy as np import matplotlib.pyplot as plt import math # 搜索步长 DELTA = 0.01 # 定义域x从5到8闭区间 BOUND = [5,8] # 随机取乱数100次 GENERATION = 100 def F(x): return math.sin(x*x)

  • python实现括号匹配的思路详解

    1.用一个栈[python中可以用List]就可以解决,时间和空间复杂度都是O(n) # -*- coding: utf8 -*- # 符号表 SYMBOLS = {'}': '{', ']': '[', ')': '(', '>': '<'} SYMBOLS_L, SYMBOLS_R = SYMBOLS.values(), SYMBOLS.keys() def check(s): arr = [] for c in s: if c in SYMBOLS_L: # 左符号入栈 arr.appe

  • Python实现仿射密码的思路详解

    仿射密码思路: 1.加解密公式: 2.构造对应字典: 3.代码实现 构造字典,建立映射关系: # 构造字典,'A' --> 0 ... def char_2_num(x): list_s = [] list_num = [] for i in range(26): c = chr(i + 65) list_s.append(c) list_num.append(i) c_2_n = dict(map(lambda x, y: [x, y], list_s, list_num)) return c

  • Python+Opencv实战之人脸追踪详解

    目录 前言 人脸追踪技术简介 使用基于 dlib DCF 的跟踪器进行人脸跟踪 使用基于 dlib DCF 的跟踪器进行对象跟踪 小结 前言 人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份.意图和情感:而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用.由于外观变化.遮挡.快速运动.运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性. 人脸追踪技术简介 基于判别相关滤波器 (d

  • Python OpenCV学习之图像滤波详解

    目录 背景 一.卷积相关概念 二.卷积实战 三.均值滤波 四.高斯滤波 五.中值滤波 六.双边滤波 七.Sobel算子 八.Scharr算子 九.拉普拉斯算子 十.Canny算法 背景 图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像:明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积:实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数:当然在深度学习之前,也有一些常见的滤波器,本篇主要介绍这些常见的滤波器: 一.卷积相关概念 卷积核大小一般为奇数的原因:

随机推荐