欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > OpenCV复习笔记

OpenCV复习笔记

2025/6/23 16:41:04 来源:https://blog.csdn.net/2201_75446108/article/details/148777272  浏览:    关键词: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 的轮廓分析,这些是考试实操题的原型!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词