Competition1——智能交通场景应用


个人博客在这呢🐽fuhao7i Blog
视频讲解在这找🤪袖手天下7i
源码在这下载🍻点击下载

Hello, 最近很多小伙伴们看了我在B站的视频之后来和我交流关于如何实现车辆的非法越线检测以及车辆在斑马线不礼让行人的检测等,今天我以一个开源的项目为基础来和大家简单分享一下技术实现,希望对刚接触计算机视觉领域的小伙伴们有所帮助。

1. YOLOv3 + Deepsort

首先,看过我本专栏第一个视频的小伙伴们应该清楚,整个的项目我们是基于一个目标追踪算法来做的。因此,在这里我采用比较经典的 YOLOv3 + Deepsort 来进行简单的讲解。这是一个Github上的开源项目,环境配置也比较简单,在README.md文件中描述的很清楚。分为cpu和gpu两个版本。

2. 提取背景.py

因为我们处理的对象是交通摄像头下的场景,数据格式为视频流或者视频,所以我们要提取视频的第一帧作为背景来进行车道线的标定。不推荐使用截屏的方式,因为这会使图像的尺寸发生改变。

import cv2

# 这里我们取视频的第一帧来进行标注。注意⚠️不要使用截图,因为截图会使的图像大小不一致。
vidcap = cv2.VideoCapture('/Users/apple/Documents/二叶/目标追踪/yolov3_deepsort/data/video/1.mp4')
success,image = vidcap.read()
n=1
while n < 30:
	success, image = vidcap.read()
	n+=1
imag = cv2.imwrite('fff.png',image)
if imag ==True:
	print('ok')

在这里插入图片描述

3. 车道线标定.py

根据提取的背景图片,进行道路信息的标定,并返回道路信息的相关参数。

import cv2
from PIL import Image
from pylab import *
import csv
import codecs

img = cv2.imread('fff.png')

# cishu是需要标记的实线的个数。这个需要标记4处实线。

cishu = 2
sx = []
bm = []
im = array(Image.open('fff.png'))
ion()
imshow(im)
for cs in range(cishu):

    print('Please click 2 points')
    x = ginput(2)
    print('you clicked:',x)
    sx.append(x)

print('Please click 4 points')
x = ginput(4)
print('you clicked:',x)
bm.append(x)

ioff()
show()
print(im.shape)
jinzhi = []
banmaxian = []
def shixian(x1,y1,x2,y2):
    if x1 == x2:
        k = -999
        b = 0
    else:
        k = (y2-y1)/(x2-x1)
        b = y1 - x1 * k
        # k = int(k)
        # b = int(b)
    return k,b
#data1 = [{'x1':int(x[0][0]),'y1':int(x[0][1]),'x2':int(x[1][0]),'y2':int(x[1][1])}]
# 计算实线的值 y = kx + b
for i in sx:
    x = {
   }
    x1 = int(i[0][0])
    y1 = int(i[0][1])
    x2 = int(i[1][0])
    y2 = int(i[1][1])
    k, b = shixian(x1,y1,x2,y2)
    #cv2.rectangle(img, (x1+15,y1), (x2-15,y2), (0,0,255), -1)
    if y1 > y2:
        yy = y2
        xx = x2
        y2 = y1
        x2 = x1
        y1 = yy
        x1 = xx
    if k != 0:
        for xxx in range(y1,y2):
            xq = (xxx-b)/k
            xq = int(xq)
            cv2.rectangle(img, (xq+15,xxx), (xq-15,xxx), (0,0,255), -1)
    else:
        for xxx in range(x1,x2):
            yq = b
            cv2.rectangle(img, (xxx,yq+15), (xxx,yq-15), (0,0,255), -1)
    x['k'] = k
    x['b'] = b
    print('k:',k,'b:',b)
    jinzhi.append(x)



print(jinzhi)


# data2 = [{'x1':400, 'y1':0,'x2':800,'y2':0,
#           'x3':400, 'y3':800, 'x4':800, 'y4':800}]
# 计算斑马线的各项值 y = kx + b
for i in bm:
    x = {
   }
    x1 = int(i[0][0])
    y1 = int(i[0][1])
    x2 = int(i[1][0])
    y2 = int(i[1][1])
    y3 = int(i[2][1])
    k, b = shixian(x1,y1,x2,y2)
    c = y3 - y1
    x['k'] = k
    x['b'] = b
    x['c'] = c
    x['x1'] = x1
    x['x2'] = x2

    cv2.rectangle(img, (x1,y1+c), (x2,y2), (0,255,0), 4)
    banmaxian.append(x)

print(banmaxian)
cv2.imwrite('001_new.png', img)

# 将获得的实线和斑马线信息写入相应的文件。

with open("shixian.txt", 'w') as f:
    for s in jinzhi:
        f.write(str(s) + '\n')

with open("banmaxian.txt", 'w') as f:
    for s in banmaxian:
        f.write(str(s) + '\n')

在这里插入图片描述

4. 车牌识别模块

这里我们可以自己训练模型,也可以使用开源项目HyperLPR,来进行车牌的识别。

                # 截取车辆图片
                cropped = img[int(bbox[1]):int(bbox[3]), int(bbox[0]):int(bbox[2])]
                # 传入HyperLPR模型识别车牌信息
                xinxi = HyperLPR_plate_recognition(cropped)

4.1 车牌信息择优迭代

车牌号的识别是从车辆出现在画面的第一帧开始,一直到车辆消失在画面中。我们并不能事先确定在哪一帧对车牌的识别效果最好。因此,我们在车辆出现的第一帧,就将它的id车牌信息传入字典chepaixinxi保存起来。如果当前帧比之前的识别效果都好(置信度高),我们就用它替换之前的车牌信息。

另一方面,为了节省计算资源,只要是该车在某一帧的车牌置信度高于0.9,我们就不再将其传入车牌识别模块。

                # 实现车牌信息的择优迭代
                if str(track.track_id) in chepaixinxi:
                    if xinxi:
                        chepai = chepaixinxi[str(track.track_id)]
                        if chepai[1] < xinxi[0][1]:
                            cheche = xinxi[0]
                            chepaixinxi[str(track.track_id)] = cheche
                            img = cv2ImgAddText(img,chepaixinxi[str(track.track_id)][0]+':'+str(round(chepaixinxi[str(track.track_id)][1], 
  • 52
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 44
    评论
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值