Tài nguyên

Cheat sheet OpenCV-Python: các hàm dùng nhiều nhất

Trang tra cứu nhanh đọc ghi ảnh, màu sắc, lọc, phân ngưỡng, contour, đo đạc, so khớp mẫu, vẽ kết quả và 5 lỗi hay gặp.

Cheat sheet OpenCV-Python: các hàm dùng nhiều nhất
Nội dung bài viết
  1. Đọc, ghi, hiển thị
  2. Màu sắc và kích thước
  3. Lọc và làm mờ
  4. Phân ngưỡng và hình thái học
  5. Cạnh, contour và đo đạc
  6. So khớp mẫu và hình học
  7. Vẽ kết quả
  8. 5 lỗi hay gặp

Trang tra cứu nhanh các hàm OpenCV-Python dùng nhiều nhất trong xử lý ảnh và Machine Vision. Lưu lại để dùng khi viết code. Mọi ví dụ giả định đã có import cv2 và import numpy as np.

Đọc, ghi, hiển thị

Việc cần làmCode
Đọc ảnh màu / xámcv2.imread(p) / cv2.imread(p, cv2.IMREAD_GRAYSCALE)
Đọc đường dẫn có dấu (Windows)cv2.imdecode(np.fromfile(p, np.uint8), cv2.IMREAD_COLOR)
Ghi ảnhcv2.imwrite("out.png", img)
Hiển thịcv2.imshow("win", img); cv2.waitKey(0)
Mở camera / videocap = cv2.VideoCapture(0); ok, frame = cap.read()

Màu sắc và kích thước

Việc cần làmCode
BGR → xám / HSV / RGBcv2.cvtColor(img, cv2.COLOR_BGR2GRAY) (…2HSV, …2RGB)
Lọc dải màucv2.inRange(hsv, lower, upper)
Đổi kích thướccv2.resize(img, (w, h), interpolation=cv2.INTER_AREA)
Cắt ROIroi = img[y:y+h, x:x+w]
Xoay 90°cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
Lậtcv2.flip(img, 1) (1 ngang, 0 dọc)

Lọc và làm mờ

Việc cần làmCode
Gaussian blurcv2.GaussianBlur(img, (5, 5), 0)
Median (nhiễu muối tiêu)cv2.medianBlur(img, 5)
Giữ biên khi làm mịncv2.bilateralFilter(img, 9, 75, 75)
Cân bằng histogram cục bộcv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)).apply(gray)

Phân ngưỡng và hình thái học

Việc cần làmCode
Ngưỡng cố định_, th = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
Otsut, th = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
Thích nghicv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 5)
Kernelk = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
Co / giãncv2.erode(th, k) / cv2.dilate(th, k)
Mở (xóa đốm) / đóng (lấp lỗ)cv2.morphologyEx(th, cv2.MORPH_OPEN, k) / cv2.MORPH_CLOSE

Cạnh, contour và đo đạc

Việc cần làmCode
Phát hiện cạnh Cannycv2.Canny(gray, 50, 150)
Tìm contourcnts, hier = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Diện tích / chu vicv2.contourArea(c) / cv2.arcLength(c, True)
Khung bao thẳng / xoaycv2.boundingRect(c) / cv2.minAreaRect(c)
Đường tròn bao nhỏ nhất(x, y), r = cv2.minEnclosingCircle(c)
TâmM = cv2.moments(c); cx = M["m10"] / M["m00"]
Bao lồicv2.convexHull(c)
Xấp xỉ đa giáccv2.approxPolyDP(c, 0.02 * cv2.arcLength(c, True), True)
Đánh nhãn vùng liền khốin, labels, stats, cents = cv2.connectedComponentsWithStats(th)
Tìm đường tròncv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 20, param1=100, param2=30)

So khớp mẫu và hình học

Việc cần làmCode
Template matchingres = cv2.matchTemplate(gray, tpl, cv2.TM_CCOEFF_NORMED); _, score, _, loc = cv2.minMaxLoc(res)
Xoay/dịch ảnhM = cv2.getRotationMatrix2D(center, angle, 1.0); cv2.warpAffine(img, M, (w, h))
Biến đổi phối cảnhH = cv2.getPerspectiveTransform(src4, dst4); cv2.warpPerspective(img, H, (w, h))
Khử méo ống kínhcv2.undistort(img, K, dist)
Đọc mã QRtext, pts, _ = cv2.QRCodeDetector().detectAndDecode(img)

Vẽ kết quả

Việc cần làmCode
Hình chữ nhật / tròn / đườngcv2.rectangle(img, p1, p2, (0, 255, 0), 2), cv2.circle, cv2.line
Vẽ contourcv2.drawContours(img, cnts, -1, (0, 0, 255), 2)
Chữcv2.putText(img, "OK", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

5 lỗi hay gặp

  1. imread trả về None mà không báo lỗi: luôn kiểm tra.
  2. Nhầm thứ tự BGR và RGB khi hiển thị bằng matplotlib.
  3. Nhầm img[y, x] với (x, y) trong hàm vẽ.
  4. Cộng trừ ảnh uint8 bị tràn số: dùng cv2.add/cv2.subtract hoặc đổi kiểu dữ liệu.
  5. findContours cần ảnh nhị phân 8 bit một kênh, vật màu trắng trên nền đen.

Tài liệu đầy đủ: docs.opencv.org. Xem thêm bài cách tra cứu tài liệu hiệu quả.

Ban biên tập HọcFree

Chúng tôi viết những bài hướng dẫn dễ hiểu, thực tế để ai cũng có thể tự học lập trình và ngoại ngữ, hoàn toàn miễn phí.