第3章:OpenCV入门实战:安装配置与核心操作
说实话,每次带新人入门计算机视觉,我都是从OpenCV开始的。为什么?因为它是这个领域最趁手的工具,没有之一。我自己从OpenCV 2.4版本用到现在,踩过的坑比走过的路还多。今天咱们就把OpenCV的安装、图像读写、视频处理、鼠标交互这些基本功,一次性讲透。
3.1 OpenCV安装与配置
安装OpenCV其实很简单,但很多人一开始就卡在这里。我建议你用pip直接装,省心。
# 安装OpenCV主库
pip install opencv-python
# 如果需要额外模块(比如特征匹配、人脸识别等)
pip install opencv-contrib-python
# 验证安装
python -c "import cv2; print(cv2.__version__)"
嗯,这里要注意版本问题。我个人习惯用4.5.x以上的版本,因为API更稳定,新特性也多。如果你用的是老版本,有些函数可能不兼容。
3.2 图像读写:从文件到内存
图像读写是OpenCV最基础的操作。说白了,就是把硬盘上的图片读到内存里,处理完再存回去。
import cv2
# 读取图像
img = cv2.imread('road.jpg')
# 检查是否读取成功
if img is None:
print("图片没找到,检查路径!")
else:
print(f"图像尺寸:{img.shape}")
# 显示图像
cv2.imshow('Road Image', img)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite('output.jpg', img)
你想想看,为什么读取失败?最常见的原因就是路径不对。我建议你始终用绝对路径,或者用os.path.join来拼接路径,避免踩坑。
3.3 视频流处理:摄像头与视频文件
视频处理在自动驾驶里太重要了。车道线检测、车辆跟踪,本质上都是处理视频流。OpenCV用VideoCapture类搞定一切。
import cv2
# 打开摄像头(0表示默认摄像头)
cap = cv2.VideoCapture(0)
# 或者打开视频文件
# cap = cv2.VideoCapture('road_video.mp4')
while True:
ret, frame = cap.read()
if not ret:
print("视频读取结束")
break
# 显示每一帧
cv2.imshow('Video Stream', frame)
# 按q键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
我在项目中遇到过一个问题:摄像头打开失败。后来发现是权限问题。Linux下要加sudo,Windows下要检查摄像头驱动。嗯,这些小细节往往最折磨人。
3.4 鼠标回调与ROI选择
鼠标回调是交互式图像处理的利器。比如你想手动框选车道线区域,或者标注感兴趣的区域(ROI),鼠标回调就能派上用场。
import cv2
# 全局变量
drawing = False
ix, iy = -1, -1
roi = None
def draw_rectangle(event, x, y, flags, param):
global ix, iy, drawing, roi, img_copy
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
img_copy = img.copy()
cv2.rectangle(img_copy, (ix, iy), (x, y), (0, 255, 0), 2)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 2)
roi = img[iy:y, ix:x]
print(f"ROI区域:({ix},{iy}) 到 ({x},{y})")
# 读取图像
img = cv2.imread('road.jpg')
img_copy = img.copy()
cv2.namedWindow('Select ROI')
cv2.setMouseCallback('Select ROI', draw_rectangle)
while True:
cv2.imshow('Select ROI', img_copy)
key = cv2.waitKey(1) & 0xFF
if key == ord('r'): # 按r重置
img_copy = img.copy()
roi = None
print("已重置")
elif key == ord('s') and roi is not None: # 按s保存ROI
cv2.imwrite('roi.jpg', roi)
print("ROI已保存")
elif key == ord('q'): # 按q退出
break
cv2.destroyAllWindows()
为什么会用到ROI选择?在车道线检测中,我们通常只关注车辆前方的梯形区域,而不是整张图。手动框选ROI,可以大幅减少计算量,提高检测速度。
3.5 本章知识体系
下面这张图帮你理清本章的核心逻辑:从安装配置到四大核心操作,每一步都是后续课程的基础。
3.6 实战小练习
光看不练假把式。我建议你动手做这个小练习:
- 打开摄像头,实时显示视频流
- 用鼠标框选一个ROI区域
- 只显示ROI区域内的画面
- 按s键保存当前ROI图像
这个练习涵盖了本章所有知识点。我在带新人时,这个练习能筛掉一半人——不是代码写不出来,而是细节处理不到位。比如忘记释放摄像头资源,或者鼠标回调函数写错了参数顺序。
好了,这一章的内容就到这里。OpenCV的安装配置、图像读写、视频流处理、鼠标回调与ROI选择,这些基本功练扎实了,后面车道线检测的实战才能游刃有余。