Witam! W skrócie wpadłem na szalony pomysł: Jestem początkujący i chcę użyć kamery do mojego projektu (bez pośrednictwa komputera). Zanim ktokolwiek zwróci mi uwagę, że to porywanie się z motyką na Słońce w moim przypadku, to informuję, że zdaję sobie z tego sprawę. Stawiając sobie bardzo dalekie cele, szybciej motywuję się do nauki. Wiem co chcę uzyskać, wiem jakie parametry są dla mnie ważne, lecz często przeglądając datasheety poszczególnych podzespołów trafiam na problem: nie potrafię oszacować, jakie parametry powinien mieć dany element. W tym wpisie pokażę czego się dowiedziałem oraz czego nie udało mi się dowiedzieć.
Czego potrzebuję: Idealnie odczyt 60 klatek/s 720p w kolorze przy pomocy (przykładowa kamerka) ov5640.
Początkowo dla zaznajomienia się z kamerką oczywiście chciałbym używać niższych rozdzielczości i szybkości, ale docelowo chcę uzyskać powyższe wyniki. Odczyt może być bez przekazywania obrazu na ekran + nie zamierzam go nagrywać. Docelowo chciałbym przechowywać maksymalnie kilka klatek obrazu w pamięci do porównywania ich i wykrywania krawędzi itp.
Zanim wszedłem w temat dokładniej, wyobrażałem sobie to tak: Kamera ma mały układ cyfrowy, który podaje kolejno wartości dla każdego pixela w układzie określonym przez jakąś normę, po pojedyńczym kablu. Z tego co wiem, tak wygląda przesył danych z kamer z wyjściem composite video, jednak szumy analogowego sygnału mocno zniszczyłyby obraz i utrudniły pracę mikrokontrolerowi nad obrazem.
Kamery w formie widzianej z telefonów mają dużo różnych pinów, głównie cyfrowych. Synchronizacja pionowa, pozioma, dodatkowe ustawienia typu gamma, piny do synchronizacji zegara oraz IIC do transmisji danych itp.– do znalezienia w nocie. Dowiedziałem się również o kompresowaniu sygnału, by odpowiednie komponenty nadążały z nadawaniem i odbieraniem – i tu się między innymi blokuję:
Rozumiem, że pamięć ram powinna wystarczyć do zmieszczenia żądanej ilości klatek, ale nie wiem jak sprawa wygląda z taktowaniem zegara mikrokontrolera. Idąc moim tokiem myślenia, kamera podaje w rozdzielczości 720 p (1280x720) = 921600 pixeli, z czego każdy pixel posiada minimum 3 kolory, co daje 2784800 informacji przy jednej klatce, czyli 60x2784800=167 088 000 informacji/sekundę. Tutaj proszę o poprawienie, jeżeli w rzeczywistości sprawa wygląda inaczej.
Idealizując przyjmuję, że jeden takt procesora zbierze jeden subpixel do pamięci ram, co daje taktowanie 167 MHz na sam odczyt. Ponieważ jednak świat nie jest idealny, odbiór i zapis informacji zajmie więcej niż jeden takt, czy dobrym krokiem jest prześledzenie tabel mówiących jaka operacja zajmuje ile taktów? Czy takie liczenie jedt miarodajne? W jaki sposób powinno się to robić? Czy może lepiej metodą prób i błędów dokładać taktowanie (które jednak kosztuje)?
167 + drugie tyle na wszelki wypadek + 2x 167 na to by to odczytać i przetworzyć = 668 MHz. Miałoby to sens, ponieważ telefony mające około 800MHz potrafią nagrywać filmy 720p/60.
Jednak jak wcześniej napisałem zauważyłem, że sygnał video jest kompresowany (czy dobrze rozumiem?) czyli procesor ma jeszcze więcej do policzenia, co zwiększa wymagane taktowanie o niewiadomą ilość.
Przeglądając bebechy kamery wyczynowej go pro hero 3 natknąłem się między innymi na take układy:
Ambarella A770 camera system-on-a-chip (500 MHz pixel capture rate (equivalent to 8 Megapixels at 60 frames per second) - supports oversampling for the highest image quality and enables multi-window digital Pan Tilt Zoom (PTZ)
Przez co mam rozumieć, że istnieją wyspecjalizowane układy do odbioru obrazu? Jak tego szukać? Czy można używać ich bez udziału zwykłego mikrokontrolera? Na logikę istnienie takich układów pozwoliłoby na zwolnienie mikrokontrolerów z części pracy - dobrze rozumiem?
Austriamicrosystems AS3713 system PMU with backlight driver
Doczytałem, że PMU służy do synchronizacji układów. Czy w przy łączeniu kamery z mikrokontrolerem, należy zwracać uwagę na coś konkretnego? Rozumiem,że to taki odpowiednik rezonatora kwarcowego?
Z moich obliczeń powyżej wynika, że taktowanie wszelakich atmeg jest za małe by sprostać moim oczekiwaniom. Zapewne więc musiałbym użyć układów typu ARM - czy tak?
Z tego co wiem procesory wykonują pracę po kolei a karty grafiki wykonują wiele obliczeń jednocześnie. Czy można w jakiś sensowny sposób wykorzystać układy graficzne znane z telefonów do obróbki obrazu z kamery CMOS?
Mile widziane będą różne określenia, które mógłbym wyszukać w internecie i o nich poczytać, a teraz nie mgę, ponieważ ich mogę po prostu nie znać.
Wiem, że temat nie jest najprostszy, więc jeżeli ktoś tylko podejrzewa, jaka jest odpowiedź na dowolne z moich pytań, zapraszam do przemyśleń.
|