Деталі електронної книги

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лектронна книга

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)

  • Назва: OpenCV 3. Komputerowe rozpoznawanie obrazu w C++ przy użyciu biblioteki OpenCV
  • Автор: Adrian Kaehler, Gary Bradski
  • Оригінальна назва: Learning OpenCV 3: Computer Vision in C++ with the OpenCV Library
  • Переклад: Łukasz Piwko
  • ISBN: 978-83-283-1659-1, 9788328316591
  • Дата видання: 2017-11-17
  • Формат: Eлектронна книга
  • Ідентифікатор видання: opencv
  • Видавець: Helion