当前位置: 首页 > news >正文

OpenCv对图片视频的简单操作

目录

一.OpenCv安装与版本说明

二.图片的构成与颜色原理

三.OpenCv自动补齐功能修复

四.OpenCv的一些操作

1.基础操作

2.图片读取与灰度图转换

 3.图片保存

4.ROI(感兴趣区域)提取(切片操作)

5.视频加载与读取

①视频处理

②摄像头调用

③资源释放

6.RGB单通道提取方法

7.单通道显示与彩色效果

8.通道合并

9.图片的打码

10.图片的组合

11.图片的缩放(resize()方法)


一.OpenCv安装与版本说明

  • 需安装两个库:opencv-python 和 opencv-contrib-python,版本可以指定为 3.4.18.65
    pip install opencv-python==3.4.18.65 -i 镜像源地址
    pip install opencv-contrib-python==3.4.18.65 -i 镜像源地址
  • 不推荐使用最新版(4.x),因涉及版权问题且函数调用可能不兼容。

二.图片的构成与颜色原理

图片由像素点组成,每个像素点颜色由 RGB 三通道数值(0-255)决定。

三.OpenCv自动补齐功能修复

四.OpenCv的一些操作

1.基础操作

  • 问题现象:代码自动补齐失效(黄色框或下划线提示)。
  • 原因:OpenCV 版本过低。
  • 解决方法:
    1. 找到 Python 安装路径下的 site-packages 文件夹(如 D:\PY\site-packages)。
    2. 进入 cv2 文件夹,复制 cv2.pyd 文件到上层目录(site-packages 文件夹内)。
    3. 重启 Python 环境即可恢复自动补齐功能。
  • 查询 Python 安装路径的命令:win + R 输入 cmd,执行 where python
  • 读取图片:使用 cv2.imread(),参数为图片路径(避免中文路径)。
  • 显示图片:使用 cv2.imshow() 和 cv2.waitKey(),后者控制窗口显示时长(单位毫秒,0 表示无限等待)。
  • 关闭窗口cv2.destroyAllWindows() 释放内存。
  • 图片属性:通过调试模式查看图片的 shape(高、宽、通道数)、dtype(数据类型,如 uint8)、size(总像素数)。
    import cv2im=cv2.imread('img1.png')
    cv2.imshow('img1',im)
    asic=cv2.waitKey(10000)#我们可以通过任意键关闭,比如按下空格键就会返回空格键的ascii码值32
    print(asic)#32
    cv2.destroyAllWindows()
    print('图片形状(shape):',im.shape)
    print('图片数据类型(dtype):',im.dtype)
    print('图片大小(size):',im.size)图片形状(shape): (864, 1536, 3)
    图片数据类型(dtype): uint8
    图片大小(size): 3981312
    

注意事项:

  • OpenCV 中通道顺序为 BGR(非 RGB),中文路径或窗口名可能导致乱码或报错。
  • 按键 ASCII 码可通过 cv2.waitKey() 获取(如 ESC 键为 27)。

2.图片读取与灰度图转换

  • 灰度图特点:单通道(无色彩),像素值范围 0(黑)到 255(白),数据量为彩色图的 1/3。
  • 转换方法:
    • 使用 cv2.imread()方法读取图片 时添加参数 cv2.IMREAD_GRAYSCALE 或简写为 0
  • 优势:减少计算量且保留特征(如形状、轮廓)。
import cv2
# 读取图片灰度图
im = cv2.imread('img1.png',cv2.IMREAD_GRAYSCALE)
# 或者im = cv2.imread('img1.png',0)
cv2.imshow('image1_gray',im)
cv2.waitKey(0)
cv2.destroyAllWindows()
print('图片形状(shape):',im.shape)
print('图片数据类型(dtype):',im.dtype)
print('图片大小(size):',im.size)

 3.图片保存

  • 方法:cv2.imwrite(文件名, 图片数据),如 cv2.imwrite("tmp98_gray.jpg", gray_image)
cv2.imwrite('image1_gray.png',im)
  • 注意:需先关闭 cv2.waitKey() 窗口(按任意键)才能执行保存操作。

4.ROI(感兴趣区域)提取(切片操作)

  • 作用:从图像中截取特定区域(如人脸识别时仅分析人脸部分)。
  • 实现:通过数组切片(如 image[30:230, 100:300] 截取行 30-230、列 100-300 的矩形区域)。
  • 限制:仅支持矩形区域,无法按轮廓裁剪。
# 切片图片部分内容
a=im[100:500,200:700]
cv2.imshow('img1',im)
cv2.imshow('a',a)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.视频加载与读取

  • 使用 OpenCV 的 cv2.VideoCapture() 方法加载本地视频文件,支持中文字符路径。
  • 视频播放通过循环逐帧读取(video_capture.read()),每帧画面显示时长由 cv2.waitKey() 参数控制(默认60毫秒)。
  • 播放速度可通过调整 waitKey 参数修改(如1000毫秒为慢速,1毫秒为快速)。
  • 视频窗口可以设置按 ESC 键(ASCII值27)关闭。
import cv2
# video_capture = cv2.VideoCapture(0)
video_capture = cv2.VideoCapture('zqt.mp4')
if not video_capture.isOpened():print('视频打开失败')exit()while True:#逐帧读取视频ret,frame=video_capture.read()# 检查是否成功读取if not ret:break# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow('video',frame)if cv2.waitKey(100)==27:break
video_capture.release()
cv2.destroyAllWindows()

