Unikanie kolizji przy użyciu OpenCV na iPadzie

Pracuję nad projektem, w którym muszę zaimplementować unikanie kolizji przy użyciu OpenCV. Należy to zrobić w systemie iOS (iOS 5 i nowsze).

Cel projektu: Pomysł polega na zamontowaniu iPada na desce rozdzielczej samochodu i uruchomieniu aplikacji. Aplikacja powinna pobierać ramki z kamery i przetwarzać je, aby wykryć, czy samochód zderzy się z jakąkolwiek przeszkodą.

Jestem nowicjuszem w przetwarzaniu obrazów, dlatego utknąłem na poziomie koncepcyjnym w tym projekcie.

Co do tej pory zrobiłem:

Przyjrzałem się OpenCV i przeczytałem o tym w sieci. Unikanie kolizji jest realizowane za pomocą metody Lukas-Kanade Pyramid. Czy to jest poprawne?

Wykorzystanie tego projektu jako punktu wyjścia:http://aptogo.co.uk/2011/09/opencv-framework-for-ios/ Z powodzeniem działa na moim iPadzie i działa również funkcja przechwytywania, co oznacza, że ​​przechwytywanie aparatu jest dobrze zintegrowane. Zmieniłem implementację processFrame, aby wypróbować Optical Flow zamiast wykrywania krawędzi Canny'ego. Oto funkcja (jeszcze niekompletna).

    -(void)processFrame {
    int currSliderVal = self.lowSlider.value;
    if(_prevSliderVal == currSliderVal) return;
    cv::Mat grayFramePrev, grayFrameLast, prevCorners, lastCorners, status, err;

    // Convert captured frame to grayscale for _prevFrame
    cv::cvtColor(_prevFrame, grayFramePrev, cv::COLOR_RGB2GRAY);
    cv::goodFeaturesToTrack(grayFramePrev, prevCorners, 500, 0.01, 10);
    // Convert captured frame to grayscale for _lastFrame
    cv::cvtColor(_lastFrame, grayFrameLast, cv::COLOR_RGB2GRAY);
    cv::goodFeaturesToTrack(grayFrameLast, lastCorners, 500, 0.01, 10);

    cv::calcOpticalFlowPyrLK(_prevFrame, _lastFrame, prevCorners, lastCorners, status, err);
    self.imageView.image = [UIImage imageWithCVMat:lastCorners];
    _prevSliderVal = self.lowSlider.value;
}
Przeczytaj o przepływie optycznym io tym, jak jest używany (koncepcyjnie) do wykrywania zbliżającej się kolizji. Podsumowanie: Jeśli obiekt powiększa się, ale porusza się w kierunku dowolnej krawędzi ramki, nie jest to ścieżka kolizji. Jeśli obiekt powiększa się, ale nie przesuwa się w kierunku żadnej krawędzi, to znajduje się na ścieżce kolizji. Czy to jest poprawne?Ten projekt (http://se.cs.ait.ac.th/cvwiki/opencv:tutorial:optical_flow) wydaje się robić dokładnie to, co chcę osiągnąć. Ale nie rozumiałem, jak to robi, czytając kod. Nie mogę go uruchomić, ponieważ nie mam linuksa. Przeczytałem wyjaśnienie na tej stronie, wydaje się, że dochodzi do matrycy homografu. Jak ten wynik jest używany w unikaniu kolizji?

Oprócz wyżej wymienionych czterech punktów przeczytałem dużo więcej na ten temat, ale wciąż nie mogę złożyć wszystkich elementów.

Oto moje pytania (pamiętaj, że jestem nowicjuszem)

JAK przepływ optyczny jest używany do wykrywania zbliżającej się kolizji? Przez to mam na myśli, zakładając, że jestem w stanie uzyskać poprawny wynik z funkcji cv :: calcOpticalFlowPyrLK (), w jaki sposób mogę przejść do przodu, aby wykryć zbliżającą się kolizję z dowolnym obiektem w ramce? Czy można zmierzyć odległość od obiektu, z którym najprawdopodobniej zderzymy się?

Czy istnieje przykładowy projekt roboczy, który implementuje tę lub podobną funkcjonalność, na którą mogę spojrzeć. Obejrzałem projekt na eosgarden.com, ale żadna funkcjonalność nie została w nim zaimplementowana.

W powyższym przykładowym kodzie konwertuję lastCorners na UIImage i wyświetlam ten obraz na ekranie. To pokazuje mi obraz, który ma tylko kolorowe poziome linie na ekranie, nic podobnego do mojego oryginalnego obrazu testowego. Czy to jest poprawne wyjście dla tej funkcji?

Mam trochę trudności ze zrozumieniem typów danych używanych w tym projekcie. InputArray, OutputArray itp. Są typami akceptowanymi przez API OpenCV. Jednak w funkcji processFrame cv :: Mat był przekazywany do metody wykrywania krawędzi Canny'ego. Czy przekazuję cv :: Mat do calcOpticalFlowPyrLK () dla prevImage i nextImage?

Z góry dziękuję :)

Aktualizacja: Znaleziono ten przykładowy projekt (http://www.hatzlaha.co.il/150842/Lucas-Kanade-Detection-for-the-iPhone). Nie kompiluje się na moim komputerze Mac, ale myślę, że z tego będę miał działający kod dla przepływu optycznego. Ale wciąż nie mogę zrozumieć, w jaki sposób mogę wykryć kolizję utrudniającą śledzenie tych punktów. Jeśli któryś z was może nawet odpowiedzieć na Qts. Nr 1, będzie bardzo pomocny.

Aktualizacja Wygląda na to, że przepływ optyczny jest używany do obliczenia FoE (Focus of Expansion). Może być wielu kandydatów na FoE. I za pomocą FoE, TTC (Time To Collision) jest na miejscu. W tej ostatniej części nie mam jasności. Ale jak dotąd mam rację?Czy OpenCV implementuje FoE i / lub TTC?

questionAnswers(1)

yourAnswerToTheQuestion