OpenCV (Open Source Computer Vision) to potężna, otwarta biblioteka do przetwarzania obrazów i wideo, idealna dla entuzjastów robotyki, elektroniki oraz twórców autonomicznych systemów.
Umożliwia realizację zadań od prostego wczytywania zdjęć po zaawansowaną detekcję obiektów w czasie rzeczywistym, co czyni ją nieocenioną w projektach z Raspberry Pi, robotami mobilnymi czy dronami.
W tym artykule, skierowanym do polskich hobbystów i inżynierów robotyki, przejdziemy przez pierwsze kroki z OpenCV – od instalacji, przez podstawowe operacje na obrazach, po przykładowe aplikacje. Skupimy się na języku Python, który jest przyjazny dla początkujących i dominuje w kursach przetwarzania obrazu, choć biblioteka wspiera też C++.
Czym jest OpenCV i dlaczego warto ją znać w robotyce?
OpenCV zawiera setki funkcji do analizy obrazów, detekcji ruchu, segmentacji czy rozpoznawania obiektów. Nowoczesna architektura obejmuje m.in. moduły: core, imgproc, videoio, objdetect i video, co pozwala łączyć klasyczne algorytmy wizyjne z analizą strumieni i detekcją obiektów. W robotyce OpenCV napędza wizję maszynową – roboty mogą unikać przeszkód, śledzić linie lub rozpoznawać gesty użytkownika.
Kluczowe zalety dla elektroników i robotyków – oto najważniejsze powody, dla których warto ją znać:
- Darmowa i otwarta – działa na Linuxie, Windowsie, Raspberry Pi i Androidzie;
- Wydajność w czasie rzeczywistym – płynna analiza wideo z kamer USB lub Pi Camera;
- Integracja z hardware’em – współpraca z Arduino (serial), GPIO na Raspberry Pi i akceleracją na ARM;
- Szerokie zastosowania – detekcja twarzy (Haar), krawędzi (Canny), konturów, OCR i wiele więcej.
Biblioteka ewoluowała od interfejsu C (struktury jak IplImage, CvMat) do nowoczesnego C++ i Pythona z klasą Mat. W nowych projektach unikaj starych API w stylu C – stawiaj na cv::Mat i cv2 w Pythonie.
Instalacja OpenCV – krok po kroku
Najprostszy start w Pythonie: zainstaluj pakiet za pomocą pip:
pip install opencv-python
Jeśli potrzebujesz modułów dodatkowych (np. SIFT/SURF, extra algorytmy z opencv_contrib), użyj wersji z dodatkami:
pip install opencv-contrib-python
Na Raspberry Pi kompilacja ze źródeł zapewni najlepszą wydajność na ARM. Skorzystaj z virtualenv dla izolacji środowiska i zgodności bibliotek.
Poniższa tabela podsumowuje popularne metody instalacji i pomaga wybrać właściwą:
| Metoda | Polecenie | Kiedy wybrać | Zalety | Uwagi |
|---|---|---|---|---|
| pip (opencv-python) | pip install opencv-python |
start, nauka, szybkie prototypy | najszybsza instalacja, małe wymagania | mniej algorytmów niż wersja contrib |
| pip (opencv-contrib-python) | pip install opencv-contrib-python |
potrzeba dodatkowych algorytmów | pełniejszy zestaw funkcji | większy rozmiar pakietu |
| kompilacja ze źródeł (Raspberry Pi) | cmake .. && make -j4 && sudo make install |
wydajność na ARM, optymalizacja | wsparcie NEON/VFPv3, pełna kontrola | dłuższa instalacja (~1–2 h), wymaga CMake |
Aby upewnić się, że instalacja przebiegła poprawnie, uruchom w Pythonie:
import cv2
print(cv2.__version__)
Podstawy – wczytywanie, wyświetlanie i zapis obrazów
Pierwszy program – wczytaj obraz, wyświetl go i zapisz kopię:
import cv2
# Wczytaj obraz (1 = kolorowy, 0 = szary)
img = cv2.imread('obraz.jpg', 1)
cv2.namedWindow('Obraz', cv2.WINDOW_NORMAL)
cv2.imshow('Obraz', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Zapisz kopię
cv2.imwrite('kopia.jpg', img)
Ten kod wczytuje plik obraz.jpg, wyświetla go w oknie i czeka na klawisz. W robotyce to baza do podglądu z kamery – zamień cv2.imread na cv2.VideoCapture(0) i przetwarzaj klatki w pętli.
Operacje na pikselach – przykład ustawienia składowej B (niebieskiej) w punkcie (x, y):
img.itemset((y, x, 0), 255) # kanał B = 255
Podstawowe przekształcenia obrazu
Filtry, progowanie i transformacje geometryczne są kluczowe do przygotowania danych dla robotów przed detekcją czy sterowaniem.
1. Rozmycie i wygładzanie
Usuwa szumy z obrazów z tanich kamer robotycznych, poprawiając stabilność detekcji:
rozmycie = cv2.GaussianBlur(img, (15, 15), 0) # kernel 15x15
cv2.imshow('Rozmycie', rozmycie)
Dostępne są też: cv2.blur (średnia) i cv2.medianBlur (impulsy/sól‑pieprz).
2. Progowanie
Konwersja do obrazu binarnego upraszcza segmentację obiektów:
img_szary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, prog = cv2.threshold(img_szary, 127, 255, cv2.THRESH_BINARY)
Najczęściej stosowane metody progowania to:
- binary,
- adaptive (cv2.adaptiveThreshold),
- Otsu (cv2.THRESH_OTSU).
3. Detekcja krawędzi
Operator Canny sprawdza się w wykrywaniu konturów i kształtów w systemach autonomicznych:
img_szary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
krawedzie = cv2.Canny(img_szary, 100, 200)
cv2.imshow('Krawędzie Canny', krawedzie)
4. Transformacje geometryczne
Skalowanie i rotacja pomagają w stabilizacji obrazu z ruchomej platformy:
# Skalowanie
wys, szer = img.shape[:2]
nowy = cv2.resize(img, (szer // 2, wys // 2))
# Rotacja o 45 stopni
M = cv2.getRotationMatrix2D((szer / 2, wys / 2), 45, 1.0)
rotacja = cv2.warpAffine(img, M, (szer, wys))
Dla korekcji perspektywy użyj cv2.warpPerspective z macierzą 3×3.
Ćwiczenie dla czytelników – wykonaj cztery przekształcenia na dowolnym obrazie:
- rozmycie gaussowskie dla redukcji szumu,
- inwersja kolorów (np.
img = 255 - img), - wyostrzanie maską (np. filtr jądra z wzmocnionym środkiem),
- odbicie lustrzane w poziomie (
cv2.flip(img, 1)).
Wykrywanie obiektów i konturów
Wykrywanie konturów jest fundamentem w robotyce – np. przy śledzeniu piłki czy obrysów przeszkód:
kontury, _ = cv2.findContours(krawedzie, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, kontury, -1, (0, 255, 0), 3)
Transformata Hougha pozwala wykrywać linie i okręgi, co ułatwia nawigację po linii lub detekcję kół:
import numpy as np
linie = cv2.HoughLinesP(krawedzie, 1, np.pi / 180, 100, minLineLength=100)
Detekcja twarzy (Haar Cascade) – wczytaj klasyfikator i wykryj obszary twarzy:
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
img_szary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
twarze = face_cascade.detectMultiScale(img_szary, 1.3, 5)
for (x, y, w, h) in twarze:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
Operacje morfologiczne – erozja i dylatacja pomagają czyścić szumy po progowaniu:
kernel = np.ones((5, 5), np.uint8)
dylatacja = cv2.dilate(img, kernel, iterations=1)
Przetwarzanie wideo w czasie rzeczywistym
Analiza strumienia z kamery to serce wielu projektów robotycznych. Przykładowa pętla z krawędziowaniem:
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
szary = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
krawedzie = cv2.Canny(szary, 100, 200)
cv2.imshow('Wideo', krawedzie)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
To gotowa baza do śledzenia ruchu (różnicowanie klatek), analizy optycznego przepływu czy detekcji w dronach.
Zaawansowane tematy i projekty robotyczne
Oto obszary, które warto zgłębić po opanowaniu podstaw:
- OCR – rozpoznawanie tekstu (np. EasyOCR) z wstępną obróbką w OpenCV;
- Nakładanie obrazów – augmentacja danych do trenowania i symulacji;
- Integracja z Raspberry Pi – kompilacja OpenCV, detekcja na żywo, sterowanie GPIO;
- Trening modeli – HOG/SVM dla niestandardowych obiektów lub własne klasyfikatory CNN.
Projekt dla robotyków – mobilny robot unikający przeszkód: wykrywaj kontury, estymuj dystans (np. stereo lub skala znana), a następnie steruj prędkością i kierunkiem przez GPIO/PWM.
Histogramy i CLAHE – popraw stabilność detekcji w trudnym świetle przez wyrównanie kontrastu: cv2.createCLAHE().apply(szary).