OpenCV 安装与配置
在 Python 环境中安装 OpenCV 使用以下命令:
pip install opencv-python
如果需要额外的模块(如 contrib 包),可以安装:
pip install opencv-contrib-python
验证安装是否成功:
import cv2
print(cv2.__version__)
图像读取与显示
使用 cv2.imread() 读取图像文件,支持格式包括 JPEG、PNG、TIFF 等。示例代码:
import cv2
image = cv2.imread('example.jpg', cv2.IMREAD_COLOR)
cv2.imshow('Image Window', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
参数 cv2.IMREAD_COLOR 表示以 BGR 格式加载彩色图像,其他常用参数包括:
cv2.IMREAD_GRAYSCALE:灰度模式cv2.IMREAD_UNCHANGED:保留 Alpha 通道
图像基本操作
颜色空间转换
BGR 转灰度:
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
BGR 转 HSV:
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
图像缩放
使用 cv2.resize() 调整尺寸:
resized = cv2.resize(image, (width, height), interpolation=cv2.INTER_LINEAR)
插值方法包括:
cv2.INTER_NEAREST:最近邻cv2.INTER_CUBIC:三次样条
图像滤波与增强
高斯模糊
平滑图像以减少噪声:
blurred = cv2.GaussianBlur(image, (5, 5), 0)
参数 (5, 5) 是核大小,0 表示自动计算标准差。
边缘检测
Canny 边缘检测:
edges = cv2.Canny(image, threshold1=50, threshold2=150)
阈值范围影响边缘的敏感度。
特征检测与匹配
关键点检测
使用 SIFT 算法(需 OpenCV contrib):
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(gray_image, None)
特征匹配
暴力匹配器示例:
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)
matched_image = cv2.drawMatches(img1, kp1, img2, kp2, matches, None)
目标检测实战
Haar 级联分类器
人脸检测示例:
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5)
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
YOLO 模型
加载预训练模型进行实时检测:
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
视频处理
读取视频流
从摄像头捕获:
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
cv2.imshow('Frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
保存视频
设置编解码器并写入帧:
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
out.write(frame)
out.release()
9万+

被折叠的 条评论
为什么被折叠?



