这周做的事情比较杂,不便分日期记录。
首先老师给了我两个迷你主机,让我插上鼠标键盘显示器,测试一下迷你主机检测拟合每一帧图片需要多长时间。
正好再次熟悉了一下配置环境的步骤,虽然这是学长们都不乐意再做的步骤,但对我来说这样的熟悉机会也是尤为难得。
配置好环境后对代码进行了略微修改,跑出来一张图片的时间是6秒。跟老师汇报后,他让我把图片长宽缩小一倍再试试。原本是512x256,我改成了256x128(好像得是8的倍数才能正常运行)。跑出来时间是2秒左右。以下贴图,跑的是之前的单线程序。
对应迷你电脑配置:Intel(R) Celeron(R) CPU J1900 @ 1.99GHz 内存4 GB 硬盘60G
接着就算继续筛选上周的线,在和老师讨论之后,有两个思路
1.单线判断法:我之前有提过在视频中间会出现一个单线情况,由于我的基础筛选方法是迭代求差排序筛选,之后筛选出来的线便都乱了套。可以考虑在原代码里加一个语句:如果筛选出来的两根线斜率相同,便返回上一帧的两根线。但如果连续好几帧都是相同的一根线,便输出。(这是由于机器小车走到弯道尽头时,以左转为例,由于摄像头安在前侧,左边的轨道不在视野里。)
2.斜率判断法:通过之前的斜率输出我们也能看见,两个线的斜率正常状态是不等号的,那我们可以考虑加一个判断斜率相乘是否大于0,若大于0代表等号则是异常情况返回上一帧的数据。
最后我用方法二实现了目标,意外惊喜是弯道尽头时一边轨道在视野盲区的问题好像也被顺带解决了。以下部分简单代码。
if k_new[nre1[0]]*k_new[nre1[1]]>0: #如果出现特殊情况:两根线斜率正负号相同
print('b_pre:',b_pre)
print('k_pre:',k_pre)
for j in [0,1]:
p1 = (int(-b_pre[j]/k_pre[j]),0)
p2 = (int(xi_pre[j]),256)
cv2.line(image,p1,p2,(0,0,255),1)
#theta = np.arctan(k_new[j])/np.pi*180#反解斜率角
print('line',j,':','斜率k:',k_pre[j],'截距b:',b_pre[j],'xi_new[j]:',xi_pre[j],'聚类直线数a:',a_pre[j],'斜率角度theta:')
else:
for j in list(nre1):
p1 = (int(-b_new[j]/k_new[j]),0)
p2 = (int(xi_new[j]),256)
cv2.line(image,p1,p2,(0,0,255),1)
#theta = np.arctan(k_new[j])/np.pi*180#反解斜率角
print('line',j,':','斜率k:',k_new[j],'截距b:',b_new[j],'xi_new[j]:',xi_new[j],'聚类直线数a:',a_new[j],'斜率角度theta:')
#print(k_pre)
for j in list(nre1): #为下一帧存储这一帧的数据
k_pre[m] = k_new[j]
xi_pre[m] = xi_new[j]
b_pre[m] = b_new[j]
a_pre[m] = a_new[j]
m=m+1
pre_nre1=nre1