AI & Data Science

Computer Vision dengan OpenCV

Tutorial lengkap Computer Vision menggunakan Python dan OpenCV β€” image processing, face detection, object tracking, contour detection dengan contoh kode praktis

1. Pengenalan Computer Vision

Computer Vision adalah bidang kecerdasan buatan (AI) yang memungkinkan komputer untuk "melihat" dan memahami konten dari gambar atau video. Dengan Computer Vision, mesin dapat mengenali objek, mendeteksi wajah, membaca teks, dan bahkan memahami adegan dalam sebuah gambar.

OpenCV (Open Source Computer Vision Library) adalah library open-source terbesar dan paling populer untuk Computer Vision. OpenCV menyediakan lebih dari 2500 algoritma yang dioptimalkan untuk pemrosesan gambar dan video secara real-time.

Aplikasi Computer Vision di Dunia Nyata

Aplikasi Contoh Penggunaan
Pengenalan WajahFace unlock smartphone, sistem keamanan, absensi otomatis
Autonomous VehicleMendeteksi pejalan kaki, rambu lalu lintas, dan objek di jalan
Medical ImagingDeteksi tumor dari foto X-ray atau MRI
OCR (Optical Character Recognition)Membaca teks dari foto dokumen, plat nomor kendaraan
Augmented RealityFilter Instagram/Snapchat, game AR seperti Pokemon Go
Quality ControlInspeksi produk di pabrik secara otomatis

Ekosistem OpenCV

Fitur Deskripsi
Bahasa DidukungPython, C++, Java, JavaScript
PlatformWindows, Linux, macOS, Android, iOS
Jumlah Algoritma2500+ algoritma CV dan ML
OptimasiDukungan GPU (CUDA), SIMD instructions
LisensiBSD License (gratis untuk komersial)
KomunitasJutaan pengguna di seluruh dunia
Diagram: Pipeline Computer Vision
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              COMPUTER VISION PIPELINE                  β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Input    │──▢│ Pre-     │──▢│  Feature         β”‚  β”‚
β”‚  β”‚  Image/   β”‚   β”‚ Process  β”‚   β”‚  Extraction      β”‚  β”‚
β”‚  β”‚  Video    β”‚   β”‚          β”‚   β”‚                  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚       β”‚                                β”‚              β”‚
β”‚       β–Ό                                β–Ό              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Display  │◀──│ Post-    │◀──│  Detection /     β”‚  β”‚
β”‚  β”‚ Result   β”‚   β”‚ Process  β”‚   β”‚  Classification  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                       β”‚
β”‚  Pre-Process: Resize, Grayscale, Blur, Threshold      β”‚
β”‚  Feature: Edge, Corner, Contour, Color Histogram      β”‚
β”‚  Detection: Haar Cascade, HOG, DNN, Template Match    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
πŸ’‘ Tips

Computer Vision membutuhkan banyak komputasi. Pastikan komputer Anda memiliki RAM minimal 8GB dan sebaiknya menggunakan GPU untuk proses yang lebih berat seperti deep learning. Untuk tutorial dasar ini, CPU sudah cukup.

2. Setup OpenCV di Python

Untuk memulai bekerja dengan OpenCV, kita perlu menginstal library-nya dan memahami cara membaca serta menampilkan gambar. OpenCV untuk Python disebut cv2.

Instalasi

Bash
# Instal OpenCV dan NumPy
pip install opencv-python numpy

# Untuk fitur GUI (imshow, waitKey)
pip install opencv-python-headless
# Atau jika butuh GUI penuh:
pip install opencv-python

# Verifikasi instalasi
python -c "import cv2; print(cv2.__version__)"
# Output: 4.10.0 (atau versi terbaru)

Membaca dan Menampilkan Gambar

Python β€” Baca & Tampilkan Gambar
import cv2
import numpy as np

# Membaca gambar dari file
img = cv2.imread('foto.jpg')

# Mengecek dimensi gambar (tinggi, lebar, channel)
print(f"Dimensi: {img.shape}")  # Contoh: (480, 640, 3)
print(f"Ukuran: {img.size}")    # Total pixel: 480 * 640 * 3
print(f"Tipe data: {img.dtype}") # uint8 (0-255)

