OpenCV 基础操作实战指南:从图像处理到交互控制

发布于:2025-08-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

OpenCV(Open Source Computer Vision Library)是一个强大的计算机视觉库,广泛应用于图像处理、视频分析等领域。本文将通过实战代码解析,带你掌握 OpenCV 的核心基础操作,包括图像读写、视频处理、图形绘制、鼠标交互和轨迹栏控制等关键技能。

一、图像基本操作:读取、显示与保存

图像操作是 OpenCV 的基础,以下代码展示了如何读取灰度图像、显示图像,并通过按键交互实现窗口关闭和图像保存功能。

import cv2
import numpy as np

# 读取图像,0表示以灰度模式读取
img = cv2.imread("1.jpg", 0)
# 显示图像,第一个参数是窗口名称,第二个是图像数据
cv2.imshow('test', img)
# 等待按键输入,0表示无限等待
key = cv2.waitKey(0)

# 按键判断(注意:waitKey返回ASCII码,需用ord()转换)
if key == ord('q'):  # 按q键关闭窗口
    cv2.destroyAllWindows()
if key == ord('s'):  # 按s键保存图像
    cv2.imwrite('2.jpg', img)

关键函数解析

  • cv2.imread(path, flag):读取图像,flag=0为灰度图,flag=1为彩色图(默认)
  • cv2.imshow(window_name, img):创建窗口并显示图像
  • cv2.waitKey(delay):等待按键事件,delay=0表示无限等待,返回按键 ASCII 码
  • cv2.imwrite(path, img):保存图像到指定路径
  • cv2.destroyAllWindows():关闭所有 OpenCV 创建的窗口

二、结合 Matplotlib 显示图像

除了 OpenCV 自带的显示功能,还可以结合 Matplotlib 库展示图像,适合需要更丰富绘图功能的场景。

import numpy as np
import cv2
from matplotlib import pyplot as plt

# 读取灰度图像
img = cv2.imread('ocv01.jpg', 0)
# 使用matplotlib显示,cmap='gray'确保灰度图正确显示
plt.imshow(img, cmap='gray', interpolation='bicubic')
# 隐藏坐标轴刻度
plt.xticks([]), plt.yticks([])
# 显示图像
plt.show()

注意事项

  • OpenCV 读取的彩色图像默认是 BGR 格式,而 Matplotlib 使用 RGB 格式,若显示彩色图需先转换:img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  • interpolation参数控制插值方式,bicubic(双三次插值)可获得更平滑的显示效果

三、视频处理:捕获与保存

OpenCV 不仅能处理图像,还能直接操作视频流(包括摄像头和视频文件)。

1. 实时摄像头捕获

import cv2
import numpy as np

# 打开摄像头,0表示默认摄像头
cap = cv2.VideoCapture(0)

while(True):
    # 读取一帧图像,ret表示是否成功,frame是图像数据
    ret, frame = cap.read()
    
    # 显示帧
    cv2.imshow('frame', frame)
    
    # 按q键退出循环(waitKey(1)表示等待1ms)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

2. 视频保存

import cv2
import numpy as np

# 打开摄像头
cap = cv2.VideoCapture(0)

# 定义编码器,'XVID'是常用的视频编码格式
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 创建视频写入对象:输出路径、编码器、帧率、分辨率
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        # 翻转帧(0表示上下翻转)
        frame = cv2.flip(frame, 0)
        
        # 写入帧
        out.write(frame)
        
        # 显示帧
        cv2.imshow('frame', frame)
        
        # 按q键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

核心概念

  • cv2.VideoCapture():用于打开视频源(摄像头 ID 或视频文件路径)
  • fourcc:四字符代码,指定视频编码器(如 'XVID'、'MP4V' 等)
  • cv2.VideoWriter():视频写入对象,需指定输出路径、编码器、帧率和分辨率

四、图形绘制:在图像上绘制基本形状

OpenCV 提供了丰富的绘图函数,可在图像上绘制直线、矩形、圆等基本图形。

import cv2
import numpy as np

# 创建512x512的黑色画布(3通道彩色图)
img = np.zeros((512, 512, 3), np.uint8)

# 绘制直线:起点(0,0),终点(511,511),颜色(255,0,0)(蓝色),线宽5
cv2.line(img, (0,0), (511,511), (255,0,0), 5)

# 绘制矩形:左上角(384,0),右下角(510,128),颜色(0,255,0)(绿色),线宽3
cv2.rectangle(img, (384,0), (510,128), (0,255,0), 3)

