Dekodowanie kodu Hamming.pdf
(
294 KB
)
Pobierz
Dekodowanie kodu
Hamming’a z
markerów
wykrytych na
obrazach
Projekt z przedmiotu Gramatyki, Automaty i Techniki
Translacji
Tomasz Bijata
2016-12-15
SPIS TREŚCI
Wstęp
............................................................................................................................................................. 0
Cel projektu .................................................................................................................................................. 0
Technologie .................................................................................................................................................. 0
Realizacja projektu ...................................................................................................................................... 0
Architektura aplikacji .............................................................................................................................. 0
Dane wejściowe
.................................................................................................................................. 0
Przetwarzanie ....................................................................................................................................... 0
Dane wyjściowe
.................................................................................................................................. 1
Moduł:
MarkerDetector ......................................................................................................................... 1
Konwersja obrazu na skalę szarości
................................................................................................. 1
Binaryzacja obrazu .............................................................................................................................. 1
Detekcja krawędzi
.............................................................................................................................. 2
Znalezienie kandydatów....................................................................................................................
3
Rozpoznanie Markera......................................................................................................................... 6
Moduł: Marker
.......................................................................................................................................... 8
Odległość hamminga
........................................................................................................................ 9
Odczytanie kodu ............................................................................................................................... 10
Bibliografia .................................................................................................................................................. 12
1
WSTĘP
Realizowany projekt jest częścią pracy inżynierskiej, „Gra oparta o elementy AR”. Do realizacji
części odpowiedzialnej za AR
(ang. Augmented Reality)
potrzebny jest moduł który umożliwi
dostarczanie głównej aplikacji informacji o elementach Rozszerzonej Rzeczywistości.
Elementy te(markery)
reprezentowane są przez
dwuwymiarowy, matrycowy, kwadratowy
kod graficzny
składający się z siatki 7x7 pól. Zewnętrze pola tworzą ramkę, i nie są
bezpośrednim nośnikiem informacji, ale znacznie ułatwiają rozpozwanie takiego elementu na
obrazie. Odczytanie informacji z obrazu o elementach AR pozwoli na wygenerowanie w ich
miejsce odpowiednich obiektów grafiki 3D. Każdy marker zakodowany jest kodem Hamming
o długości słowa 5, które zawiera 2 bity informacji na każde słowo, więc marker może
reprezentować jedną z 1024 wartości.
CEL PROJEKTU
Projekt ma za zadanie wyszukiwać na obrazie wzorce które reprezentują odpowiednie
znaczniki, markery składające się z siatki 7x7 pól, rozpoznawać zapisane na nich zakodowane
informacje.
TECHNOLOGIE
W systemie opisywanym w tej pracy wykorzystano
następujące technologie:
język programowania
C++, biblioteka OpenCV, DirectX11 oraz HSLS.
C++
– język programowania ogólnego przeznaczenia. Charakteryzuje się wysoką
wydajnością kodu wynikowego, bezpośrednim dostępem do zasobów sprzętowych i funkcji
systemowych, łatwością tworzenia i korzystania z bibliotek (napisanych w C++, C lub innych
językach), niezależnością od konkretnej platformy sprzętowej lub systemowej (co gwarantuje
wysoką przenośność kodów źródłowych) oraz niewielkim środowiskiem uruchomieniowym.
Podstawowym obszarem jego zastosowań są aplikacje i systemy operacyjne.
C++ został zaprojektowany przez Bjarne Stroustrupa jako rozszerzenie języka C o obiektowe
mechanizmy abstrakcji danych i silną statyczną kontrolę typów. Zachowanie zgodności z
językiem C na poziomie kodu źródłowego pozostaje jednym z podstawowych celów
projektowych kolejnych standardów języka
OpenCV
– biblioteka funkcji wykorzystywanych podczas obróbki obrazu, oparta na otwartym
kodzie i zapoczątkowana przez Intela. Biblioteka ta jest wieloplatformowa, można z niej
korzystać w Mac OS X, Windows jak i Linux. Autorzy jej skupiają się na przetwarzaniu obrazu w
czasie rzeczywistym.
REALIZACJA PROJEKTU
ARCHITEKTURA APLIKACJI
DANE WEJŚCIOWE
Obraz rastrowy w formacie: Windows bitmap (bmp), portable image formats (pbm, pgm,
ppm) and Sun raster (sr, ras), JPEG (jpeg, jpg, jpe), JPEG 2000 (jp2), TIFF files (tiff, tif), portable
network graphics (png).
PRZETWARZANIE
Procedura wykrywania znacznika:
1.
2.
3.
4.
5.
Konwersja obrazu
do skali szarości.
Wykonaj operację binarną progową.
Wykrywanie konturu.
Szukaj możliwych markerów.
Wykrywanie i zdekodowanie znaczników.
DANE WYJŚCIOWE
Lista zdekodowanych numerów zapisanych na markerach widocznych na obrazie
wejściowym.
MODUŁ: MARKERDETE
CTOR
KONWERSJA OBRAZU NA
SKALĘ SZAROŚCI
Konwersja do skali szarości jest konieczna, ponieważ markery zazwyczaj zawierają tylko
czarne
i białe bloki, dużo łatwiej pracować z nimi w skali szarości.
W OpenCV konwersja kolorów jest dość prosta.
void
MarkerDetector::prepareImage(const
cv::Mat&
bgraMat,
cv::Mat&
grayscale)
const
{
cv::cvtColor(bgraMat,
grayscale,
CV_BGRA2GRAY);
}
BINARYZACJA OBRAZU
Operacja binaryzacji przekształci każdy piksel naszego obrazu do czerni (zero Intensywność)
lub biały (pełna intensywność). Ten krok jest wymagany, aby znaleźć kontury. Istnieje kilka
metod progowania obrazu, każda ma mocne i słabe strony. Najprostszym i najszybszą
metodą jest próg absolutny. W tej metodzie otrzymaną wartość zależy od wartości piksela i
jakiejś wybranej wartość progowej. Jeżeli natężenie koloru piksela jest większe niż wartość
progowa, otrzymamy biały (255), bądź czarny (0) piksel.
Metoda
ta ma ogromną wadę, to zależy od warunków oświetlenia i
miękkie
zmiany
intensywności. Sposób korzystniejsze jest adaptacyjny próg. główna różnica tej metody jest
stosowanie wszystkich pikseli w danym promieniu wokół tej zbadane pikseli. Przy użyciu
średniej intensywności daje dobre wyniki i zapewnia bardziej niezawodne Wykrywanie rogu.
id
MarkerDetector::performThreshold(const
cv::Mat&
grayscale,
cv::Mat&
thresholdImg)
const
{
cv::adaptiveThreshold(grayscale,
thresholdImg,//
Result binary image
255,
cv::ADAPTIVE_THRESH_GAUSSIAN_C,
cv::THRESH_BINARY_INV,
7,
7
// Input image
1
);
}
Po zastosowaniu progu adaptacyjnego do obrazu wejściowego, obraz wynikowy wygląda
podobnie do następującego:
DETEKCJA
KRAWĘDZI
Każdy marker wygląda podobnie to kwadratowej figury z czarnymi i białymi obszarami
wewnątrz niego. Najlepszym sposobem, aby zlokalizować znacznik jest znalezienie
zamkniętego konturu i aproksymacja go do wielokąta zawierającego 4 wierzchołki.
void
MarkerDetector::findContours(cv::Mat&
thresholdImg,
ContoursVector&
contours,
int
minContourPointsAllowed)
const
{
ContoursVector
allContours;
cv::findContours(thresholdImg, allContours,
CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
contours.clear();
for
(size_t i = 0; i<allContours.size(); i++)
{
int
contourSize = allContours[i].size();
if
(contourSize >=
minContourPointsAllowed)
{
contours.push_back(allContours[i]);
}
}
}
Funkcja zwraca listę wielokątów, gdzie każdy wielokąt reprezentuje
jeden konturu. Funkcja pomija kontury, które mają swój obwód w pikselach
ustawiona wartość jest mniejsza od wartości zmiennej
minContourPointsAllowed
. Paramatru
tego używamy, ponieważ nie jesteśmy zainteresowani w małymi konturami, takimi które
składają się ze zbyt małej ilości punktów. Kontury te prawdopodobnie nie zawierają
Marker’a lub nie będziemy w stanie rozpoznać jego wartości ze względu na niewielki rozmiar
znacznika.
Poniższy rysunek przedstawia wizualizację wykrytych konturów:
2
Plik z chomika:
wiedmololbul
Inne pliki z tego folderu:
druk_test.docx
(732 KB)
druk_test.pdf
(1951 KB)
Dekodowanie kodu Hamming.pdf
(294 KB)
Doswiadczenie_zawodowe.pdf
(347 KB)
Doswiadczenie_zawodowe_podpis.pdf
(358 KB)
Inne foldery tego chomika:
Pliki dostępne do 01.06.2025
Pliki dostępne do 08.07.2024
Filmy
Galeria
Gry
Zgłoś jeśli
naruszono regulamin