Przetwarzanie zdjęcia jpg w programie w C++

0

Moim zadaniem jest napisanie programu, który wczytywałby zdjęcie jpg wykonane aparatem fotograficznym. Na zdjęciu uchwycony byłby ślad przelatującej kulki wystrzelonej z broni ASG, program musi wczytać takie zdjęcie, sprogować je i ostatecznie podać odległość kulki od początku kadru.
Potrzebuję porady, jak zacząć.

Program chciałbym napisać w C++ pod windowsem, lecz jeśli obsługa jpgów okazałaby się łatwiejsza, mógłbym pisać w C na linuksie. Nie wiem też czy opisane operacje nie łatwiej wykonać byłoby, gdyby zdjęcie było zrobione w formacie raw lub jeśliby przekonwertować je do bmp.
I najważniejsze: jakiej biblioteki do tego użyć? (byłoby wspaniale, gdyby miała manual po polsku, ale oczywiście zdaję sobie sprawę jak mało to jest prawdopodobne).

Będę serdecznie zobowiązany za wszelkie porady w tym temacie :)
Pozdrawiam.

0

Prawdę mówiąc nigdy nie miałem styczności z plikami typu JPG, aczkolwiek pisałem programy wykorzystujące pliki BMP i Targa. Jeżeli chcesz przekonwertować zdjęcie typu JPG na BMP musisz pamiętać, że pliki BMP używają formatu BGR, natomiast JPG - RGB. Nagłówek w JGP zajmuje jedynie 10 bajtów ( http://www.fastgraph.com/help/jpeg_header_format.html ) a w BMP aż 54 ( http://www.fastgraph.com/help/bmp_header_format.html ), potem natomiast znajdują się dane obrazu. Po wczytaniu danych musisz wiedzieć jakiego koloru szukasz ( jakiego koloru jest kulka ), kiedy znajdziesz odpowiedni kolor, zliczasz ilość pikseli ( każdy piksel jest opisany przez 24bity B ( 8-bit ), G( 8-bit ) i R( 8-bit ) ), dzielisz przez przez szerokość i od wysokości odejmujesz wynik mnożenia szerokości z wynikiem wcześniejszym, to są twoje współrzędne. Zobrazowanie:

0123456
0 xxxxxxx
1 xxxxxxx
2 xxxxxOx
3 xxxxxxx
4 xxxxxxx

to jest to samo co: xxxxxxxxxxxxxxxxxxxOxxxxxxxxxxxxxxx
Kółko znajduje się na 20 pikselu ( indeksując od 0 to jest 19 piksel ). Dzielisz 19 przez szerokość ( szerokość jest równa 7 ).
19 / 7 = 2 - na takiej wysokości od górnej krawędzi znajduje się kółko
i odejmujesz od tej pozycji iloczyn wyniku z szerokością
19 - 2 * 7 = 19 - 14 = 5 - na takiej szerokości od lewej krawędzi znajduje się piłka.
Czyli piłka znajduje się w tablicy o indeksach [ 2 ][ 5 ];

Początek kadru to pozycja [ 0 ][ 0 ], więc wystarczy tylko obliczyć odległość piłki ze wzoru:
sqrt( 2 * 2 + 5 * 5 );

0

Jedyny mi znany format graficzny dla którego możesz z marszu zaimplementować obsługę to PPM i mu podobne.
PCX w miarę można jeszcze było ogarnąć.
Natomiast BMP, PNG, RAW czy co gorsza JPG - tutaj posiłkowałbym się biblioteką.

To co znalazłem przy okazji:

0

Wiadomo że musisz mieć ten obrazek w postaci tabeli kolorów 2D.

Jpg, gif, itp. to formaty zapisu / kompresji obrazów na dysku.
Czegoś takiego nie używa się w samej obróbce obrazu - przed użyciem należy to rozpakować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1