OpenCV
OpenCV là thư viện mã nguồn mở gồm hơn 2.500 thuật toán xử lý ảnh và thị giác máy tính. Tìm hiểu chức năng, cách kết hợp với deep learning và mã nguồn.
OpenCV (Thư viện Thị giác Máy tính Mã nguồn Mở) là một thư viện mã nguồn mở gồm hơn 2.500 thuật toán được tối ưu hóa cho xử lý ảnh và thị giác máy tính (CV). Thư viện đọc và ghi ảnh, video, thu nhận luồng camera, lọc và biến đổi pixel, phát hiện và đối sánh đặc trưng, hiệu chỉnh camera và chạy mạng neural đã huấn luyện. OpenCV bắt đầu tại Intel Research năm 1999, được viết bằng C++ với các binding cho Python và Java, và được phân phối theo giấy phép Apache 2.0 kể từ phiên bản 4.5.0. Trong Python, thư viện được cài bằng pip install opencv-python và import dưới tên cv2; mọi ảnh đều được biểu diễn dưới dạng mảng NumPy.
OpenCV làm được gì#
- I/O ảnh và video: đọc và ghi các định dạng ảnh phổ biến, giải mã file video, thu nhận khung hình từ camera và luồng mạng.
- Xử lý ảnh: thay đổi kích thước, chuyển đổi không gian màu, làm mờ, làm nét, đặt ngưỡng và các phép toán hình thái học; đây là những bước tiền xử lý tiêu chuẩn trước khi ảnh được đưa vào model.
- Phát hiện và đối sánh đặc trưng: Các bộ phát hiện góc và keypoint như SIFT và ORB tìm các điểm đặc trưng để đối sánh giữa nhiều ảnh, phục vụ ghép ảnh panorama, định vị đối tượng và SLAM trực quan. SIFT được đưa vào thư viện chính ở phiên bản 4.4.0 sau khi bằng sáng chế hết hạn.
- Hình học camera: hiệu chỉnh loại bỏ biến dạng ống kính, homography hiệu chỉnh phối cảnh, còn đối sánh stereo khôi phục độ sâu từ hai camera để phục vụ robot và tái tạo 3D.
- Phân tích video: trừ nền tách các đối tượng chuyển động khỏi cảnh tĩnh, còn optical flow đo cách pixel dịch chuyển giữa các khung hình.
- Suy luận mạng neural sâu: module
dnntải model đã huấn luyện, chẳng hạn model ở định dạng ONNX, và chạy model trên CPU hoặc GPU mà không cần cài framework deep learning.
Pipeline cổ điển này tìm đường viền của các hình trong ảnh mà không cần model đã học:
import urllib.request
import cv2
import numpy as np
# Download a sample image and decode it into a BGR NumPy array
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)
# Classical pipeline: grayscale, blur to suppress noise, then Canny edge detection
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
# Trace connected edge pixels into contours, the outlines of shapes in the scene
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f"Image shape: {image.shape}, contours found: {len(contours)}")Lệnh này in ra Image shape: (1080, 810, 3), contours found: 1449: ảnh kích thước 1080×810 có ba kênh màu và 1.449 đường viền riêng biệt được dò theo các cạnh của ảnh. OpenCV lưu kênh màu theo thứ tự xanh dương-xanh lá-đỏ (BGR), vì vậy trước tiên cần chuyển đổi bằng cv2.cvtColor khi đưa ảnh vào thư viện yêu cầu RGB.
OpenCV và framework deep learning#
OpenCV và các framework deep learning như PyTorch và TensorFlow đảm nhiệm các giai đoạn khác nhau trong cùng một pipeline. OpenCV xử lý tiền xử lý dữ liệu và đầu ra quanh mạng: lấy khung hình, đổi kích thước, vẽ kết quả và ghi video đầu ra; framework huấn luyện và chạy mạng neural tích chập ở giữa. Một ứng dụng video thời gian thực lặp lại các bước này cho từng khung hình:
Ultralytics YOLO26 nhận trực tiếp các khung hình NumPy BGR của OpenCV, còn results[0].plot() trả về khung hình đã chú thích theo cùng định dạng, nên có thể đưa model vào vòng lặp OpenCV mà không cần chuyển đổi. Ví dụ này chạy một lượt vòng lặp trên ảnh mẫu đi kèm gói ultralytics:
import cv2
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# OpenCV tải ảnh mẫu đi kèm dưới dạng mảng NumPy BGR
frame = cv2.imread(str(ASSETS / "bus.jpg"))
# YOLO26 nhận trực tiếp khung hình OpenCV
model = YOLO("yolo26n.pt")
results = model(frame)
# plot() trả về mảng BGR đã chú thích mà OpenCV có thể hiển thị hoặc lưu
annotated = results[0].plot()
cv2.imwrite("bus_annotated.jpg", annotated)Bên trong vòng lặp video, ba lệnh gọi tương tự được thực hiện trên từng khung hình từ cv2.VideoCapture, còn cv2.imshow hoặc cv2.VideoWriter thay thế cho cv2.imwrite.










