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).