本文档说明
在摄像头实时画面上应用基础图像处理算法:灰度转换、高斯模糊、边缘检测、颜色空间转换,并将多种效果同时显示在屏幕上。
前置准备
bash
source ~/opencv-env/bin/activate1
灰度转换
将彩色图像转为灰度图,是很多算法的第一步:
python
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)1
高斯模糊
平滑图像,去除噪声:
python
blur = cv2.GaussianBlur(frame, (15, 15), 0)1
(15, 15) 是核大小,数值越大越模糊(必须为奇数)。
Canny 边缘检测
检测图像中的边缘轮廓:
python
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)1
2
2
参数 50 和 150 是低/高阈值,控制边缘灵敏度。
HSV 颜色空间
将 BGR 转为 HSV,便于颜色检测:
python
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)1
四合一实时显示
将四种处理效果同时显示在一个窗口中:
python
import cv2
import numpy as np
import os
os.environ.setdefault('DISPLAY', ':0')
DEVICE_INDEX = 73
def main():
cap = cv2.VideoCapture(DEVICE_INDEX)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
if not cap.isOpened():
print("Error: Cannot open camera")
return
win = "Image Processing"
cv2.namedWindow(win, cv2.WINDOW_NORMAL)
cv2.setWindowProperty(win, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
print("Press 'q' to quit")
while True:
ret, frame = cap.read()
if not ret:
break
h, w = frame.shape[:2]
# 四种处理
original = frame.copy()
blur = cv2.GaussianBlur(frame, (15, 15), 0)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)
# 转回 BGR 以便拼接
gray_bgr = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
edges_bgr = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)
# 添加标签
cv2.putText(original, "Original", (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(blur, "Gaussian Blur", (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(gray_bgr, "Grayscale", (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(edges_bgr, "Canny Edges", (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# 2x2 拼接
top = np.hstack([original, blur])
bottom = np.hstack([gray_bgr, edges_bgr])
combined = np.vstack([top, bottom])
cv2.imshow(win, combined)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
运行:
bash
DISPLAY=:0 ~/opencv-env/bin/python3 image_processing.py1
实测性能
640×480 四合一显示:26.2fps,流畅无卡顿。
常用图像处理函数
| 函数 | 作用 | 示例 |
|---|---|---|
cv2.cvtColor() | 颜色空间转换 | cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) |
cv2.GaussianBlur() | 高斯模糊 | cv2.GaussianBlur(frame, (5,5), 0) |
cv2.Canny() | 边缘检测 | cv2.Canny(gray, 50, 150) |
cv2.threshold() | 二值化 | cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) |
cv2.resize() | 缩放 | cv2.resize(frame, (320, 240)) |
cv2.flip() | 翻转 | cv2.flip(frame, 1) 水平翻转 |
cv2.rectangle() | 画矩形 | cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2) |
np.hstack() | 水平拼接 | np.hstack([img1, img2]) |
np.vstack() | 垂直拼接 | np.vstack([top, bottom]) |