# 绘制圆:圆心(447,63),半径63,颜色(0,0,255)(红色),-1表示填充
cv2.circle(img, (447,63), 63, (0,0,255), -1)

# 绘制椭圆:中心(256,256),长轴100,短轴50,旋转角0,起始角0,结束角180,颜色255,填充
cv2.ellipse(img, (256,256), (100,50), 0, 0, 180, 255, -1)

# 绘制文字:内容'OpenCV',位置(10,500),字体,大小1,颜色白色,线宽2,抗锯齿
cv2.putText(img, 'OpenCV', (10,500), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2, cv2.LINE_AA)

# 显示绘制结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

颜色表示:OpenCV 中颜色以 (B, G, R) 格式表示,如(255,0,0)表示蓝色。

五、鼠标交互:通过鼠标事件绘制图形

OpenCV 支持鼠标事件监听,可实现交互式绘图功能。

import cv2
import numpy as np

# 全局变量:绘图状态、模式(矩形/圆形)、起点坐标
drawing = False  # 是否正在绘图
mode = True      # True:矩形,False:圆形
ix, iy = -1, -1  # 起点坐标

# 鼠标回调函数
def draw_circle_extensive(event, x, y, flags, param):
    global drawing, mode, ix, iy
    
    if event == cv2.EVENT_LBUTTONDOWN:
        # 左键按下:开始绘图,记录起点
        drawing = True
        ix, iy = x, y
    elif event == cv2.EVENT_MOUSEMOVE:
        # 鼠标移动:如果正在绘图,根据模式绘制
        if drawing == True:
            if mode == True:
                cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)  # 矩形
            else:
                cv2.circle(img, (x, y), 5, (0, 0, 255), -1)  # 圆形
    elif event == cv2.EVENT_LBUTTONUP:
        # 左键释放:结束绘图,完成最终绘制
        drawing = False
        if mode == True:
            cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
        else:
            cv2.circle(img, (x, y), 5, (0, 0, 255), -1)

# 创建黑色画布
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
# 设置鼠标回调函数
cv2.setMouseCallback('image', draw_circle_extensive)

while(1):
    cv2.imshow('image', img)
    k = cv2.waitKey(20) & 0xFF
    if k == ord('q'):  # 按q退出
        break
    elif k == ord('m'):  # 按m切换模式
        mode = not mode

cv2.destroyAllWindows()

常用鼠标事件

  • EVENT_LBUTTONDOWN:左键按下
  • EVENT_MOUSEMOVE:鼠标移动
  • EVENT_LBUTTONUP:左键释放
  • EVENT_LBUTTONDBLCLK:左键双击

六、轨迹栏控制:通过滑动条交互调整参数

轨迹栏(Trackbar)是 OpenCV 的另一种交互方式,可用于实时调整参数。

import cv2
import numpy as np

# 创建黑色画布
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')

# 创建轨迹栏:名称、窗口名、最小值、最大值、回调函数
cv2.createTrackbar('B', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('G', 'image', 0, 255, lambda x: None)
cv2.createTrackbar('R', 'image', 0, 255, lambda x: None)

# 创建开关轨迹栏
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 0, 1, lambda x: None)

while(1):
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:  # 按ESC退出
        break
    
    # 获取轨迹栏当前值
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')
    
    # 根据开关状态设置图像颜色
    if s == 0:
        img[:] = 0  # 关闭状态:黑色
    else:
        img[:] = [b, g, r]  # 打开状态:设置为轨迹栏指定的颜色

cv2.destroyAllWindows()

轨迹栏工作流程

  1. cv2.createTrackbar()创建轨迹栏
  2. cv2.getTrackbarPos()获取当前值
  3. 在循环中实时更新图像,实现参数调整的可视化反馈

总结

本文通过 7 个实战案例,系统介绍了 OpenCV 的核心基础操作,包括:

  • 图像的读取、显示与保存
  • 结合 Matplotlib 展示图像
  • 视频的捕获与保存
  • 基本图形的绘制
  • 鼠标交互绘图
  • 轨迹栏参数控制

这些操作是 OpenCV 应用的基础,掌握后可进一步学习图像处理(如滤波、边缘检测)、目标检测等高级功能。实际使用时,需注意函数参数的正确设置(如颜色通道顺序、坐标系统)和资源的及时释放,以避免内存泄漏。


网站公告

今日签到

点亮在社区的每一天
去签到