第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更稳定,新特性也多。如果你用的是老版本,有些函数可能不兼容。

避坑指南:我曾经在Ubuntu上装OpenCV,直接apt-get install,结果装了个3.2的老版本,很多新函数用不了。后来全部换成pip安装,再没出过问题。

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来拼接路径,避免踩坑。

小技巧:OpenCV默认用BGR顺序,不是RGB。如果你用matplotlib显示,记得转换:img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

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,可以大幅减少计算量,提高检测速度。

经验之谈:我曾经在高速场景下做车道线检测,整张图处理太慢。后来用鼠标回调框选ROI,只处理感兴趣区域,帧率从15fps提升到了30fps。效果立竿见影。

3.5 本章知识体系

下面这张图帮你理清本章的核心逻辑:从安装配置到四大核心操作,每一步都是后续课程的基础。

第3章:OpenCV入门实战知识体系 OpenCV入门实战 安装与配置 pip install opencv-python 版本选择:4.5.x+ 验证:cv2.__version__ 图像读写 cv2.imread() 读取 cv2.imshow() 显示 cv2.imwrite() 保存 BGR vs RGB 转换 视频流处理 VideoCapture 打开 逐帧读取 frame 摄像头/视频文件 释放资源 release() 鼠标回调与ROI setMouseCallback() 鼠标事件处理 ROI区域提取 交互式标注 核心思想:图像处理 → 逐帧处理 → ROI优化 为后续车道线检测、目标跟踪打下基础

3.6 实战小练习

光看不练假把式。我建议你动手做这个小练习:

  1. 打开摄像头,实时显示视频流
  2. 用鼠标框选一个ROI区域
  3. 只显示ROI区域内的画面
  4. 按s键保存当前ROI图像

这个练习涵盖了本章所有知识点。我在带新人时,这个练习能筛掉一半人——不是代码写不出来,而是细节处理不到位。比如忘记释放摄像头资源,或者鼠标回调函数写错了参数顺序。

记住:OpenCV的坑大多在细节上。路径、颜色顺序、资源释放、事件回调参数——这些地方多花点心思,后面会省很多时间。

好了,这一章的内容就到这里。OpenCV的安装配置、图像读写、视频流处理、鼠标回调与ROI选择,这些基本功练扎实了,后面车道线检测的实战才能游刃有余。

可可精品资料库