文章目录
前言
提示:这里可以添加本文要记录的大概内容:
有一个有意思的问题:大多数商店都出售香烟,各种香烟摆放在烟柜上,我们用眼睛能够很容易判断出香烟摆放的整不整齐,但是计算机该如何判断摆放的整齐与否?
提示:以下是本篇文章正文内容,下面案例可供参考
一、利用FLD直线检测算法(最终放弃传统图像处理)
首先利用LSD算法找出目标图片里所有的直线,再筛选出长度符合的直线(主要是去除烟盒上复杂的图案,只留下烟盒大概的轮廓)。
由于烟盒颜色,样式太过复杂,所得到的图片不能完整显示所有烟盒的轮廓,并且价格标签也会影响对烟盒轮廓的判断,想了很多办法但都没有太大作用,所以最终舍弃了这种办法。
二、使用目标检测(yolov5)算法计算整齐度
1.模型的训练
首先我从各种软件和浏览器上找到了大概20张拍的比较规范的烟柜图片,标记出了图片里摆放整齐的所有烟盒,训练后的模型基本可以检测出图片里所有规范的烟盒。
模型检测的烟盒:
2.在detect.py文件中将62行附近的save_txt打开,如图所示。这样就可以得到烟盒的坐标信息。
3.处理得到的.txt坐标文件
这里我在test.py文件中处理得到的坐标并计算整齐程度。
file = open('runs/detect/exp24/labels/p6.txt')
cig = 0.0
left_x = 10000
left_y = 10000
right_x = 0
right_y = 0
average = 0
count = 0
row1 = 0
row2 = 0
up = 0
arr = []
arr2 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
row_count = 0
for line in file:
num = 0
count += 1
line = line.split()
x1 = int(line[1])
y1 = int(line[2])
x2 = int(line[3])
y2 = int(line[4])
central = (y2 - y1) / 2 + y1
for i in range(0, len(arr), 1):
if y1 < arr[i] < y2:
arr2[i] += 1
num += 1
break
if num == 0:
row1 += 1
arr.append(central)
cig += (x2 - x1) * (y2 - y1)
if left_x > x1:
left_x = x1
if left_y > y1:
left_y = y1
if right_x < x2:
right_x = x2
if right_y < y2:
right_y = y2
average += y2 - y1
average_area = average / count
for i in arr2:
if i > 3:
row2 += 1
differ = 0
dif_count = 0
dif_sum = 0
dif_yu = 0
for i in range(len(arr2) - 1, -1, -1):
if arr2[i] == 1 and dif_count == 0:
continue
if arr2[i] != 1:
dif_count = 1
dif_sum += arr2[i]
dif_yu += 1
if (arr2[i - 1] > 10 or arr2[i] > 10) and abs(arr2[i - 1] - arr2[i]) >= 4:
# print(abs(arr2[i-1]-arr2[i]))
differ = differ + 1
dif_average = dif_sum / dif_yu
little = 0
more = 0
for i in range(0, dif_yu, 1):
if arr2[i] < dif_average:
little += 1
else:
more += 1
if differ > 1 and more < little:
rate = cig / (row1 * average_area * (right_x - left_x))
else:
rate = cig / (row2 * average_area * (right_x - left_x))
print(rate)
file.close()
大致思路:首先遍历所有坐标,计算出所有烟盒的面积之和s1,计算所有烟盒高度之和,计算出烟柜有多少行烟,并利用左上和右下坐标得到最长一行烟的长度a,如图:
利用得到的高度之和除烟盒数就可以得到烟盒高度的平均值,用这个值乘行数乘a就大概得到这个烟柜应该摆放烟的面积s2,用s1除s2就可以算出烟盒的整齐度了。其他的代码是为了提高计算的准确度,更加精确地检测出有多少行烟盒。
4.检测效果
第一幅:
对于这幅图,计算出的整齐度为0.94。
————————————————————————————————
第二幅:
对于这幅图,检测出的整齐度约为0.89。
可以看出基本实现了对烟盒摆放整齐的计算。
总结
项目代码:https://gitee.com/wangfl1013/cigarette-case.git
烟盒图片也在项目代码中。