背景:
我正在为一个学校的项目工作。我有一个树莓派,一辆小型遥控车和一台相机。我的任务是遵循一条路径(地面上的路线)并避免基于计算机视觉的障碍。到目前为止,我可以跟踪并跟踪。现在我想避免障碍,我有两个想法:
第一个想法:
1。)在两个图像中用冲浪检测特征 2.)计算特征的光流 3.)将CNN或Tensorflow与计算出的光流一起使用,以避免障碍物
第二个想法:
1。)在两个图像中用冲浪检测特征 2.)计算基本矩阵 3.)使用反极性几何来计算特征相对于相机的距离
我认为第一种方法有意义。 到目前为止,这是我的代码:
import numpy as np
import cv2
import time
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 1000,1000)
cap = cv2.VideoCapture(0)
# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
#create surf
surf = cv2.xfeatures2d.SURF_create()
cv2.xfeatures2d.hessianThreshold = 50000
#get features from first frame
ret, old_frame = cap.read()
old_frame = cv2.flip(old_frame,1)
old_kp, old_dp = surf.detectAndCompute(old_frame, None)
while(True):
# Capture frame-by-frame
ret, new_frame = cap.read()
new_frame = cv2.flip(new_frame,1)
new_kp, new_dp = surf.detectAndCompute(new_frame, None)
if len(new_kp) > 2 and len(old_kp) != 2:
#match
matches = flann.knnMatch(old_dp,new_dp,k=2)
matchesMask = [[0,0] for i in range(len(matches), 0, -1)]
# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i]=[1,0]
draw_params = dict(matchColor = (0,255,0), singlePointColor = (255,0,0),matchesMask = matchesMask,flags = 0)
result = cv2.drawMatchesKnn(old_frame,old_kp,new_frame,new_kp,matches,None,**draw_params)
old_frame = new_frame
old_kp = new_kp
old_dp = new_dp
# Display the resulting frame
cv2.imshow('image',result)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
我可以检测特征,但是我不知道如何计算这些点的光通量。 我试图在openCV中使用cv2.calcOpticalFlowPyrLK()函数,但这对我不起作用。
我的问题:
我的想法/方法正确吗?这样可以避免障碍吗?
我该如何计算冲浪钥匙的光流?
预先感谢