Details zum E-Book

OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV

OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV

Adrian Kaehler, Gary Bradski

E-book

Komputerowe rozpoznawanie obrazów przechodzi dziś fazę burzliwego rozwoju. Przyczyniają się do tego ogromna popularność cyfrowych aparatów fotograficznych, wielka liczba grafik zgromadzonych w obszernych internetowych bazach danych, a przede wszystkim coraz doskonalsze algorytmy przetwarzania obrazu. W rozwijaniu tej technologii wielką rolę odegrała biblioteka OpenCV, usprawniając pracę setek tysięcy ludzi. OpenCV 3.x ułatwia efektywne rozwijanie projektów dzięki opartej na języku C++ spójnej architekturze, która doskonale działa na wielu platformach.

Ta książka, przeznaczona dla osób znających język C++, jest praktycznym wprowadzeniem do otwartej biblioteki OpenCV w wersji 3.x. Zawiera też podstawowe informacje na temat komputerowego rozpoznawania obrazu, co powinno ułatwić efektywne posługiwanie się tą biblioteką. Sama biblioteka OpenCV została przedstawiona w sposób umożliwiający bardzo szybkie rozpoczęcie pracy. Książka ułatwia naturalne zrozumienie działania algorytmów, dzięki czemu projektowanie i debugowanie aplikacji nie powinno sprawiać problemów. W ten sposób książka ta staje się świetnym przygotowaniem do zgłębienia bardziej zaawansowanych zagadnień komputerowego rozpoznawania obrazu i uczenia maszynowego.

Najważniejsze zagadnienia:

  • Przegląd biblioteki OpenCV i zawarte w niej funkcje
  • Praca z plikami obrazów, filmów i danych oraz przekształcanie obrazów
  • Ważniejsze algorytmy do pracy na obrazach
  • Punkty kluczowe: wykrywanie i filtrowanie
  • Trójwymiarowe widzenie, ruch, określanie pozycji
  • Uczenie maszyn w OpenCV

OpenCV: poznaj i stosuj algorytmy przetwarzania obrazów!


Adrian Kaehler jest naukowcem i założycielem start-upów. Zajmuje się uczeniem maszynowym, modelowaniem statystycznym i komputerowym rozpoznawaniem obrazu. Pracuje w Intel Corporation i w Laboratorium Sztucznej Inteligencji Uniwersytetu Stanforda. Współzakładał Silicon Valley Deep Learning Group.

Gary Rost Bradski jest naukowcem i konsultantem. Zajmuje się robotyką, uczeniem maszynowym i komputerowym rozpoznawaniem obrazów. Pracuje w Laboratorium Sztucznej Inteligencji Uniwersytetu Stanforda. Współtworzył takie biblioteki jak Open Source Computer Vision Library, Machine Learning Library i Probabilistic Network Library (PNL).

Wstęp (15)

  • Przeznaczenie książki (15)
    • Adresaci książki (16)
    • Czym nie jest ta książka (17)
  • O przykładowych programach (17)
  • Warunki (17)
  • Jak najlepiej korzystać z tej książki (18)
  • Konwencje typograficzne (19)
  • Podziękowania (20)
    • Podziękowania za pomoc przy tworzeniu biblioteki OpenCV (20)
    • Podziękowania za pomoc przy pisaniu książki (21)
    • Kilka słów od Adriana (21)
    • Kilka słów od Gary'ego (22)

1. Wprowadzenie (25)

  • Czym jest OpenCV? (25)
  • Kto używa biblioteki OpenCV? (26)
  • Czym jest komputerowe rozpoznawanie obrazu? (27)
  • Pochodzenie biblioteki OpenCV (30)
    • Schemat blokowy OpenCV (31)
    • Przyspieszanie działania biblioteki OpenCV za pomocą IPP (32)
    • Do kogo należy OpenCV? (33)
  • Pobieranie i instalowanie OpenCV (33)
    • Instalacja (34)
  • Pobieranie najnowszej wersji OpenCV przez Git (36)
  • Kompletna dokumentacja OpenCV (37)
    • Dokumentacja dołączona do biblioteki (37)
    • Dokumentacja internetowa i strona wiki (37)
  • Repozytorium kodu od społeczności (39)
    • Pobieranie i kompilowanie modułów z repozytorium opencv_contrib (40)
  • Przenośność (40)
  • Podsumowanie (41)
  • Ćwiczenia (42)

