车位数量检测|快消息
时间:2023-05-05 15:10:27来源:磐创AI

该项目基于图像处理来检测停车场中的空间。

该项目将使用 openCV 和 CVzone 库来执行图像处理任务。

如何运行


(相关资料图)

用鼠标单击功能在停车场的静止图像上绘制框在这些单独的框上裁剪和执行 opencv 转换结合这两个步骤并将它们应用于视频以检查可用的可用空间

过程

1. 安装和导入依赖项

openCV 将允许我们导入图像和视频,然后我们可以对它们应用转换,CVzone作为基于 openCV 的库,它还允许我们使用与 openCV 相比所需语法更少的转换,“Pickel”用于存储在图片上绘制的方框的位置,“numpy”用于应用简单的转换。

importcv2

importpickle

importcvzone

importnumpyasnp

我们将处理使用 parkingspacepicker.py 绘制框并存储位置,并通过 pickel 在我们的 main.py 中使用这些位置

2. 绘制方框

在此图像中,我们可以看到空间分布不均,并且间隔各不相同。

我们稍后将使用的视频的相机处于静态状态,因此我们可以通过在框上手动绘制框来接近它。

为此,我们需要知道单个框的高度和宽度,然后我们将不得不尝试不同的值以获得完美形状的框

importcv2

importpickle

importcvzone

importnumpyasnp

img=cv2.imread("carParkImg.png")

whileTrue:

cv2.rectangle(img,(50,1920),(157,240),(255,0,255),2)

cv2.imshow("image",img)

cv2.waitKey(1)

在此之后,我们得到 width 和 height = 107, 48 你也可以尝试不同的值。

我们启动一个列表来存储这些值并编写一个函数来检测鼠标点击操作,你可以在下一个片段中看到

img=cv2.imread("carParkImg.png")

width,height=107,48

defmouse_click(events,x,y,flags,params):

ifevents==cv2.EVENT_LBUTTONDOWN:

posList.append((x,y))

#andtoseewhatwearedrwaingonthescreen

whileTrue:

forposinposList:

cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),(255,0,255),2)

cv2.imshow("Image",img)

cv2.setMouseCallback("Image",mouse_click)

cv2.waitKey(1)

在 mouse_click 函数中,我们将events, x, y, flags, params作为参数传递,如果events == cv2.EVENT_LBUTTONDOWN,则将值 (x, y) 附加到 posList 并查看我们在屏幕上绘制的内容,我们将在我们的 posList 值上编写一个 for 循环。

我在这里遇到了两个问题:

在错误的位置绘制框加载图像后只生成一帧,因此对该图像的任何修改都不会显示

对于第 1 个问题的解决方案,我修改了mouse_click函数,将右键单击按钮作为一个事件,然后我们将检查我们的单击点是否位于其中一个位置之间,我们将删除它。

defmouse_click(events,x,y,flags,params):

ifevents==cv2.EVENT_LBUTTONDOWN:

posList.append((x,y))

ifevents==cv2.EVENT_RBUTTONDOWN:

fori,posinenumerate(posList):

x1,y1=pos

ifx1

posList.pop(i)

我们将检查当前的x是否在x1

对于问题2-因为我们的图像只被导入一次,所以无论在其上绘制什么都将保持不变,我们在网络摄像头或相机中不会遇到此问题,并且我们正在处理的是静态图像,因此我们必须在循环中导入它以获得删除框。

在绘制所有框后,现在我们必须将它们存储为pickle对象并以一种方式存储它们,以便我们不必每次都进行制作,并且我们可以使用先前的对象或修改现有的对象。

img=cv2.imread("carParkImg.png")

width,height=107,48

try:

withopen("CarParkPos","rb")asf:

posList=pickle.load(f)

except:

posList=[]

defmouse_click(events,x,y,flags,params):

ifevents==cv2.EVENT_LBUTTONDOWN:

posList.append((x,y))

ifevents==cv2.EVENT_RBUTTONDOWN:

fori,posinenumerate(posList):

x1,y1=pos

ifx1

posList.pop(i)

withopen("CarParkPos","wb")asf:

pickle.dump(posList,f)

