接上篇,本文將繼續分享OpenCV實用技巧,涵蓋圖像處理、目標檢測、3D視覺等進階領域!
六、圖像變換進階
17. 圖像金字塔
# 高斯金字塔下采樣
smaller = cv2.pyrDown(img)# 高斯金字塔上采樣
larger = cv2.pyrUp(img)
用于多尺度圖像處理,構建圖像金字塔
18. 極坐標變換
polar = cv2.warpPolar(img, (300,300), (w//2, h//2), radius, cv2.WARP_POLAR_LINEAR
)
實現直角坐標系與極坐標系轉換
19. 非均勻縮放
M = np.float32([[1, 0.5, 0], [0, 1, 0]])
sheared = cv2.warpAffine(img, M, (int(w*1.5), h))
實現圖像剪切變形效果
20. 網格扭曲效果
map_x = np.zeros(img.shape[:2], np.float32)
map_y = np.zeros(img.shape[:2], np.float32)
# 創建網格扭曲映射...
distorted = cv2.remap(img, map_x, map_y, cv2.INTER_LINEAR)
實現自定義的網格變形效果
七、形態學操作大全
21. 膨脹操作
kernel = np.ones((5,5), np.uint8)
dilated = cv2.dilate(img, kernel)
擴大亮區域,連接斷裂對象
22. 腐蝕操作
eroded = cv2.erode(img, kernel)
縮小亮區域,去除小噪點
23. 開運算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
先腐蝕后膨脹,去除小物體
24. 閉運算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
先膨脹后腐蝕,填充小孔洞
25. 形態學梯度
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
獲取物體輪廓邊緣
26. 頂帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
提取亮色小特征(如白紙黑字)
27. 黑帽操作
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
提取暗色小特征(如黑底白點)
八、圖像濾波與增強
28. 雙邊濾波
bilateral = cv2.bilateralFilter(img, 9, 75, 75)
保持邊緣銳利的同時降噪
29. 自定義濾波核
kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]])
sharpened = cv2.filter2D(img, -1, kernel)
創建銳化濾波核增強細節
30. 導向濾波
# 使用PyTorch實現導向濾波更佳
# 偽代碼:guided_filter = guideFilter(guide, img, radius, eps)
保持邊緣的先進濾波技術
31. 非局部均值去噪
denoised = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
高效去除高斯噪聲
32. 拉普拉斯銳化
laplacian = cv2.Laplacian(img, cv2.CV_64F)
sharp = cv2.convertScaleAbs(laplacian)
增強圖像邊緣和細節
九、視頻處理技巧
33. 視頻幀讀取
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():ret, frame = cap.read()if not ret: break# 處理幀
cap.release()
34. 視頻寫入
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
out.write(processed_frame)
out.release()
35. 幀差分法
prev_frame = None
while True:ret, frame = cap.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)if prev_frame is not None:diff = cv2.absdiff(gray, prev_frame)_, motion = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)prev_frame = gray
檢測視頻中的運動區域
36. 背景建模
bg_subtractor = cv2.createBackgroundSubtractorMOG2()
fg_mask = bg_subtractor.apply(frame)
分離前景運動物體
十、3D視覺與相機標定
37. 棋盤格角點檢測
pattern_size = (9, 6)
ret, corners = cv2.findChessboardCorners(gray, pattern_size)
if ret:cv2.drawChessboardCorners(img, pattern_size, corners, ret)
相機標定的關鍵步驟
38. 相機標定
# 準備標定數據
obj_points = [] # 3D點
img_points = [] # 2D點# 執行標定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None
)
39. 畸變校正
undistorted = cv2.undistort(img, mtx, dist)
40. 距離測量
# 已知物體大小和焦距
focal_length = 500 # 相機焦距(像素)
known_width = 20.0 # 物體實際寬度(cm)
pixel_width = 150 # 圖像中的物體寬度(像素)
distance = (known_width * focal_length) / pixel_width
單目視覺距離測量
十一、目標檢測進階
41. HOG行人檢測
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
rects, weights = hog.detectMultiScale(frame, winStride=(4,4), padding=(8,8), scale=1.05)
42. YOLO目標檢測
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
blob = cv2.dnn.blobFromImage(img, 1/255, (416,416), swapRB=True, crop=False)
net.setInput(blob)
outputs = net.forward(net.getUnconnectedOutLayersNames())
43. 二維碼檢測
detector = cv2.QRCodeDetector()
data, points, _ = detector.detectAndDecode(img)
if points is not None:points = points[0].astype(int)cv2.polylines(img, [points], True, (0,255,0), 3)
十二、圖像分析與測量
44. 輪廓近似
epsilon = 0.01 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
cv2.drawContours(img, [approx], 0, (0,255,0), 2)
45. 最小外接矩形
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img, [box], 0, (0,0,255), 2)
46. 最小外接圓
(x,y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
cv2.circle(img, center, radius, (255,0,0), 2)
47. 橢圓擬合
if len(cnt) >= 5:ellipse = cv2.fitEllipse(cnt)cv2.ellipse(img, ellipse, (0,255,0), 2)
十三、高級處理技巧
48. 圖像修復
damaged = img.copy()
mask = np.zeros(img.shape[:2], np.uint8)
# 創建受損區域...
restored = cv2.inpaint(damaged, mask, 3, cv2.INPAINT_TELEA)
49. 高動態范圍成像
# 準備不同曝光度的圖像
images = [img1, img2, img3]
times = [0.5, 1.0, 2.0] # 曝光時間# 合并HDR圖像
calibrate = cv2.createCalibrateDebevec()
response = calibrate.process(images, times)
merge = cv2.createMergeDebevec()
hdr = merge.process(images, times, response)
50. 圖像拼接
stitcher = cv2.Stitcher_create()
status, panorama = stitcher.stitch([img1, img2])
if status == cv2.Stitcher_OK:cv2.imshow('Panorama', panorama)
十四、實用工具集錦(51-100)
分類 | 示例代碼 | 功能描述 |
---|---|---|
?繪圖? | cv2.line(img, pt1, pt2, (0,0,255), 3) | 繪制直線 |
?繪圖? | cv2.arrowedLine(img, pt1, pt2, (0,255,0), 2) | 繪制箭頭 |
?繪圖? | cv2.ellipse(img, center, axes, 0,0,360, (255,0,0), 2) | 繪制橢圓 |
?計算? | dist = cv2.norm(pt1, pt2) | 計算兩點距離 |
?計算? | angle = cv2.fastAtan2(dy, dx) | 計算角度 |
?變換? | log_trans = cv2.log(1 + img.astype(np.float32)) | 對數變換 |
?分割? | markers = cv2.watershed(img, markers) | 分水嶺分割 |
?分割? | ret, markers = cv2.connectedComponents(binary) | 連通域分析 |
?光流? | next_pts, status, err = cv2.calcOpticalFlowPyrLK(prev_gray, gray, prev_pts, None) | LK光流法 |
?跟蹤? | tracker = cv2.TrackerKCF_create() | KCF跟蹤器 |
?顯示? | cv2.displayStatusBar("Window", "Processing...", 1000) | 狀態欄顯示 |
?顯示? | cv2.putText(img, "FPS: " + str(fps), (10,30), font, 1, (0,0,255), 2) | 顯示FPS |
?優化? | img_roi = cv2.UMat(img_roi) | 使用UMat加速 |
?文件? | fs = cv2.FileStorage("data.yml", cv2.FILE_STORAGE_WRITE) | YML文件存取 |
?卷積? | filtered = cv2.filter2D(img, -1, kernel) | 自定義卷積 |
?統計? | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(gray) | 極值查找 |
?特征? | orb = cv2.ORB_create(nfeatures=500) | ORB特征點 |
?匹配? | matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) | 特征匹配 |
?顏色? | lab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab) | 轉換到Lab |
?顏色? | mean_color = cv2.mean(img, mask) | 計算均值 |
?二值? | thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2) | 自適應閾值 |
?形態? | thinned = cv2.ximgproc.thinning(binary) | 細化操作 |
?積分? | integral = cv2.integral(img) | 積分圖像 |
?距離? | dist_transform = cv2.distanceTransform(binary, cv2.DIST_L2, 3) | 距離變換 |
完整100例速查表
類別 | 數量 | 代表功能 |
---|---|---|
基礎操作 | 12項 | 讀寫、轉換、裁剪、旋轉 |
增強處理 | 18項 | 濾波、降噪、邊緣檢測 |
特征分析 | 16項 | 角點、輪廓、特征點 |
目標檢測 | 10項 | 人臉、行人、二維碼 |
3D視覺 | 8項 | 標定、畸變校正、測距 |
視頻處理 | 8項 | 讀寫、運動檢測、跟蹤 |
圖像變換 | 10項 | 仿射、透視、極坐標 |
實用工具 | 18項 | 繪圖、計算、文件操作 |
?關注我們并獲取更多【OpenCV100】獲取更多示例