机器人视觉项目:视觉检测识别+机器人跟随(16)

跟踪丢失后再检测时加上目标特征匹配,是将第一帧检测到的目标框中的特征提取出来,具体可以采用尺度不变特征SIFT,SURF特征提取,
提取出来的特征,能否以向量的形式保存在变量中,再检测时搜索图像帧中的待确定目标区域(可能有数个这样的roi),
可以通过计算欧式距离的方式与第一帧图像中的特征进行匹配,快速排除欧氏距离相差较大的检测对象(非跟踪的行人对象),
当匹配度达到一定值后,即检测到第一帧跟踪的行人。

先搞定怎么提取特征,有没有比较好的demo,提取到特征后怎么匹配,用欧式距离?
提取到的特征是什么形式?需要送入神经网络中输出来一维向量吗?全连接层输出到softmax层,输出多分类的概率
ORB算法BRIFT特征提取方法,对一个像素点周围的16个像素点信息进行匹配。

这里在什么地方加上匹配需要先梳理一下检测跟踪的流程,
***************************************************************
1.首先用args初始化yolov3模型,定义tracker,然后进入到while True中
队列in_q出队赋给frame,将主进程中的视频数据传给frame,
判断是否要逐帧检测:args--notracking=1是设置为逐帧检测,--notracking=0则不用逐帧检测,该if不执行,直接判断roi的长度,
这样即丢失后再检测。考虑到我们的应用场景和需求,一般设置--notracking=0>
如果需要逐帧检测,将调用detect方法将检测结果传到objs中,判断objs的长度是否小于1,如果是则重新开始循环。
objs检测到数据则通过choose方法将目标框参数[x,y,w,h]给roi变量,将roi传给队列out_q。
2.判断roi的值,没有数值时即表示没有检测到目标对象,表示目标丢失,在调用detect方法检测并得到objs,同样的判断objs的长度是否有数据,
有数据则传给choose方法,画框参数roi得到四个参数。再用两个参数frame,roi初始化tracker。
初始化完成后continue重新开始循环检测是否得到目标对象及roi。如果检测出目标则这程序不用进入这两个if。
3.此时可以将我们已经初始化好的tracker更新帧(用队列in_q传来的frame参数),返回isfound,roi。
4.如果isfound是0,则更新后没有跟踪到目标,只能将roi设置为空。反之,需要做一个判断跟踪计数是否大于设定的一个值,
用verify_tracking是否追踪到满足要求的目标,如果追踪不满足要求,同样将roi设为空。
5.不论roi是否为空,都将这个roi进队out_q。这个out_q后面需要再给到ret,ret是画框函数的参数。
****************************************************
第一帧图像的特征提取,由于一般情况下args--notracking=0,不用逐帧加测,考虑将目标roi特征提取单独放在if判断语段之外,
下面是提取SURF特征代码语段。特征提取代码只执行一次,保存提取到的特征即可,不用放在循环里面,
只能把特征提取的代码放在main方法cv2.VideoCapture()后,loop方法之前。

# ********extract the first roi
cv2.imwrite('feature.jpg', frame) # 从frame读一帧图像并保存
im = cv2.imread('feature.jpg') # 读取图像
# 下采样
im_lowers = cv2.pyrDown(im)
# 转为灰度图
gray = cv2.cvtColor(im_lowers, cv2.COLOR_BGR2GRAY)
# 检测特征点
cv2.xfeatures2d.SURF_create()
s = cv2.SURF() # 提取的特征放在s变量中
mask = np.uint8(np.ones(gray.shape))
keypoints = s.detect(gray, mask)

#显示结果及特征点
vis = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
# **********提取到第一帧的ROI并保存在vis中


用下面的代码跑了一个demo,输出的情况是:

im = cv2.imread('car.jpg')
# 下采样
im_lowers = cv2.pyrDown(im)
# 转为灰度图
gray = cv2.cvtColor(im_lowers, cv2.COLOR_BGR2GRAY)
# 检测特征点
SURF = cv2.xfeatures2d.SURF_create()
#s = cv2.SURF()
mask = np.uint8(np.ones(gray.shape))
keypoints = SURF.detect(gray, mask)6

#显示结果及特征点
vis = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
img=cv2.drawKeypoints(gray,keypoints,im)
cv2.imwrite('carr.jpg',img)
# **********提取到第一帧的ROI并保存在vis中
#cv2.imshow("carr", vis)
cv2.waitKey(0)
print("keypoints", keypoints)

+++++++++++++++++++++++++++++++
现在花点时间整理一下现在的问题:
+用KCF算法和TLD跟踪没有明显的区别
+跟踪时目标框一直在调动,达不到手动画框进行跟踪的稳定。
+检测-跟踪-丢失再检测,在长时间跟踪时会因为不明原因彻底检测不到对象,一直丢失。怎么提高鲁棒性
+多进程与第一帧特征提取
+
 

猜你喜欢

转载自blog.csdn.net/Synioe/article/details/82837193