whileTrue:

img=cv2.imread("carParkImg.png")

forposinposList:

cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),(255,0,255),2)

cv2.imshow("Image",img)

cv2.setMouseCallback("Image",mouse_click)

cv2.waitKey(1)

这将创建一个对象 CarParkPos 并检查该对象是否已经存在

图像处理(main.py)

加载视频馈送并循环进行循环,我们将对帧进行计数,当帧到达时,我们将重置它,以便获得连续的视频

importcv2

importpickle

importcvzone

importnumpyasnp

#videofeed

cap=cv2.VideoCapture("carPark.mp4")

whileTrue:

ifcap.get(cv2.CAP_PROP_POS_FRAMES)==cap.get(cv2.CAP_PROP_FRAME_COUNT):

cap.set(cv2.CAP_PROP_POS_FRAMES,0)

success,img=cap.read()

cv2.imshow("Image",img)

cv2.waitKey(10)

将框位置加载到我们将使用 pickle 对象的视频上,并定义我们之前找到的宽度和高度withopen("CarParkPos","rb")asf:

posList=pickle.load(f)

width,height=107,48

我们需要裁剪这些位置以供以后转换,为此我们将编写一个函数defcheckParkingSpace(imgPro):

forposinposList:

x,y=pos

imgCrop=imgPro[y:y+height,x:x+width]

cv2.imshow(str(x*y),imgCrop)

whileTrue:

ifcap.get(cv2.CAP_PROP_POS_FRAMES)==cap.get(cv2.CAP_PROP_FRAME_COUNT):

cap.set(cv2.CAP_PROP_POS_FRAMES,0)

forposinposList:

cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),(255,0,255),2)

success,img=cap.read()

cv2.imshow("Image",img)

cv2.waitKey(10)

裁剪后绘制出方框,这将为裁剪区域提供完美的视角,现在我们需要找出其中哪个区域有汽车。

我们可以通过查看像素计数来做到这一点,在图像处理中,我们可以使用边缘和角点检测算法来将图像转换为二进制形式,并计算出图像中的边缘和角点数量。在二值化后的图像中,黑色像素表示背景,白色像素表示前景。通过分析这些二值化后的图像中的边缘和角点数目,我们可以了解到关于该图像的一些信息,如图像是否具有结构性、复杂度等信息,来确定图像的特点。在此基础上,我们可以继续下一步的分析或处理。

为了确定该区域是否包含汽车,我们必须首先使用 OpenCV 和 CVzone 进行一些阈值处理,我们将图像转换为灰度并应用高斯模糊,然后我们将其转换为二值图像,我们将使用自适应阈值和去除椒盐噪声,我们使用“medianBlur”和主动内核来去除噪声,有时这些像素非常小,为了更好地区分,我们将使用膨胀操作。

应用所有滤镜后的图像

ifcap.get(cv2.CAP_PROP_POS_FRAMES)==cap.get(cv2.CAP_PROP_FRAME_COUNT):

cap.set(cv2.CAP_PROP_POS_FRAMES,0)

success,img=cap.read()

imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

imgBlur=cv2.GaussianBlur(imgGray,(3,3),1)

imgThreshold=cv2.adaptiveThreshold(imgBlur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,

cv2.THRESH_BINARY_INV,25,16)

imgMedian=cv2.medianBlur(imgThreshold,5)

kernel=np.ones((3,3),np.uint8)

imgDilate=cv2.dilate(imgMedian,kernel,iterations=1)

checkParkingSpace(imgDilate)

cv2.imshow("Image",img)

#cv2.imshow("ImageBlur",imgBlur)

#cv2.imshow("ImageThres",imgMedian)

cv2.waitKey(10)

所有的值都作为参数传递,通过尝试不同的值来获得,现在我们将这个处理过的图像传递给我们的裁剪函数

做出预测defcheckParkingSpace(imgPro):

spaceCounter=0

forposinposList:

x,y=pos

imgCrop=imgPro[y:y+height,x:x+width]

#cv2.imshow(str(x*y),imgCrop)

count=cv2.countNonZero(imgCrop)

ifcount<900:

color=(0,255,0)

