资讯专栏INFORMATION COLUMN

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

89542767 / 390人阅读

  小编写这篇文章的一个主要目的,主要是给大家就相关的具体内容做出一些详细解答,比如了解使用python的相关知识,主要是涉及到python Opencv的一些相关知识,比如使用python Opencv实现停车位识别,就具体的内容,下面给大家详细解答下。


  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)

01.png

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


  #首先查看文件是否已经包含了CarParkPos文件


  try:
  with open('CarParkPos','rb')as fp:
  position=pickle.load(fp)
  except:
  #存储所有停车位的坐标列表
  position=[]

02.png

  (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(建议看懂视频中的思路)


  2.整体代码实战

03.png

 (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)视频效果

04.png

  停车位识别演示


  综上所述,这篇文章就给大家介绍到这里了,希望可以给各位读者带来一定的帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128392.html

相关文章

  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别

    摘要:实现实时人脸识别本文记录了在学习深度学习过程中,使用,开发环境为,实现局域网连接手机摄像头,对目标人员进行实时人脸识别,效果并非特别好,会继续改进这里是项目地址项目中用到的大文件地址如果各位老爷看完觉得对你有帮助的话,请给个小星星,当前时间 opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,...

    megatron 评论0 收藏0
  • 女朋友嫌我拍的照片有雾,连夜用OpenCV写出❤️去雾算法❤️逃过一劫(收藏保命)

    ❤️欢迎订阅《从实战学python》专栏,用python实现爬虫、办公自动化、数据可视化、人工智能等各个方向的实战案例,有趣又有用!❤️ 更多精品专栏简介点这里 治愈生活的良方 就是保持对生活的热爱 前言 哈喽,大家好,我是一条。 每次和女朋友出去玩,拍照是必须的,天气好还行,天气要是不好,加上我这破手机,那拍的简直惨不忍睹,自己都不过去。 但是没什么能难倒程序员的,为了不挨骂,连夜写出去雾...

    DTeam 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<