оптический поток на обнаруженных точках - PullRequest
2 голосов
/ 17 мая 2019

Справочная информация:

Я работаю над проектом для школы. У меня есть малиновый пи, маленькая радиоуправляемая машина и камера. Моя задача - следовать по пути (линии на земле) и избегать препятствий на основе компьютерного зрения. Пока я могу отслеживать линию и следовать ей.

Теперь я хочу избежать препятствий, и у меня есть две идеи:

Первая идея:

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, но у меня это не работает.

Мои вопросы:

Верны ли мои идеи / подходы? Можно ли таким образом избежать препятствий?

Как рассчитать оптический поток для моих ключевых точек серфинга?

Заранее спасибо

...