# Menampilkan gambar di jendela
cv2.imshow('Gambar Asli', img)
cv2.waitKey(0)         # Tunggu tombol ditekan
cv2.destroyAllWindows() # Tutup semua jendela

# Menyimpan gambar ke file
cv2.imwrite('output.jpg', img)

# Membaca gambar sebagai grayscale
gray = cv2.imread('foto.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Grayscale', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

# Membaca video dari file
cap = cv2.VideoCapture('video.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    cv2.imshow('Video', frame)
    
    # Tekan 'q' untuk keluar
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

# Membaca dari webcam (ganti 0 dengan index kamera)
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('Webcam', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
⚠️ Perhatian Warna di OpenCV

OpenCV menggunakan format warna BGR (Blue-Green-Red), bukan RGB seperti library lain. Saat menampilkan dengan Matplotlib, Anda perlu konversi: img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).

3. Dasar Image Processing

Image processing adalah fondasi dari Computer Vision. Di bagian ini, kita akan mempelajari operasi dasar seperti resize, crop, rotasi, dan konversi warna yang sangat sering digunakan dalam pipeline Computer Vision.

Resize, Crop, dan Rotasi

Python β€” Operasi Dasar Gambar
import cv2
import numpy as np

img = cv2.imread('foto.jpg')

# ===== RESIZE =====
# Resize ke ukuran tertentu
resized = cv2.resize(img, (400, 300))  # (lebar, tinggi)

# Resize dengan faktor skala
resized_half = cv2.resize(img, None, fx=0.5, fy=0.5)

# Resize dengan interpolasi yang tepat
# INTER_AREA untuk mengecilkan, INTER_CUBIC/INTER_LINEAR untuk memperbesar
resized_down = cv2.resize(img, (200, 150), interpolation=cv2.INTER_AREA)
resized_up = cv2.resize(img, (1280, 960), interpolation=cv2.INTER_CUBIC)

# ===== CROP =====
# Crop menggunakan array slicing [y1:y2, x1:x2]
cropped = img[100:400, 150:500]  # Potong area tertentu

# ===== ROTASI =====
(h, w) = img.shape[:2]
center = (w // 2, h // 2)

# Rotasi 45 derajat
M = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated = cv2.warpAffine(img, M, (w, h))

# Rotasi 90 derajat (lebih mudah dengan flip)
rotated_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
rotated_180 = cv2.rotate(img, cv2.ROTATE_180)

# ===== FLIP =====
flip_horizontal = cv2.flip(img, 1)  # Mirror horizontal
flip_vertical = cv2.flip(img, 0)    # Mirror vertical
flip_both = cv2.flip(img, -1)       # Kedua arah

# ===== KONVERSI WARNA =====
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# ===== MENGGABUNG GAMBAR =====
# Horizontal stacking
combined_h = np.hstack([img, cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)])

# Vertical stacking
combined_v = np.vstack([img, img])

cv2.imshow('Hasil', combined_h)
cv2.waitKey(0)
cv2.destroyAllWindows()

Thresholding dan Binarization

Python β€” Thresholding
import cv2
import numpy as np

gray = cv2.imread('dokumen.jpg', cv2.IMREAD_GRAYSCALE)

# Simple Thresholding
# THRESH_BINARY: pixel > 127 β†’ 255, else β†’ 0
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# THRESH_BINARY_INV: kebalikan dari binary
_, binary_inv = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

# THRESH_TRUNC: pixel > 127 β†’ 127, else tetap
_, trunc = cv2.threshold(gray, 127, 255, cv2.THRESH_TRUNC)

# Adaptive Thresholding β€” cocok untuk pencahayaan tidak rata
adaptive_mean = cv2.adaptiveThreshold(
    gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
    cv2.THRESH_BINARY, 11, 2
)

adaptive_gauss = cv2.adaptiveThreshold(
    gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
    cv2.THRESH_BINARY, 11, 2
)

# Otsu's Thresholding β€” otomatis mencari threshold terbaik
_, otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

print(f"Threshold Otsu: {_}")  # Nilai threshold yang dipilih otomatis

# Tampilkan semua hasil
titles = ['Asli', 'Binary', 'Adaptive Mean', 'Otsu']
images = [gray, binary, adaptive_mean, otsu]

for i in range(4):
    cv2.imshow(titles[i], images[i])
cv2.waitKey(0)
cv2.destroyAllWindows()

4. Filter dan Transformasi

Filter digunakan untuk mengubah tampilan gambar seperti menghaluskan (blur), mendeteksi tepi (edge detection), dan meningkatkan ketajaman. Ini adalah tahap penting sebelum melakukan deteksi objek atau pengenalan pola.

Blurring (Penghalusan)

Python β€” Blur & Filter
import cv2
import numpy as np

img = cv2.imread('foto.jpg')

# ===== BLURRING =====
# Averaging Blur β€” rata-rata dari kernel neighborhood
blur_avg = cv2.blur(img, (5, 5))

# Gaussian Blur β€” pembobotan Gaussian (lebih natural)
blur_gauss = cv2.GaussianBlur(img, (7, 7), 0)

# Median Blur β€” bagus untuk menghilangkan noise "salt & pepper"
blur_median = cv2.medianBlur(img, 5)

# Bilateral Filter β€” blur sambil menjaga tepi tetap tajam
blur_bilateral = cv2.bilateralFilter(img, 9, 75, 75)

# ===== EDGE DETECTION =====
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Sobel Operator β€” deteksi tepi arah X dan Y
sobel_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)
sobel_combined = cv2.magnitude(sobel_x, sobel_y)

# Laplacian β€” deteksi tepi semua arah
laplacian = cv2.Laplacian(gray, cv2.CV_64F)

# Canny Edge Detection β€” yang paling populer
edges = cv2.Canny(gray, 50, 150)  # (gambar, threshold1, threshold2)

# ===== SHARPENING =====
kernel_sharpen = np.array([
    [0, -1, 0],
    [-1, 5, -1],
    [0, -1, 0]
])
sharpened = cv2.filter2D(img, -1, kernel_sharpen)

# ===== MORPHOLOGICAL OPERATIONS =====
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
kernel = np.ones((5, 5), np.uint8)

# Erosion β€” mengikis tepi objek
erosion = cv2.erode(binary, kernel, iterations=1)

# Dilation β€” memperbesar tepi objek
dilation = cv2.dilate(binary, kernel, iterations=1)

# Opening β€” erosion diikuti dilation (hilangkan noise)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

# Closing β€” dilation diikuti erosion (tutup lubang kecil)
closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
Diagram: Jenis-jenis Filter OpenCV
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 JENIS FILTER OPENCV                  β”‚
β”‚                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚   BLURRING   β”‚    β”‚   SHARPENING β”‚               β”‚
β”‚  β”‚              β”‚    β”‚              β”‚               β”‚
β”‚  β”‚ β€’ Average    β”‚    β”‚ β€’ filter2D   β”‚               β”‚
β”‚  β”‚ β€’ Gaussian   β”‚    β”‚ β€’ Unsharp    β”‚               β”‚
β”‚  β”‚ β€’ Median     β”‚    β”‚   Mask       β”‚               β”‚
β”‚  β”‚ β€’ Bilateral  β”‚    β”‚              β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚    EDGE      β”‚    β”‚  MORPHOLOGY  β”‚               β”‚
β”‚  β”‚  DETECTION   β”‚    β”‚              β”‚               β”‚
β”‚  β”‚              β”‚    β”‚ β€’ Erosion    β”‚               β”‚
β”‚  β”‚ β€’ Sobel      β”‚    β”‚ β€’ Dilation   β”‚               β”‚
β”‚  β”‚ β€’ Laplacian  β”‚    β”‚ β€’ Opening    β”‚               β”‚
β”‚  β”‚ β€’ Canny      β”‚    β”‚ β€’ Closing    β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

5. Face Detection dengan Haar Cascade

Haar Cascade adalah metode deteksi objek yang dikembangkan oleh Paul Viola dan Michael Jones pada tahun 2001. Metode ini sangat cepat dan bisa berjalan real-time, sehingga cocok untuk deteksi wajah dari webcam.

Deteksi Wajah dari Gambar

Python β€” Face Detection
import cv2
import numpy as np

# Muat classifier Haar Cascade
# File XML sudah disertakan saat instalasi OpenCV
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
eye_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_eye.xml'
)
smile_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_smile.xml'
)