2. Wprowadzenie do OpenCV (43)

  • Pliki dołączane (43)
    • Zasoby (44)
  • Pierwszy program - wyświetlanie obrazu (44)
  • Drugi program - wideo (47)
  • Przegląd (48)
  • Prosta transformacja (52)
  • Trochę bardziej skomplikowana transformacja (53)
  • Dane z kamery (55)
  • Zapisywanie w pliku AVI (56)
  • Podsumowanie (57)
  • Ćwiczenia (58)

3. Typy danych OpenCV (59)

  • Wiadomości podstawowe (59)
  • Typy danych OpenCV (59)
    • Przegląd podstawowych typów danych (60)
    • Typy podstawowe - szczegóły (61)
    • Obiekty pomocnicze (68)
    • Funkcje pomocnicze (75)
    • Struktury szablonowe (81)
  • Podsumowanie (82)
  • Ćwiczenia (83)

4. Obrazy i duże typy tablicowe (85)

  • Pamięć dynamiczna i zmienna (85)
    • Klasa cv::Mat - n-wymiarowe tablice gęste (85)
    • Tworzenie tablicy (86)
    • Indywidualny dostęp do elementów tablicy (90)
    • N-arny iterator tablicowy - NAryMatIterator (93)
    • Dostęp do elementów tablicy według bloków (95)
    • Wyrażenia macierzowe - algebra i klasa cv::Mat (97)
    • Rzutowanie nasyceniowe (98)
    • Co jeszcze potrafią tablice? (99)
    • Klasa cv::SparseMat - tablice rzadkie (100)
    • Dostęp do elementów tablicy rzadkiej (101)
    • Funkcje dostępne tylko dla tablic rzadkich (103)
    • Struktury szablonowe dla dużych typów tablicowych (104)
  • Podsumowanie (106)
  • Ćwiczenia (106)

5. Operacje na tablicach (109)

  • Co jeszcze można zrobić z tablicami? (109)
    • cv::abs() (112)
    • cv::absdiff() (113)
    • cv::add() (113)
    • cv::addWeighted() (113)
    • cv::bitwise_and() (115)
    • cv::bitwise_not() (115)
    • cv::bitwise_or() (116)
    • cv::bitwise_xor() (116)
    • cv::calcCovarMatrix() (116)
    • cv::cartToPolar() (118)
    • cv::checkRange() (119)
    • cv::compare() (119)
    • cv::completeSymm() (120)
    • cv::convertScaleAbs() (120)
    • cv::countNonZero() (121)
    • cv::cvarrToMat() (121)
    • cv::dct() (122)
    • cv::dft() (122)
    • cv::cvtColor() (123)
    • cv::determinant() (126)
    • cv::divide() (127)
    • cv::eigen() (127)
    • cv::exp() (128)
    • cv::extractImageCOI() (128)
    • cv::flip() (128)
    • cv::gemm() (128)
    • cv::getConvertElem() i cv::getConvertScaleElem() (129)
    • cv::idct() (130)
    • cv::idft() (130)
    • cv::inRange() (130)
    • cv::insertImageCOI() (131)
    • cv::invert() (131)
    • cv::log() (132)
    • cv::LUT() (132)
    • cv::Mahalanobis() (133)
    • cv::max() (133)
    • cv::mean() (135)
    • cv::meanStdDev() (135)
    • cv::merge() (136)
    • cv::min() (136)
    • cv::minMaxIdx() (137)
    • cv::minMaxLoc() (137)
    • cv::mixChannels() (138)
    • cv::mulSpectrums() (140)
    • cv::multiply() (140)
    • cv::mulTransposed() (140)
    • cv::norm() (141)
    • cv::normalize() (142)
    • cv::perspectiveTransform() (143)
    • cv::phase() (144)
    • cv::polarToCart() (145)
    • cv::pow() (145)
    • cv::randu() (145)
    • cv::randn() (146)
    • cv::randShuffle() (146)
    • cv::reduce() (147)
    • cv::repeat() (148)
    • cv::scaleAdd() (148)
    • cv::setIdentity() (148)
    • cv::solve() (149)
    • cv::solveCubic() (150)
    • cv::solvePoly() (150)
    • cv::sort() (151)
    • cv::sortIdx() (151)
    • cv::split() (151)
    • cv::sqrt() (152)
    • cv::subtract() (153)
    • cv::sum() (153)
    • cv::trace() (153)
    • cv::transform() (154)
    • cv::transpose() (154)
  • Podsumowanie (154)
  • Ćwiczenia (155)

