OpenCV复习笔记

一、图像数据源读取

(一)静态图像读取

  • API 函数cv2.imread(filename, flags)
    • 作业场景:读取作业要求的图片(如作业 1 读图绘制矩形、作业 2 读图处理颜色通道 )。
    • 关键参数:flags 常用 cv2.IMREAD_COLOR(默认 BGR 读入 )、cv2.IMREAD_GRAYSCALE(作业 2 阈值处理、作业 3 轮廓检测常用灰度图 )。
    • 示例:img = cv2.imread('task_img.jpg', cv2.IMREAD_GRAYSCALE)(作业 2 阈值处理前置 )

(二)动态图像(视频)读取(基础)

  • 摄像头 / 视频文件cap = cv2.VideoCapture(0)(摄像头 )或 cap = cv2.VideoCapture('video.mp4')(视频 ),逐帧用 ret, frame = cap.read() 获取,最后 cap.release() 释放。
  • 作业关联:若作业涉及视频(如后续拓展 ),流程一致,可用于动态画面处理(如画圆标记 )。

二、图像基础操作

(一)鼠标交互绘制(鼠标画矩形 )

  • 实现逻辑
    1. 定义鼠标回调函数:def mouse_callback(event, x, y, flags, param) ,判断 event 类型(如 cv2.EVENT_LBUTTONDOWN 按下、cv2.EVENT_LBUTTONUP 抬起 ),记录矩形起点、终点坐标。
    2. 绑定回调:cv2.setMouseCallback(window_name, mouse_callback)
    3. 循环显示图像,根据坐标绘制矩形:cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2)

(二)颜色通道操作(分区域改颜色通道 )

  • 通道拆分与合并

    • 拆分:b, g, r = cv2.split(img)(BGR 顺序 ),作业 1 中 "上部三分之一改红色"→ 对应区域 r 通道赋值 255 。
    • 合并:img_merge = cv2.merge((b, g, r)) ,将修改后的通道合并回图像。
  • 作业示例:

    复制代码
    height, width = img.shape[:2]
    # 上部三分之一区域
    img[:height//3, :, 2] = 255  # 红色通道(BGR 中 R 是第三个通道 )
    img[height//3:2*height//3, :, 0] = 255  # 蓝色通道(B 是第一个通道 )
    img[2*height//3:, :, 1] = 255  # 绿色通道(G 是第二个通道 )

(三)图像叠加(作业 1 要求:三种方式叠加两张图 )

  • 方法 1:直接加权(cv2.addWeighted

    复制代码
    res = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)  # 权重和为 1,0 是 gamma 值
  • 方法 2:按位运算(cv2.bitwise_and/or/not
    需确保图像大小、通道一致,适合遮罩叠加:

    复制代码
    mask = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)[1]
    res = cv2.bitwise_and(img1, img2, mask=mask)
  • 方法 3:手动遍历像素叠加
    逐像素计算 res[i,j] = alpha*img1[i,j] + beta*img2[i,j] ,效率低但灵活,作业中用于理解原理。

三、颜色空间转换

(一)基础转换(RGB ↔ HSV 等 )

  • APIcv2.cvtColor(src, code) ,作业 2 要求 RGB→HSV 转换,示例:

    复制代码
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # OpenCV 读入是 BGR,先转 RGB 再转 HSV 更直观(或直接转 ,注意顺序 )
  • 通道含义

    • HSV 中 H(0 - 180 )、S(0 - 255 )、V(0 - 255 ),作业 2 可通过调整 H 通道实现颜色筛选(如提取红色物体 )。

(二)作业场景应用(区分 R、G、B 通道 )

  • 拆分通道:b, g, r = cv2.split(img) ,单独显示 / 处理每个通道,作业 2 中观察颜色分布。
  • 通道可视化:将单通道(如 R )扩展为三通道(cv2.merge((r, r, r)) ),方便在彩色窗口显示灰度通道。

四、几何变换

(一)平移、缩放、旋转、放射变换

  • 平移

    复制代码
    M = np.float32([[1, 0, tx], [0, 1, ty]])
    dst = cv2.warpAffine(img, M, (width, height))

    作业 2 中按要求平移图像,如 tx=50, ty=30 右移、下移。

  • 缩放

    复制代码
    dst = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)

    作业 2 需指定缩放尺寸(如 (width*2, height*2) 放大 )。

  • 旋转

    复制代码
    M = cv2.getRotationMatrix2D((center_x, center_y), angle, scale)
    dst = cv2.warpAffine(img, M, (width, height))

    作业 2 中旋转角度(如 angle=45 度 ),scale=1 保持尺寸。

  • 放射变换

    定义变换前后的点对,计算矩阵 M = cv2.getAffineTransform(src_pts, dst_pts) ,再用 warpAffine 变换,作业 2 中实现复杂形变。

五、阈值处理

(一)固定阈值

  • APIret, dst = cv2.threshold(src, thresh, maxval, type)

  • 作业场景(5 种类型示例 ):

    复制代码
    # 二值化
    _, dst_bin = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)  
    # 反二值化
    _, dst_bin_inv = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY_INV)  
    # 截断
    _, dst_trunc = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TRUNC)  
    # 置零
    _, dst_tozero = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO)  
    # 反置零
    _, dst_tozero_inv = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO_INV)  

    作业 2 需展示每种阈值的效果,分析对图像的影响(如二值化突出黑白对比 )。