①视频处理

  • 将视频转换为灰度图:
    • 方法1:通过 cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 逐帧转换。
    • 方法2:加载时直接使用 cv2.IMREAD_GRAYSCALE 参数(需注意与第一种方法的参数区别)。
  • 处理逻辑可插入在读取帧(frame)与显示之间,例如人脸检测等。

②摄像头调用

  • 将 VideoCapture 参数改为 0 可调用本地摄像头,支持多摄像头切换(如0、1、2)。

③资源释放

  • 视频处理完成后需调用 video_capture.release() 释放资源,避免内存占用过高。
  • 关闭所有窗口使用 cv2.destroyAllWindows()

6.RGB单通道提取方法

  • 方法一:数组切片
    • 使用冒号切片(如a[:,:,0])提取通道,索引0为B通道,1为G通道,2为R通道。
    • 提取后的单通道图像为灰度图,无色彩。
      import cv2
      img=cv2.imread('img1.png')
      b=img[:,:,0]
      g=img[:,:,1]
      r=img[:,:,2]
  • 方法二:split函数
    • 直接调用cv2.split(a)返回B、G、R三个通道的数组,效果与方法一相同
b,g,r=cv2.split(img)

7.单通道显示与彩色效果

  • 显示单通道时图像为灰度,因仅保留亮度值。
  • 若需显示单通道彩色效果(如仅蓝色),需将其他通道数值设为0(如img[:,:,1:3]=0保留B通道)。
  • 操作时建议使用copy()避免修改原图数据
#设置单颜色
new_img=img.copy()
new_img[:,:,1]=0
new_img[:,:,2]=0
cv2.imshow('new_img',new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

8.通道合并

  • 使用cv2.merge([B,G,R])将分离的通道合并为彩色图像,合并后恢复原图效果。
b,g,r=cv2.split(img)
# 合并颜色通道
res=cv2.merge((b,g,r))#注意参数是元组形式
cv2.imshow('res',res)

9.图片的打码

使用 OpenCV 和 NumPy 实现指定区域马赛克效果

  • 步骤:读取图片 → 选定区域(如200-300行、150-250列) → 用随机生成的像素值(0-255)替换原区域 → 显示结果。
  • 关键点:区域大小需与随机生成的数组维度一致(如100x100x3对应RGB三通道)。
import numpy as np
import cv2
new_img[200:300,150:250]=np.random.randint(0,256,(100,100,3))
cv2.imshow('new_img_dama',new_img)
cv2.waitKey(10000)
cv2.destroyAllWindows()

10.图片的组合

基于区域选择(ROI)将两张图片的指定区域融合。

  • 示例:将图片的100-250行、200-350列区域替换到另一图片的200-350行、300-450列区域。
  • 注意:抠图区域大小需严格一致(如150x150)。
#图片的组合
img2=cv2.imread('nailong.png')
img1[100:250,200:350]=img2[200:350,300:450]#注意组合的距离要相同
cv2.imshow('img1_combine',img1)
cv2.waitKey(10000)
cv2.destroyAllWindows()

11.图片的缩放(resize()方法)

  • 指定宽高:直接设置目标尺寸(如宽200、高600),图片按比例拉伸。
  • 比例系数:通过fx(横向比例)和fy(纵向比例)调整(如0.5倍缩小或1.5倍放大)。
#图片的大小调整
img1=cv2.imread('img1.png')
new_img=cv2.resize(img1,dsize=None,fx=0.5,fy=0.5)
#或者
# new_img=cv2.resize(img,dsize=(200,600))
cv2.imshow('new_img',new_img)
cv2.waitKey(10000)
cv2.destroyAllWindows()

http://www.dtcms.com/a/318894.html

相关文章:

  • 深度学习(2):自动微分
  • 学深度学习,有什么好的建议或推荐的书籍?
  • MobileNetV3: 高效移动端深度学习的前沿实现
  • 从“炼金术”到“工程学”:深度学习十年范式变迁与未来十年路线图
  • 深度学习之opencv篇
  • HashMap寻址算法
  • QT项目 -仿QQ音乐的音乐播放器(第五节)
  • 《算法导论》第 10 章 - 基本数据结构
  • 深入剖析Java线程:从基础到实战(上)
  • ubuntu cloud init 20.04LTS升级到22.04LTS
  • vue3接收SSE流数据进行实时渲染日志
  • Web开发模式 前端渲染 后端渲染 身份认证
  • 第三章:【springboot】框架介绍MyBatis
  • Spring AOP动态代理核心原理深度解析 - 图解+实战揭秘Java代理设计模式
  • 前端百分比展示导致后端 BigDecimal 转换异常的排查与解决
  • 多账号管理方案:解析一款免Root的App分身工具
  • 【RabbitMQ面试精讲 Day 13】HAProxy与负载均衡配置
  • HTTP 协议升级(HTTP Upgrade)机制
  • winform中的listbox实现拖拽功能
  • 基于ubuntu搭建gitlab
  • KDE Connect
  • 一篇文章入门TCP与UDP(保姆级别)
  • 02电气设计-安全继电器电路设计(让电路等级达到P4的安全等级)
  • C语言strncmp函数详解:安全比较字符串的实用工具
  • 合约收款方式,转账与问题安全
  • 怎么进行专项分析项目?
  • 上证50期权持仓明细在哪里查询?
  • C语言(08)——整数浮点数在内存中的存储
  • LINUX-批量文件管理及vim文件编辑器
  • 浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?