6. Rysowanie i pisanie (157)

  • Rysowanie (157)
    • Linie i wypełnione wielokąty (157)
    • Czcionki i tekst (163)
  • Podsumowanie (165)
  • Ćwiczenia (166)

7. Funktory w OpenCV (167)

  • Obiekty, które "coś" robią (167)
    • Analiza składowych głównych - cv::PCA (167)
    • Rozkład według wartości osobliwych - cv::SVD (170)
    • Generator liczb losowych - cv::RNG (173)
  • Podsumowanie (175)
  • Ćwiczenia (176)

8. Pliki obrazów, filmów i danych (179)

  • HighGUI - przenośny zestaw narzędzi GUI (179)
  • Praca z plikami obrazów (180)
    • Ładowanie i zapisywanie obrazów (181)
    • Uwaga na temat kodeków (183)
    • Kompresja i dekompresja (183)
  • Praca z plikami wideo (184)
    • Odczytywanie wideo za pomocą obiektu cv::VideoCapture (184)
    • Zapisywanie wideo za pomocą obiektu cv::VideoWriter (190)
  • Zapisywanie danych (191)
    • Zapisywanie danych w obiekcie cv::FileStorage (191)
    • Odczytywanie danych z obiektu cv::FileStorage (193)
    • cv::FileNode (194)
  • Podsumowanie (197)
  • Ćwiczenia (197)

9. Okna wieloplatformowe i macierzyste (201)

  • Praca z oknami (201)
    • Macierzysty graficzny interfejs użytkownika HighGUI (201)
    • Praca z biblioteką Qt (212)
    • Integracja OpenCV z kompletnymi bibliotekami GUI (221)
  • Podsumowanie (233)
  • Ćwiczenia (234)

10. Filtry i sploty (235)

  • Informacje ogólne (235)
  • Zanim zaczniesz (235)
    • Filtry, jądra i splot (235)
    • Ekstrapolacja krawędzi i warunki brzegowe (236)
  • Operacje graniczne (240)
    • Algorytm Otsu (242)
    • Zmienna wartość graniczna (243)
  • Wygładzanie (245)
    • Proste rozmazanie i filtr prostokątny (246)
    • Filtr medianowy (247)
    • Filtr Gaussa (248)
    • Filtr bilateralny (250)
  • Pochodne i gradienty (251)
    • Pochodna Sobela (251)
    • Filtr Scharra (253)
    • Laplasjan (254)
  • Morfologia obrazu (255)
    • Dylatacja i erozja (257)
    • Ogólna funkcja morfologiczna (260)
    • Otwieranie i zamykanie (260)
    • Gradient morfologiczny (263)
    • Top Hat i Black Hat (265)
    • Tworzenie własnego jądra (267)
  • Splot z dowolnym filtrem liniowym (268)
    • Stosowanie ogólnego filtra przez funkcję cv::filter2D() (269)
    • Stosowanie ogólnego filtra rozdzielnego za pomocą funkcji cv::sepFilter2D() (270)
    • Funkcje do tworzenia jąder (270)
  • Podsumowanie (271)
  • Ćwiczenia (271)

11. Ogólne przekształcenia obrazu (277)

  • Wprowadzenie (277)
  • Rozciąganie, kurczenie, zniekształcanie i obracanie (277)
    • Jednorodna zmiana rozmiaru (278)
    • Piramidy obrazów (279)
    • Mapowanie niejednorodne (282)
    • Przekształcenia afiniczne (285)
    • Przekształcenie perspektywiczne (289)
  • Ogólne odwzorowania (291)
    • Odwzorowania biegunowe (292)
    • Współrzędne logarytmiczno-biegunowe (294)
    • Odwzorowania arbitralne (297)
  • Renowacja obrazów (298)
    • Inpainting (299)
    • Usuwanie szumów (300)
  • Wyrównywanie histogramu (303)
    • cv::equalizeHist() - wyrównywanie kontrastu (304)
  • Podsumowanie (305)
  • Ćwiczenia (306)