# Baca gambar
img = cv2.imread('grup_foto.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Deteksi wajah
# detectMultiScale(gambar, scaleFactor, minNeighbors, minSize)
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30)
)

print(f"Terdeteksi {len(faces)} wajah")

# Gambar kotak di sekitar wajah yang terdeteksi
for (x, y, w, h) in faces:
    # Kotak wajah (warna hijau)
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    
    # Label teks
    cv2.putText(img, 'Wajah', (x, y - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    
    # ROI (Region of Interest) untuk deteksi mata di dalam wajah
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    
    # Deteksi mata di area wajah
    eyes = eye_cascade.detectMultiScale(roi_gray, 1.1, 10)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (255, 0, 0), 2)

cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# Simpan hasil
cv2.imwrite('hasil_face_detection.jpg', img)

Real-time Face Detection dari Webcam

Python β€” Webcam Face Detection
import cv2
import numpy as np

face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # Deteksi wajah dengan parameter yang dioptimalkan
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.3,
        minNeighbors=5,
        minSize=(50, 50)
    )
    
    # Gambar kotak pada setiap wajah
    for (x, y, w, h) in faces:
        # Kotak dengan warna biru
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 200, 0), 2)
        
        # Tampilkan jumlah wajah
        cv2.putText(frame, f'Wajah Terdeteksi: {len(faces)}',
                    (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                    0.8, (0, 255, 0), 2)
    
    cv2.imshow('Webcam Face Detection', frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
πŸ’‘ Tips untuk Hasil Terbaik

Parameter scaleFactor dan minNeighbors sangat mempengaruhi akurasi. scaleFactor 1.1 lebih akurat tapi lebih lambat, sedangkan 1.3 lebih cepat. minNeighbors yang lebih tinggi mengurangi false positive tapi bisa melewatkan wajah.

6. Contour Detection

Contour adalah kurva yang menghubungkan titik-titik kontinu yang memiliki warna atau intensitas yang sama. Contour sangat berguna untuk analisis bentuk objek, deteksi objek, dan pengenalan karakter.

Menemukan dan Menggambar Contour

Python β€” Contour Detection
import cv2
import numpy as np

# Baca gambar dan konversi
img = cv2.imread('objek.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Preprocessing: blur + threshold
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
_, thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)

# Temukan contour
# RETR_EXTERNAL: hanya contour terluar
# RETR_TREE: semua contour dengan hierarchy
# CHAIN_APPROX_SIMPLE: kompres titik contour
contours, hierarchy = cv2.findContours(
    thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE
)

print(f"Jumlah contour ditemukan: {len(contours)}")

# Gambar semua contour
img_contour = img.copy()
cv2.drawContours(img_contour, contours, -1, (0, 255, 0), 2)

# Analisis setiap contour
for i, cnt in enumerate(contours):
    # Hitung luas area
    area = cv2.contourArea(cnt)
    
    # Filter contour kecil (noise)
    if area < 100:
        continue
    
    # Hitung keliling
    perimeter = cv2.arcLength(cnt, closed=True)
    
    # Aproksimasi bentuk polygon
    epsilon = 0.02 * perimeter
    approx = cv2.approxPolyDP(cnt, epsilon, True)
    
    # Tentukan bentuk berdasarkan jumlah sudut
    vertices = len(approx)
    if vertices == 3:
        bentuk = "Segitiga"
    elif vertices == 4:
        # Cek apakah persegi atau persegi panjang
        (x, y, w, h) = cv2.boundingRect(approx)
        aspect_ratio = w / float(h)
        bentuk = "Persegi" if 0.95 <= aspect_ratio <= 1.05 else "Persegi Panjang"
    elif vertices == 5:
        bentuk = "Pentagon"
    elif vertices > 5:
        bentuk = "Lingkaran"
    else:
        bentuk = f"Polygon-{vertices}"
    
    # Gambar bounding box
    (x, y, w, h) = cv2.boundingRect(cnt)
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    cv2.putText(img, f'{bentuk}', (x, y-10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
    print(f"Contour {i}: Bentuk={bentuk}, Area={area:.0f}, "
          f"Keliling={perimeter:.0f}, Sudut={vertices}")

cv2.imshow('Contour Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. Object Tracking

Object tracking adalah proses melacak pergerakan objek dalam video dari frame ke frame. OpenCV menyediakan beberapa algoritma tracking yang bisa digunakan tergantung kebutuhan.

Color-based Tracking dengan HSV

Python β€” Object Tracking
import cv2
import numpy as np

# Tracking objek berdasarkan warna menggunakan HSV
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    # Konversi ke HSV color space
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    # Range warna biru dalam HSV
    lower_blue = np.array([100, 50, 50])
    upper_blue = np.array([130, 255, 255])
    
    # Buat mask
    mask = cv2.inRange(hsv, lower_blue, upper_blue)
    
    # Hilangkan noise dengan morphological operations
    kernel = np.ones((5, 5), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    
    # Temukan contour dari mask
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE,
                                    cv2.CHAIN_APPROX_SIMPLE)
    
    if contours:
        # Ambil contour terbesar
        largest = max(contours, key=cv2.contourArea)
        area = cv2.contourArea(largest)
        
        if area > 500:
            # Hitung centroid (pusat massa)
            M = cv2.moments(largest)
            if M["m00"] != 0:
                cx = int(M["m10"] / M["m00"])
                cy = int(M["m01"] / M["m00"])
                
                # Gambar lingkaran di centroid
                cv2.circle(frame, (cx, cy), 10, (0, 255, 0), -1)
                cv2.putText(frame, f'Posisi: ({cx}, {cy})',
                           (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                           0.8, (0, 255, 0), 2)
            
            # Gambar bounding box
            x, y, w, h = cv2.boundingRect(largest)
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
    
    cv2.imshow('Object Tracking', frame)
    cv2.imshow('Mask', mask)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Multi-Object Tracker

Python β€” Multi Tracker
import cv2
import numpy as np

# OpenCV Built-in Trackers
# KCS: Kurnia Continuation Sensitivity (paling akurat)
# CSRT: Discriminative Correlation Filter with Channel and Spatial Reliability
# MOSSE: Minimum Output Sum of Squared Error (paling cepat)

cap = cv2.VideoCapture('video.mp4')

# Baca frame pertama
ret, frame = cap.read()
if not ret:
    print("Gagal membaca video")
    exit()

# Pilih ROI (Region of Interest) secara interaktif
roi = cv2.selectROI("Pilih Objek", frame, showCrosshair=True)
cv2.destroyWindow("Pilih Objek")

# Buat tracker CSRT
tracker = cv2.TrackerCSRT.create()
tracker.init(frame, roi)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    # Update tracker
    success, bbox = tracker.update(frame)
    
    if success:
        # Tracking berhasil
        x, y, w, h = [int(v) for v in bbox]
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        cv2.putText(frame, "Tracking", (x, y-10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
    else:
        # Tracking gagal
        cv2.putText(frame, "Tracking Gagal!", (50, 50),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    
    cv2.imshow('Multi Tracker', frame)
    
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
πŸ“Š Perbandingan Tracker
TrackerKecepatanAkurasiCocok Untuk
CSRT🟑 Sedang🟒 TinggiObjek yang bergerak lambat
KCF🟒 Cepat🟑 SedangReal-time tracking
MOSSE🟒 Sangat Cepat🟑 SedangResource terbatas

8. Deteksi Warna

Deteksi warna adalah salah satu aplikasi paling sederhana namun powerful dalam Computer Vision. Dengan menggunakan color space HSV (Hue, Saturation, Value), kita bisa mendeteksi objek berdasarkan warnanya dengan lebih akurat dibanding RGB.

Python β€” Color Detection
import cv2
import numpy as np

# Fungsi untuk mendeteksi beberapa warna sekaligus
def detect_colors(frame):
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    # Definisi rentang warna dalam HSV
    color_ranges = {
        'Merah 1': (np.array([0, 70, 50]), np.array([10, 255, 255])),
        'Merah 2': (np.array([170, 70, 50]), np.array([180, 255, 255])),
        'Hijau':   (np.array([36, 50, 70]), np.array([89, 255, 255])),
        'Biru':    (np.array([100, 50, 50]), np.array([130, 255, 255])),
        'Kuning':  (np.array([20, 100, 100]), np.array([35, 255, 255])),
        'Orange':  (np.array([10, 100, 20]), np.array([20, 255, 255])),
    }
    
    results = {}
    
    for nama, (lower, upper) in color_ranges.items():
        mask = cv2.inRange(hsv, lower, upper)
        
        # Morphological operations untuk menghilangkan noise
        kernel = np.ones((5, 5), np.uint8)
        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
        mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
        
        contours, _ = cv2.findContours(mask, cv2.RETR_TREE,
                                        cv2.CHAIN_APPROX_SIMPLE)
        
        for cnt in contours:
            area = cv2.contourArea(cnt)
            if area > 1000:
                x, y, w, h = cv2.boundingRect(cnt)
                
                # Warna kotak berbeda untuk setiap warna terdeteksi
                colors_map = {
                    'Merah 1': (0, 0, 255), 'Merah 2': (0, 0, 255),
                    'Hijau': (0, 255, 0), 'Biru': (255, 0, 0),
                    'Kuning': (0, 255, 255), 'Orange': (0, 165, 255),
                }
                
                color = colors_map.get(nama, (255, 255, 255))
                label = nama.replace(' 1', '').replace(' 2', '')
                
                cv2.rectangle(frame, (x, y), (x+w, y+h), color, 2)
                cv2.putText(frame, label, (x, y-10),
                           cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)
                results[label] = (x, y, w, h)
    
    return frame, results

# Jalankan dari webcam
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    result_frame, detections = detect_colors(frame)
    
    # Tampilkan jumlah objek terdeteksi
    cv2.putText(result_frame, f'Objek: {len(detections)}',
                (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                0.8, (255, 255, 255), 2)
    
    cv2.imshow('Color Detection', result_frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
⚠️ Catatan HSV

Nilai HSV di OpenCV berbeda dari yang umum di dokumentasi warna: Hue (0-179), Saturation (0-255), Value (0-255). Jika menggunakan tool online untuk mencari rentang HSV, pastikan untuk menyesuaikan skala H-nya.

9. Quiz: Uji Pemahamanmu!

Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Computer Vision dan OpenCV:

Pertanyaan 1: Format warna default yang digunakan OpenCV saat membaca gambar adalah?

a) RGB
b) BGR
c) HSV
d) RGBA

Pertanyaan 2: Fungsi mana yang digunakan untuk deteksi tepi (edge detection) yang paling populer di OpenCV?

a) cv2.blur()
b) cv2.threshold()
c) cv2.Canny()
d) cv2.cvtColor()

Pertanyaan 3: Apa fungsi dari parameter scaleFactor pada detectMultiScale() Haar Cascade?

a) Menentukan ukuran minimum wajah
b) Menentukan seberapa banyak gambar dikecilkan pada setiap skala
c) Menentukan jumlah frame per detik
d) Menentukan warna kotak deteksi

Pertanyaan 4: Color space apa yang paling cocok untuk deteksi warna objek karena tahan terhadap perubahan pencahayaan?

a) RGB
b) Grayscale
c) HSV
d) Binary

Pertanyaan 5: Morphological operation apa yang digunakan untuk menghilangkan noise kecil dari gambar biner?

a) Dilation
b) Erosion
c) Opening (Erosion + Dilation)
d) Closing (Dilation + Erosion)
πŸ” Zoom
100%
🎨 Tema