(二)自适应阈值

  • APIdst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
  • 作业对比:与固定阈值对比,展示对光照不均图像(如文档 )的优化效果。

六、平滑滤波

(一)常用滤波方法

  • 均值滤波cv2.blur(img, (3,3)) ,简单平均,作业 2 中观察模糊效果。
  • 高斯滤波cv2.GaussianBlur(img, (3,3), 0) ,去高斯噪声,边缘保留更好。
  • 中值滤波cv2.medianBlur(img, 3) ,去椒盐噪声(作业 2 中若有噪声图,效果显著 )。
  • 双边滤波cv2.bilateralFilter(img, 9, 75, 75) ,保边去噪(同时考虑空间距离和颜色差异 ),作业 2 中处理纹理图像。

七、轮廓检测与物体标识

(一)轮廓检测流程

  1. 预处理
    • 转灰度:gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    • 阈值 / 边缘检测:_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)(或 Canny )
  2. 找轮廓
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  3. 分析轮廓
    • 质心坐标:M = cv2.moments(contour)cx = int(M['m10']/M['m00'])cy = int(M['m01']/M['m00'])
    • 面积:area = cv2.contourArea(contour)
    • 最小外切圆:(x,y), radius = cv2.minEnclosingCircle(contour)
  4. 绘制与报告
    cv2.drawContours 画轮廓,cv2.circle 画质心、外切圆,按实验报告模板整理流程、代码、结果。

八、形态学操作

(一)腐蚀与膨胀

  • 腐蚀cv2.erode(binary, kernel, iterations=1) ,消除小噪点、细化轮廓。
  • 膨胀cv2.dilate(binary, kernel, iterations=1) ,连接断开区域、填充空洞。
  • 作业应用:作业 3 中对阈值后的二值图预处理,提升轮廓检测准确性。

九、视频处理基础

(一)核心操作

  • 读视频 / 摄像头cap = cv2.VideoCapture(0) ,循环 ret, frame = cap.read() 获取帧。
  • 绘制操作 :在帧上用 cv2.circle(frame, (x,y), radius, (0,255,0), 2) 画圆,实现动态标记(如跟踪鼠标点击 )。
  • API 英译中VideoCapture(视频捕获 )、imshow(显示 )、waitKey(延时 )、circle(画圆 )等,作业 1 中需准确调用。

十、复习策略(结合作业)

  1. 代码复现:把三次作业代码重新跑通,梳理每一步 API 作用(如作业 1 鼠标回调、作业 2 颜色通道修改、作业 3 轮廓质心计算 )。
  2. 考点关联 :作业中涉及的函数(imreadcvtColorthresholdfindContours 等 )是考试重点,熟记参数和应用场景。
  3. 流程梳理:如作业 3 轮廓检测流程(去噪→二值化→找轮廓→分析特征 ),对应复习笔记中 "轮廓检测" 模块,确保步骤清晰。

提示:复习时结合作业代码,重点关注老师要求的 "前三次作业重中之重" 内容,尤其是作业 1 的交互绘制、作业 2 的多变换组合、作业 3 的轮廓分析,这些是考试实操题的原型!

相关推荐
future141228 分钟前
每日问题总结
经验分享·笔记
阿蒙Amon1 小时前
【Python小工具】使用 OpenCV 获取视频时长的详细指南
python·opencv·音视频
循环过三天2 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
之歆3 小时前
Python-封装和解构-set及操作-字典及操作-解析式生成器-内建函数迭代器-学习笔记
笔记·python·学习
jndingxin4 小时前
OpenCV中超分辨率(Super Resolution)模块类cv::dnn_superres::DnnSuperResImpl
人工智能·opencv·dnn
DKPT4 小时前
Java组合模式实现方式与测试方法
java·笔记·学习·设计模式·组合模式
受之以蒙4 小时前
Rust & WASM 之 wasm-bindgen 基础:让 Rust 与 JavaScript 无缝对话
前端·笔记·rust
茫忙然6 小时前
【WEB】Polar靶场 6-10题 详细笔记
笔记
eric*16886 小时前
尚硅谷张天禹老师课程配套笔记
前端·vue.js·笔记·vue·尚硅谷·张天禹·尚硅谷张天禹
Allen_LVyingbo6 小时前
数智读书笔记系列035《未来医疗:医疗4.0引领第四次医疗产业变革》
人工智能·经验分享·笔记·健康医疗