12. Analiza obrazu (307)

  • Wprowadzenie (307)
  • Dyskretna transformacja Fouriera (307)
    • cv::dft() - dyskretna transformacja Fouriera (308)
    • cv::idft() - odwrotna dyskretna transformacja Fouriera (310)
    • cv::mulSpectrums() - mnożenie widm (311)
    • Splot przy użyciu dyskretnej transformacji Fouriera (311)
    • cv::dct() - dyskretna transformacja cosinusowa (312)
    • cv::idct() - odwrotna dyskretna transformacja cosinusowa (313)
  • Obrazy całkowe (314)
    • cv::integral() - obliczanie standardowego obrazu całkowego (316)
    • cv::integral() - suma kwadratowa (316)
    • cv::integral() - suma nachylona (317)
  • Detektor krawędzi Canny'ego (317)
    • cv::Canny() (319)
  • Transformacja Hougha (319)
    • Transformacja liniowa Hougha (319)
    • Transformacja kołowa Hougha (323)
  • Transformacja odległościowa (327)
    • cv::distanceTransform() - transformacja odległościowa bez etykiet (327)
    • cv::distanceTransform() - transformacja odległościowa z etykietami (328)
  • Segmentacja (329)
    • Algorytm flood fill (329)
    • Algorytm wododziałowy (332)
    • Algorytm Grabcuts (334)
    • Metoda segmentacji mean-shift (336)
  • Podsumowanie (338)
  • Ćwiczenia (338)

13. Histogramy i szablony (341)

  • Reprezentacja histogramów w OpenCV (344)
    • cv::calcHist() - tworzenie histogramu z danych (344)
  • Podstawowe operacje na histogramach (346)
    • Normalizacja histogramu (347)
    • Próg histogramu (347)
    • Znajdowanie najbardziej zapełnionego przedziału (347)
    • Porównywanie histogramów (349)
    • Przykłady użycia histogramów (351)
  • Zaawansowane metody pracy z histogramami (354)
    • Algorytm EMD (354)
    • Rzutowanie wstecz (358)
  • Dopasowywanie szablonów (362)
    • Metoda porównywania kwadratu różnicy - cv::TM_SQDIFF (363)
    • Znormalizowana metoda porównywania kwadratu różnicy - cv::TM_SQDIFF_NORMED (364)
    • Metody korelacji krzyżowej - cv::TM_CCORR (364)
    • Znormalizowana metoda korelacji krzyżowej - cv::TM_CCORR_NORMED (364)
    • Metody dopasowywania współczynnika korelacji - cv::TM_CCOEFF (364)
    • Znormalizowana metoda dopasowywania współczynnika korelacji - cv::TM_CCOEFF_NORMED (365)
  • Podsumowanie (367)
  • Ćwiczenia (368)

14. Kontury (371)

  • Znajdowanie konturów (371)
    • Hierarchie konturów (372)
    • Rysowanie konturów (376)
    • Przykład rysowania konturów (377)
    • Inny przykład rysowania konturów (378)
    • Szybka analiza komponentów połączonych (380)
  • Inne zastosowania konturów (382)
    • Aproksymacja wielokątów (382)
    • Geometria i różne rodzaje sumowania (383)
    • Testy geometryczne (389)
  • Dopasowywanie konturów i obrazów (390)
    • Momenty (390)
    • Więcej o momentach (392)
    • Dopasowywanie a momenty Hu (395)
    • Porównywanie kształtów za pomocą algorytmu Shape Context (396)
  • Podsumowanie (400)
  • Ćwiczenia (401)

