OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库,而 OpenCV-Python 是 OpenCV 的 Python 接口。
1. 安装 OpenCV-Python #
pip install opencv-python # 基础模块
pip install opencv-contrib-python # 包含额外贡献模块的完整版2. 基本图像操作 #
读取和显示图像 #
import cv2
# 读取图像
img = cv2.imread('image.jpg') # 返回 NumPy 数组
# 显示图像
cv2.imshow('Image Window', img)
cv2.waitKey(0) # 等待任意按键
cv2.destroyAllWindows() # 关闭所有窗口
# 保存图像
cv2.imwrite('output.jpg', img)图像属性 #
print(type(img)) # <class 'numpy.ndarray'>
print(img.shape) # (高度, 宽度, 通道数)
print(img.size) # 像素总数
print(img.dtype) # 数据类型3. 图像处理基础 #
颜色空间转换 #
# BGR 转灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# BGR 转 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)图像阈值处理 #
# 简单阈值
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 自适应阈值
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)图像滤波 #
# 高斯模糊
blur = cv2.GaussianBlur(img, (5,5), 0)
# 中值滤波
median = cv2.medianBlur(img, 5)
# 双边滤波(保边去噪)
blur = cv2.bilateralFilter(img, 9, 75, 75)4. 图像几何变换 #
缩放 #
resized = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)旋转 #
(h, w) = img.shape[:2]
center = (w//2, h//2)
M = cv2.getRotationMatrix2D(center, 45, 1.0) # 旋转45度
rotated = cv2.warpAffine(img, M, (w, h))仿射变换 #
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols,rows))5. 边缘检测和特征提取 #
Canny 边缘检测 #
edges = cv2.Canny(img, 100, 200) # 最小阈值100,最大阈值200轮廓检测 #
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,255,0), 3)特征点检测 #
# SIFT 特征点
sift = cv2.SIFT_create()
keypoints = sift.detect(gray, None)
img_kp = cv2.drawKeypoints(img, keypoints, None)
# ORB 特征点
orb = cv2.ORB_create()
keypoints = orb.detect(img, None)
keypoints, descriptors = orb.compute(img, keypoints)6. 视频处理 #
读取视频 #
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 处理帧
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()保存视频 #
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
out.write(frame)
out.release()7. 人脸检测示例 #
# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 绘制矩形框
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)8. 实用技巧 #
图像混合 #
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)绘制图形和文字 #
# 绘制直线
cv2.line(img, (0,0), (511,511), (255,0,0), 5)
# 绘制矩形
cv2.rectangle(img, (384,0), (510,128), (0,255,0), 3)
# 绘制圆形
cv2.circle(img, (447,63), 63, (0,0,255), -1)
# 添加文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV', (10,500), font, 4, (255,255,255), 2, cv2.LINE_AA)鼠标事件处理 #
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)9. 性能优化 #
计算代码执行时间 #
e1 = cv2.getTickCount()
# 你的代码
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()使用 GPU 加速 #
# 检查是否有可用的 CUDA
print(cv2.cuda.getCudaEnabledDeviceCount())
# 将图像上传到 GPU
gpu_img = cv2.cuda_GpuMat()
gpu_img.upload(img)
# 在 GPU 上处理
gpu_gray = cv2.cuda.cvtColor(gpu_img, cv2.COLOR_BGR2GRAY)
# 下载回 CPU
gray = gpu_gray.download()10. 实际应用案例 #
二维码检测 #
detector = cv2.QRCodeDetector()
data, bbox, straight_qrcode = detector.detectAndDecode(img)
if bbox is not None:
print(f"QR Code data: {data}")图像拼接(全景图) #
stitcher = cv2.Stitcher_create()
status, panorama = stitcher.stitch([img1, img2, img3])
if status == cv2.Stitcher_OK:
cv2.imshow('Panorama', panorama)OpenCV-Python 是一个功能强大的计算机视觉库,广泛应用于图像处理、视频分析、机器学习、增强现实等领域。通过 Python 接口,开发者可以方便地利用 OpenCV 的强大功能进行快速原型开发。