目录
一、撞线代码
之前的简单易上手YOLOV5-deepsort(Windows)的博客已经和大家介绍了如何修改撞线,鉴于一些小伙伴需要撞线的代码,我在这里写出来
(1)撞线完整代码
name = 'egg'
# 根据视频尺寸,填充一个polygon,供撞线计算使用
mask_image_temp = np.zeros((1080, 1920), dtype=np.uint8)
# 初始化2个撞线polygon(蓝色)
list_pts_blue = [[850, 100], [850, 850], [880, 850], [880, 100]]
ndarray_pts_blue = np.array(list_pts_blue, np.int32)
polygon_blue_value_1 = cv2.fillPoly(mask_image_temp, [ndarray_pts_blue], color=1)
polygon_blue_value_1 = polygon_blue_value_1[:, :, np.newaxis]
# 填充第二个polygon(黄色)
mask_image_temp = np.zeros((1080, 1920), dtype=np.uint8)
list_pts_yellow = [[820, 100], [820,850], [850, 850], [850, 100]]
ndarray_pts_yellow = np.array(list_pts_yellow, np.int32)
polygon_yellow_value_2 = cv2.fillPoly(mask_image_temp, [ndarray_pts_yellow], color=2)
polygon_yellow_value_2 = polygon_yellow_value_2[:, :, np.newaxis]
# 撞线检测用mask,包含2个polygon,(值范围 0、1、2),供撞线计算使用
polygon_mask_blue_and_yellow = polygon_blue_value_1 + polygon_yellow_value_2
# 缩小尺寸,1920x1080->960x540
polygon_mask_blue_and_yellow = cv2.resize(polygon_mask_blue_and_yellow, (960, 540))
# 蓝 色盘 b,g,r
blue_color_plate = [255, 0, 0]
# 蓝 polygon图片
blue_image = np.array(polygon_blue_value_1 * blue_color_plate, np.uint8)
# 黄 色盘
yellow_color_plate = [0, 255, 255]
# 黄 polygon图片
yellow_image = np.array(polygon_yellow_value_2 * yellow_color_plate, np.uint8)
# 彩色图片(值范围 0-255)
color_polygons_image = blue_image + yellow_image
# 缩小尺寸,1920x1080->960x540
color_polygons_image = cv2.resize(color_polygons_image, (960, 540))
# list 与蓝色polygon重叠
list_overlapping_blue_polygon = []
# list 与黄色polygon重叠
list_overlapping_yellow_polygon = []
# 进入数量
down_count = 0
# 离开数量
up_count = 0
font_draw_number = cv2.FONT_HERSHEY_SIMPLEX
draw_text_postion = (int(960 * 0.01), int(540 * 0.05))
det = Detector()
if len(list_bboxs) > 0:
# ----------------------判断撞线----------------------
for item_bbox in list_bboxs:
x1, y1, x2, y2, label, track_id = item_bbox
# 撞线检测点,(x1,y1),y方向偏移比例 0.0~1.0
y1_offset = int(y1 + ((y2 - y1) * 0.6))
# 撞线的点
y = y1_offset
x = x1
if polygon_mask_blue_and_yellow[y, x] == 1:
# 如果撞 蓝polygon
if track_id not in list_overlapping_blue_polygon:
list_overlapping_blue_polygon.append(track_id)
pass
# 判断 黄polygon list 里是否有此 track_id
# 有此 track_id,则 认为是 外出方向
if track_id in list_overlapping_yellow_polygon:
# 外出+1
up_count += 1
print(
f'类别: {label} | id: {track_id} | 上行撞线 | 上行撞线鸡蛋总数: {up_count} | 上行鸡蛋id列表: {list_overlapping_yellow_polygon}')
# 删除 黄polygon list 中的此id
list_overlapping_yellow_polygon.remove(track_id)
pass
else:
# 无此 track_id,不做其他操作
pass
elif polygon_mask_blue_and_yellow[y, x] == 2:
# 如果撞 黄polygon
if track_id not in list_overlapping_yellow_polygon:
list_overlapping_yellow_polygon.append(track_id)
pass
# 判断 蓝polygon list 里是否有此 track_id
# 有此 track_id,则 认为是 进入方向
if track_id in list_overlapping_blue_polygon:
# 进入+1
down_count += 1
print(
f'类别: {label} | id: {track_id} | 下行撞线 | 下行撞线鸡蛋总数: {down_count} | 下行鸡蛋id列表: {list_overlapping_blue_polygon}')
# 删除 蓝polygon list 中的此id
list_overlapping_blue_polygon.remove(track_id)
pass
else:
# 无此 track_id,不做其他操作
pass
pass
else:
pass
pass
pass
(2)Deepsort-speed代码中修改polygon
在代码中的demo.py,可以看到在开头的时候填充了polygon,然后在这个基础上分别画了蓝色polygon和黄色polygon,这两个就是撞线,以下代码即通过经过这两条线判断经过或者返回累计个数。
(1)list_pts_blue就是蓝色这个多边形的左边,可以看到有四个点坐标(x,y),这就说明这是四边形,左边点的顺序依次为左上,左下,右下,右上,即逆时针转一圈。修改位置左边或者添加坐标点的个数即可以实现多边形的切换。
(2)blue_color_plate为多边形的颜色,通过RGB值。可以修改撞线的不同的颜色。
二、将算法结果传到Mysql数据库中
yolov5+deepsort算法常见的检测结果就是一些类被和个数等,要传递这些数据,就需要在算法里增加代码,并且配置好本地mysql数据库,建好数据库的表。
(1)数据库部分
首先需要安装数据库,建表,然后新建用户,本次就不过多赘述了这些内容了,只是简述一下如何使用。
首先use mysql然后select host,user from user;可以看到自己可以连接的数据库,如果想要连接其他电脑的数据库,一般更改权限,我这里是终端设备给我电脑传输数据,于是我使用update user set...这句话允许所有的用户连接我的数据库(本人比较懒,图方便)。
然后使用flush privileges;更新一下即可
注意:最好将电脑防火墙关闭。
(2)算法部分
算法代码如下:
def db_use(table_name, value):
# 打开数据库连接
db = MySQLdb.connect(host="localhost", port=3306, user="root", passwd="123456", db="egg", charset="utf8")
# SQL 更新语句
# 使用cursor()方法获取操作游标
cursor = db.cursor()
sql = "INSERT %s (fresh,brown,broken) VALUES ('%d','%d','%d')" % \
(table_name, value[0], value[1],value[2])
# try:
# 执行SQL语句
print("start in DB")
cursor.execute(sql)
# 提交到数据库执行
try:
db.commit()
print("done")
except:
# 发生错误时回滚
db.rollback()
print("some problem")
# 关闭数据库连接
db.close()
这里是编写了一个数据库的函数,这个函数用来连接数据库,传递数据
db = MySQLdb.connect(host="localhost", port=3306, user="root", passwd="123456", db="egg", charset="utf8")
这句话里localhost是主机名,也就是你要将数据传输的地方,如果是本地就是localhost,也可以是其他电脑的ip地址,例如“192.168.85.45”。port是端口号,这个一般不用改,user是数据库的用户名,passwd是密码,db是你要传输的数据库的名称,charset=utf-8是世界通用语言编码。
sql = "INSERT %s (fresh,brown,broken) VALUES ('%d','%d','%d')" % \
(table_name, value[0], value[1],value[2])
这是sql语句,表示插入数据,具体使用方法搜sql语句的基本用法即可。
然后只需要在主函数中调用即可
value = [int(fresh), int(brown), int(broken)}
Detector.db_use('egg', value)
你在哪个类里面写就写这个"类.db_use()"即可,而value是你要传的值。
后续我将不定期分享自己所学知识,感谢大家的支持,谢谢