Skocz do zawartości
Gawain

analiza obrazu z kamery

    Rekomendowane odpowiedzi

    Gawain

    Witam.

    Dzisiaj zacząłem pisać program który miałby pobierać obrazy z kamery, modyfikować je i na końcu wyświetlać w czasie rzeczywistym. W PreviewCallback dostaję tablicę bajtów z informacją o obrazie, ale okazało się, że modyfikacje jej nie zmieniają wyświetlanego obrazu na ekranie telefonu, więc nie mogę mieć pewności jaki jest wynik działania. Jaki jest więc sposób na wyświetlanie tylko i wyłącznie zmodyfikowanych obrazów, po przeróbce? Na razie też szukam informacji na ten temat.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    jaka wersja Androida ?

    musisz ustawić jakiego formatu mają być dane NV21 lub RGB_565 lub JPEG metoda Paramter.setPreviewFormat() i tu ma znaczenie jaka wersja Androida bo nie wszystkie odsługują wszystkie formaty

    PS. PreviewCallback przekazuje dane tylko do odczytu ich modyfikacja nie wypływa na zawartość wyświetlanego obrazu wewnątrz SurfaceView to działa na troszkę innej zasadzie ;)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Gawain

    Trochę pospieszyłem się z pisaniem tematu. Android 2.3.3. Domyślnie o ile pamiętam jest format YUV (przynajmniej w tej funkcji PreviewCallback). Mogę operować bezpośrednio na niej. Ewentualnie mogę ręcznie przerobić na RGB 888, potem ponownie na odwrót, to raczej nie będzie stanowiło problemu. Teraz raczej szukam sposobu, bym mógł przechwycić obraz z kamery przed jego wyświetleniem w celu modyfikacji. Dziś zacząłem się uczyć jak obsługiwać kamerę, na razie nie mam specjalnie obycia w klasach związanych z tym tematem, ani z zabawy z obrazami. Jak ktoś może podać jakiś link do materiału gdzie wszystko jest dość dobrze wytłumaczone (na razie nie znalazłem), albo napisać jak to zaimplementować będę wdzięczny. A jak wygląda ta sprawa z SurvaceView?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    kamera musi mieć jakąś powierzchnie na której będzie mogła wyświetlać podgląd, obraz z podglądu może być dostępny przez PreviewCallback ale nie masz wpływu na to co Camera wyświetla w SurfaceView możesz to ukryć przykryć itd.. ale nie wyłączysz ani nie zmienisz

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Gawain

    W opencv przy pisaniu aplikacji można było napisać coś takiego bez problemu większego.

    while(1)

    {

    img = cvQueryFrame(capture);

    //obróbka img

    cvShowImage("Obraz", img);

    cvWaitKey(1);

    }

    W tym programie mam zadeklarowaną powierzchnię, w końcu wyświetlam na nim obraz widziany kamerą. To czego potrzebuję i jest to praktycznie niezbędne, to możliwość modyfikacji przed wyświetlaniem. Jeśli nie PreviewCallback, raczej trudno mi uwierzyć że takiej możliwości nie ma.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    ale to jest Java i robi się inaczej

    troszkę się pogubiłem to czego ty w końcu chcesz, przecież obraz tego co jest aktualnie w podglądzie kamery możesz uzyskać przez PreviewCallback, ale nie możesz go zmieniać bo dane obrazu z podglądu są gdzie indzie niż ta tablica bajtów którą uzyskujesz w PreviewCallback żeby udostępnić obraz w PreviewCallback uprzednio musiał zostać skopiowany

    więc na chłopski rozum to co się wyświetla w SurfaceView jako podgląd kamery to nie jest to samo co tablica bajtów uzyskana w PreviewCallback -> onPreviewFrame

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Gawain
    ale to jest Java i robi się inaczej

    I właśnie jak mnie to zastanawia.

    Potrzebuję czegoś takiego: Po pobraniu obrazu z kamery, uzyskuję dostęp do wszystkich pikseli obrazu w celu modyfikacji, następnie zmodyfikowany obraz wrzucam do SurfaceView.

    bo dane obrazu z podglądu są gdzie indziej niż ta tablica bajtów którą uzyskujesz w PreviewCallback

    Pytanie moje brzmi, gdzie są te bezpośrednie dane z obrazu z kamery, który za chwilę ma być wyświetlony w SurfaceView. Potrzebuję uzyskać dostęp do nich w celu modyfikacji, nie wystarczy mi kopia sama w PreviewCallback.

    W surfaceView o ile rozumiem, jest już wyświetlony podgląd obrazu. Więc ani PreviewCallback, ani dostęp do obrazu w surfaceView nie jest rozwiązaniem.

    Mogę pisać trochę teraz szybko za co z góry przepraszam, bo zdecydowanie spieszy mi się by zakończyć ten problem, nie mogę poświęcić na niego zbyt wiele czasu, bo jutro przyjdą kolejne etapy.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    najprościej będzie zrobić tak, otrzymany obraz z PreviewCallback przetwarzasz i rysujesz na innym SurfaceView przykrywający ten w którym wyświetlany jest podgląd z kamery

    zamiast PreviewCallback użyj setPreviewCallbackWithBuffer śmieciarka nie będzie szalała

    dlaczego nie można zrobić tego tak porostu, tu odsyłam do lektury co to jest JNI i dlaczego w Androidzie jest tak często używany i co to jest Heap

    Pytanie moje brzmi, gdzie są te bezpośrednie dane z obrazu z kamery, który za chwilę ma być wyświetlony w SurfaceView

    są niedostępne z Javy bezpośrednio

    Edytowane przez zawadaki

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x