15. Odejmowanie tła (403)

  • Wiadomości podstawowe (403)
  • Wady operacji odejmowania tła (404)
  • Modelowanie sceny (405)
    • Wycinek pikseli (405)
    • Różnicowanie klatek (408)
  • Metoda uśredniania tła (409)
    • Akumulowanie średnich, wariancji i kowariancji (414)
  • Bardziej zaawansowana metoda odejmowania tła (422)
    • Struktury (425)
    • Poznawanie tła (426)
    • Nauka w obecności ruchomych obiektów pierwszego planu (428)
    • Różnicowanie tła - znajdowanie obiektów pierwszego planu (429)
    • Przykład użycia modelu tła opartego na księgach kodów (430)
    • Kilka dodatkowych uwag na temat modeli opartych na księgach kodów (430)
  • Komponenty połączone dla czyszczenia pierwszego planu (431)
    • Szybki test (434)
  • Porównanie dwóch metod rozpoznawania tła (436)
  • Implementacja techniki odejmowania tła w OpenCV (437)
    • Klasa bazowa cv::BackgroundSubtractor (437)
    • Metoda Kaewtrakulponga i Bowdena (438)
    • Metoda Zivkovica (439)
  • Podsumowanie (442)
  • Ćwiczenia (442)

16. Punkty kluczowe i deskryptory (445)

  • Punkty kluczowe i podstawy śledzenia (445)
    • Znajdowanie rogów (446)
    • Wprowadzenie do przepływu optycznego (450)
    • Rzadki przepływ optyczny - metoda Lucasa-Kanade'a (451)
  • Uogólnione punkty kluczowe i deskryptory (461)
    • Przepływ optyczny, śledzenie i rozpoznawanie (462)
    • Jak biblioteka OpenCV obsługuje punkty kluczowe i deskryptory - przypadek ogólny (463)
    • Podstawowe metody wykrywania punktów kluczowych (474)
    • Filtrowanie punktów kluczowych (512)
    • Metody dopasowywania (513)
    • Wyświetlanie wyników (519)
  • Podsumowanie (521)
  • Ćwiczenia (522)

17. Śledzenie (525)

  • Pojęcia dotyczące śledzenia (525)
  • Gęsty przepływ optyczny (526)
    • Algorytm rozwinięcia wielomianu Farnebäcka (527)
    • Algorytm Dual TV-L1 (529)
    • Algorytm Simple Flow (533)
  • Algorytmy mean-shift i Camshift (536)
    • Algorytm mean-shift (537)
    • Algorytm Camshift (540)
  • Szablony ruchu (541)
  • Estymatory (548)
    • Filtr Kalmana (549)
    • Kilka słów na temat rozszerzonego filtra Kalmana (564)
  • Podsumowanie (565)
  • Ćwiczenia (565)

18. Modele kamery i metody kalibracji (567)

  • Model kamery (568)
    • Podstawy geometrii rzutowej (570)
    • Transformacja Rodriguesa (572)
    • Zniekształcenia soczewek (573)
  • Kalibracja (576)
    • Macierz obrotu i wektor przesunięcia (578)
    • Plansze kalibracji (580)
    • Homografia (587)
    • Kalibracja aparatu (591)
  • Korekcja zniekształceń (602)
    • Matryce likwidacji zniekształceń (602)
    • Konwertowanie reprezentacji matryc likwidacji zniekształceń za pomocą funkcji cv::convertMaps() (604)
    • Obliczanie matryc likwidacji zniekształceń za pomocą funkcji cv::initUndistortRectifyMap() (604)
    • Likwidowanie zniekształceń obrazu za pomocą funkcji cv::remap() (606)
    • Likwidacja zniekształceń za pomocą funkcji cv::undistort() (606)
    • Rzadkie likwidowanie zniekształceń za pomocą funkcji cv::undistortPoints() (607)
  • Podsumowanie technik kalibracji (607)
  • Podsumowanie (610)
  • Ćwiczenia (611)