thickness=5

spaceCounter+=1

else:

color=(0,0,255)

thickness=2

cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),color,thickness)

cvzone.putTextRect(img,str(count),(x,y+height-3),scale=1,

thickness=2,offset=0,colorR=color)

cvzone.putTextRect(img,f"Free:{spaceCounter}/{len(posList)}",(100,50),scale=3,

thickness=5,offset=20,colorR=(0,200,0))

我们将处理后的图像传递给此函数并计算像素,如果像素密度小于 900,则表明没有汽车,如果大于900,则包含汽车并显示文本,我们将使用 CVzone 库,并使用 python f string Free:{spaceCounter}/{len(posList)} 来显示计数器。

github:https://github.com/Tejaswi-kashyap-006/computervision_projects

原文标题:车位数量检测

标签:

最新
  • 车位数量检测|快消息

    该项目基于图像处理来检测停车场中的空间。 该项目将使用openCV和CVzone库来执行图像处理任务。 如何运行

  • Canalys:一季度全球云基础设施服务支出增长19%

    科技市场独立分析机构Canalys:2023年第一季度,全球云基础设施服务支出增长19%,达到664亿美元。虽然云计

  • 鲁西化工是哪一年上市的?鲁西化工获得过哪些荣誉?

    鲁西化工是哪一年上市的?000830 鲁西化工公司是1998年5月经中国证监会批准,于1998年8月在深圳证券交易

  • 全球今日报丨【东西问·中外对话】中外学者共话马克思的当代意义

    【东西问·中外对话】中外学者共话马克思的当代意义  2023年5月5日是马克思诞辰205周年。《马克思传》作

  • 无所畏惧的意思是什么?无所畏惧下一句怎么接?

    成语名称:无所畏惧成语读音:w&uacute; suǒ w&egrave;i j&ugrave;成语解释:畏惧:害怕。什么也不

  • 资深经济合同纠纷律师怎么收费?经济纠纷的诉讼流程是什么?

    资深经济合同纠纷律师怎么收费?1 一般来讲,不涉及财产的案件一审律师费3000元左右。2 有财产纠纷的,视

  • 基金申购费怎么算呢?基金申购费是多少?

    基金申购费怎么算呢?基金申购费怎么算要看基金类型而定:(1)投资者申购的是被动型ETF类基金,通常这类基

  • 建行快贷利息多少?建行快贷结清三天了也没额度是怎么回事?

    建行快贷利息多少建设银行个人信用快贷的利率是根据贷款人的信用情况、在建设银行的贡献度等因素,通过

  • 你知道实习标志贴在哪里吗?为什么要贴实习标志呢?

    实习标志贴在车后,可自由选择车后的位置粘贴,但是一定要醒目,能够让其他车辆看到此标志,好让其他车

  • 创业板涨停价怎么算?为什么要挂涨停板买入?

    创业板涨停价怎么算?创业板新股上市的前五个交易日没有涨跌幅限制,所以没有涨停板和跌停板。第6个交易日

  • 知识大全:中国的国宝有哪些

    中国的国宝有大熊猫、金丝猴、白鳍豚、华南虎、朱鹮等。1、大熊猫:大熊猫是以食竹为主的食肉目动物,是

  • 猕猴桃产地主要在哪个省?猕猴桃是热性还是凉性?

    猕猴桃产地主要在哪个省?猕猴桃的产地在我国湖北、陕西、湖南、河南、江苏、安徽、浙江、四川、甘肃、云

  • 证券交易市场的特点主要是什么?证券交易市场的功能是什么?

    证券交易市场的特点主要是什么?1、证券交易场所以证券投资者为主要参与者,它主要是证券持有人以及准备

  • 上海市民云如何查退休工资?上海市民云怎么签署网上服务协议书的?

    上海市民云如何查退休工资?打开随申办市民云APP,在下方导航栏中点击我的,在我的数据中点击养老金进入

  • 终身寿险和定期寿险哪个好?终身寿险的致命弱点是什么?

    终身寿险和定期寿险哪个好?终身寿险和定期寿险各有优势,两者各有不同的适合人群,具体如下:1 终身寿险