Справочная информация:
Я работаю над проектом для школы. У меня есть малиновый пи, маленькая радиоуправляемая машина и камера. Моя задача - следовать по пути (линии на земле) и избегать препятствий на основе компьютерного зрения. Пока я могу отслеживать линию и следовать ей.
Теперь я хочу избежать препятствий, и у меня есть две идеи:
Первая идея:
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()
Я могу обнаружить объекты, но не знаю, как рассчитать оптический поток этих точек.
Я пытался использовать функцию cv2.calcOpticalFlowPyrLK () в openCV, но у меня это не работает.
Мои вопросы:
Верны ли мои идеи / подходы? Можно ли таким образом избежать препятствий?
Как рассчитать оптический поток для моих ключевых точек серфинга?
Заранее спасибо