19. Rzutowanie i trójwymiarowe widzenie (613)

  • Rzutowanie (614)
  • Przekształcenia afiniczne i perspektywiczne (615)
    • Przykład przekształcenia na widok z góry (616)
  • Określanie pozycji trójwymiarowych obiektów (621)
    • Określanie pozycji za pomocą jednej kamery (621)
  • Obrazowanie stereo (623)
    • Triangulacja (624)
    • Geometria epipolarna (628)
    • Macierz zasadnicza i macierz fundamentalna (630)
    • Obliczanie linii epipolarnych (638)
    • Kalibracja stereo (639)
    • Rektyfikacja stereo (643)
    • Korespondencja stereo (652)
    • Kalibracja stereo, rektyfikacja i korespondencja - przykładowy program (665)
    • Matryce głębi z trójwymiarowej reprojekcji (671)
  • Struktura z ruchu (673)
  • Dopasowywanie linii w dwóch i trzech wymiarach (673)
  • Podsumowanie (676)
  • Ćwiczenia (677)

20. Podstawy uczenia maszyn w OpenCV (679)

  • Czym jest uczenie maszyn? (679)
    • Szkolenie i zbiory danych testowych (680)
    • Uczenie nadzorowane i nienadzorowane (681)
    • Modele generacyjne i dyskryminacyjne (683)
    • Algorytmy ML w OpenCV (683)
    • Zastosowania metod uczenia maszyn w komputerowym rozpoznawaniu obrazu (685)
    • Znaczenie zmiennej (687)
    • Diagnozowanie usterek w algorytmach uczenia maszyn (688)
  • Stare procedury w bibliotece ML (694)
    • K-średnich (694)
    • Odległość Mahalanobisa (699)
  • Podsumowanie (703)
  • Ćwiczenia (703)

21. StatModel - standardowy model uczenia w OpenCV (705)

  • Podstawowe procedury biblioteki ML (705)
    • Szkolenie i struktura cv::ml::TrainData (707)
    • Prognozowanie (713)
  • Algorytmy uczenia maszyn oparte na interfejsie cv::StatModel (714)
    • Naiwny lub normalny klasyfikator Bayesa (714)
    • Binarne drzewa decyzyjne (719)
    • Boosting (732)
    • Drzewa losowe (738)
    • Maksymalizacja oczekiwań (742)
    • K najbliższych sąsiadów (745)
    • Wielowarstwowy perceptron (748)
    • Maszyna wektorów nośnych (756)
  • Podsumowanie (765)
  • Ćwiczenia (766)

22. Wykrywanie obiektów (771)

  • Techniki wykrywania obiektów oparte na drzewach (771)
    • Klasyfikatory kaskadowe (772)
    • Uczenie nadzorowane i teoria wzmacniania (774)
    • Uczenie się nowych obiektów (782)
  • Wykrywanie obiektów za pomocą maszyn wektorów nośnych (790)
    • Wykrywanie obiektów metodą Latent SVM (790)
    • Algorytm Bag of Words i kategoryzacja semantyczna (793)
  • Podsumowanie (798)
  • Ćwiczenia (798)

23. Przyszłość biblioteki OpenCV (801)

  • Przeszłość i teraźniejszość (801)
    • OpenCV 3.x (802)
  • Czy nasze prognozy się sprawdziły? (803)
  • Przyszłość (804)
    • Najświeższe wiadomości o GSoC (805)
    • Wsparcie ze strony społeczności (807)
    • Strona OpenCV.org (808)
  • Spekulacje na temat sztucznej inteligencji (809)
  • Posłowie (812)

A. Rodzaje podziału płaszczyzn (813)

  • Triangulacja Delaunaya, teselacja Woronoja (813)
    • Tworzenie podziałów Delaunaya lub Woronoja (816)
    • Poruszanie się po podziałach Delaunaya (817)
    • Przykłady (823)
  • Ćwiczenia (824)

B. Repozytorium opencv_contrib (825)

  • Przegląd modułów repozytorium opencv_contrib (825)
    • Zawartość katalogu opencv_contrib (825)

C. Wzory kalibracji (829)

  • Wzory kalibracji wykorzystywane w bibliotece OpenCV (829)

Bibliografia (835)

Skorowidz (849)

  • Titel: OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV
  • Autor: Adrian Kaehler, Gary Bradski
  • Originaler Titel: Learning OpenCV 3: Computer Vision in C++ with the OpenCV Library
  • Übersetzung: Łukasz Piwko
  • ISBN: 978-83-283-1659-1, 9788328316591
  • Veröffentlichungsdatum: 2017-11-17
  • Format: E-book
  • Artikelkennung: opencv
  • Verleger: Helion