opencv图像处理及视频处理基本操作

2023-10-27

        计算机眼中的图像由一个个像素组成, 每个像素点的值在0-255之间,代表像素点的亮度(0为最暗,255为最亮)。通常彩色图为三通道,灰度图(黑白图)为单通道。彩色图像包括三个颜色通道——B,G,R,分别表示蓝、绿、红。

目录

1.图像的表示

2.图像的读取

3.显示图片

4.色彩空间

5.图像的逐点操作(像素级操作)

6.图像二值化

7.几何变换-缩放

8.几何变换-平移

9.几何变换-旋转

10.视频读取和写入
​​​​​​​


1.图像的表示

        图像的高和宽代表图像在竖直和水平方向分别有多少个像素点。也等价于每个颜色通道矩阵的维度。每张图片都是像素值构成的多维数组,彩色图像为三维数组,灰度图为二维数组


        opencv库是开源图像处理和计算机视觉算法库,不同于其他库的是,其终端下载命令为pip install opencv-python,导入库的代码是import cv2


2.图像的读取

cv2.imread(filepath, flag)
• filepath : 文件路径,不能包含中文
• flag:读取的模式(可选)

               flag参数值 缩写参数值                               含义
cv.IMREAD_UNCHANGED         -1 按原样返回加载的图像(如果有透明
通道则保留)
cv.IMREAD_GRAYSCALE         0 始终将图像转换为单通道灰度图像
cv.IMREAD_COLOR (默认)         1 始终将图像转换为3通道BGR彩色图
像。
#读取图片(路径不能包含中文)
img=cv2.imread("C:\\Users\\Administrator\\desk\\images\\lena02.png")
print(img)               #打印像素
print(img.shape)         #(高,宽,通道)

 3.显示图片

cv2.imshow(windowname, img)
• windowname : 显示的窗口名,字符串形式
• img:要显示的图片

#显示结果
cv2.imshow("img",img)
cv2.waitKey()      #等待键盘输入,输入任意键返回
cv2.destroAllyWindow()    #关闭窗口

 4.色彩空间

dst = cv2.cvtColor(src, code)
• src: 输入图像
• code:转换模式,例如cv2.COLOR_BGR2GRAY, 
cv2.COLOR_BGR2HSV,数字2的前后分别是转换前和转换后
的色彩空间

#转换为灰度图
gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)    #数字2的前后分别是转换前和转换后的色彩空间
print(gray.shape)


#转换为三通道图
img=cv2.cvtColor(gray,cv2.COLOR_RGB2BGR)
print(gray.shape)

5.图像的逐点操作(像素级操作)

访问图片中某一特定像素的像素值
• 彩色图像:[行编号,列编号,通道编号]
• 灰度图像:[行编号,列编号]

访问图像某个局部区域:图像裁剪(通过切片实现)
• 通过切片的方式得到图片的某一部分

局部区域有时也称为ROI(Region Of Interest)

#获取局部区域(roi)
roi=img[384:513,350:550]
#保存roi到roi1.jpg
cv2.imwrite("roi1.jpg", roi)

6.图像二值化

二值图像:
• 图像上像素点的灰度值只有两种(一般是0和255)
• 更好地分析物体的形状和轮廓
• 也常作为掩码图像(mask)
图像二值化:
• 将图像变为二值图像的操作

retval, dst = cv2.threshold(src, thresh, maxval, thresholdType)• dst:结果图像

• src:原图像,要求必须是灰度图像
• thresh:阈值,取值范围0~255
• maxVal:像素灰度最大值(最大阈值)
• thresholdType:阈值类型,如下图THRESH_BINARY类型,修改后原图像像素小于127的值会会变成0,大于127的值会变成255

  • retval: 返回输入的thresh
  • dst: 返回二值化后的图片
img=cv2.imread("D:\\desk\\images\\lena02.png",0)        #0:自动将图像转为灰度图
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

运行结果如下:

 7.几何变换-缩放

res = cv2.resize(src, size, fx, fy, interpolation)

•src: 原图

•size:目标的宽和高,格式为(w,h),w和h均为整数

•fx, fy(可选):沿x轴,y轴的缩放系数,当指定这两个数值时,size需输入None

Interpolation(可选):缩放的方式,具体含义见下表

cv2.INTER_NEAREST 最近邻插值
cv2.INTER_LINEAR 双线性插值(默认设置)
cv2.INTER_AREA 使用像素区域关系进行重采样
cv2.INTER_CUBIC 4x4像素邻域的双三次插值
cv2.INTER_LANCZOS4 8x8像素邻域的Lanczos插值
img=cv2.imread("C:\\Users\\Administrator\\desk\\images\\lena02.png")
print(img.shape)

#计算宽和高
#方法1
w=int(0.5*img.shape[1])
h=int(0.6*img.shape[0])
img_small=cv2.resize(img,(w,h))
#方法2
img_small=cv2.resize(img,None,fx=0.5,fy=0.6)     #res = cv2.resize(src, size, fx, fy, interpolation(可选))
print(img.shape)

8.几何变换-平移

dst = cv2.warpAffine(src, M, dsize[,flags,borderMode,borderValue]) 

•src:输入图像

•M:2*3变换矩阵,float32

tx:水平方向的平移距离      ty:垂直方向的平移距离

•dsize:输出图像的大小,格式为(w,h)

•Flags(可选):插值方法,默认为cv2.INTER_LINEAR(即线性插值)

•borderMode(可选):边的类型

•borderValue(可选):边界值,默认为0


#定义变换矩阵
tx=50     #水平方向的平移距离
ty=50     #垂直方向的平移距离
M=np.float32([[1,0,tx],[0,1,ty]])

#移动图像
lena_shift=cv2.warpAffine(img,M,(img.shape[1],img.shape[0]),borderValue=(255,255,255))
#borderValue定义颜色  dsize:(img.shape[1],img.shape[0])为输出图像的大小,格式为(w,h)

9.几何变换-旋转

cv2.warpAffine()除了平移外,还可以实现旋转效果

输入图片和输出大小预先设定,已知

只需要确定M矩阵:cv2.getRotationMatrix2D(center, angle, scale)

•center:输入图像的旋转中心,格式为(x,y),即横坐标在前,纵坐标在后

•angle:旋转角(以度为单位),注意:逆时针旋转角为正,顺时针旋转角为负

•scale:原始图像的缩放系数


h,w,_=img.shape

#定义旋转中心
center_x=int(w/2)
center_y=int(h/2)

#得到变换矩阵,逆时针旋转30,缩放到原图0.6倍
M=cv2.getRotationMatrix2D((center_x,center_y),30,0.6)     #旋转中心,旋转角,缩放系数

#调用warpAffine进行旋转
res=cv2.warpAffine(img,M,(w,h))

 10.视频读取和写入

OpenCV中的视频读取步骤:

•1.cam = cv2.VideoCapture() 创建视频捕获器

•2.cam.read() 读取视频帧,每次调用都返回读取是否成功和当前帧(失败的话为None)

有两种读取失败的可能:视频损坏、已读到最后一帧

•3.cam.release() 释放视频捕获器

OpenCV中的视频写入步骤:

•1.定义新视频的宽、高、帧率

•2.创建新视频的编码器cv2.VideoWriter_fourcc

•3. 创建新视频的写入对象cv2.VideoWriter

•4.逐帧写入新视频: .write(frame)•5.释放VideoWriter对象: .release()

OpenCV中的获取视频属性: VideoCapture对象的.get()方法

get参数 含义
cv2.CAP_PROP_FRAME_WIDTH 视频帧的宽
cv2.CAP_PROP_FRAME_HEIGHT 视频帧的高
cv2.CAP_PROP_FPS 视频帧的帧率
编码器初始化fourcc= cv2.VideoWriter_fourcc(fourcc_name)
•fourcc: 编码器对象
•fourcc_name:编码器名称,格式为*'编码器',  例如*'mp4v',*'DIVX'.
视频写入对象的初始化vw= cv2.VideoWriter(path, fourcc, fps, frame_size)
•path:保存路径
•fourcc:编码器对象
•fps:帧率
•frame_size:视频帧宽和高,格式为(w,h)
"""将一段视频读取进来,并且将读入的视频帧写到新视频,如果用户有按键输入,则停止写入"""
import cv2
# 第一步:读取视频
# 创建视频捕获器

cam = cv2.VideoCapture("D:\\desk\\chp3.mp4")

# 确定视频高 宽 帧率   视频总帧数
height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
fps = round(cam.get(cv2.CAP_PROP_FPS))
frameCount=cam.get(cv2.CAP_PROP_FRAME_COUNT)

# 创建视频编码器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 对应的编码器为MP4v
cam_write = cv2.VideoWriter("C:\\Users\\Administrator\\desk\\output.mp4", fourcc, fps, (width, height))


# 第二步:循环得到视频帧,并写入新视频
success, frame = cam.read()
frame_count=0      #当前写入
# 读取视频帧
while success:
    # 将视频帧写入新视频
    cam_write.write(frame)
    cv2.imshow("frame", frame)
    # 判断用户是否有按键输入,如果有则跳出循环
    # cv2.waitKey如果有用户输入,返回输入的字符,否则返回-1
    char = cv2.waitKey(5)
    if char != -1:
        break
    # 读取新视频
    success, frame = cam.read()

# 释放视频读取对象
cam.release()
# 释放视频写入对象
cam_write.release()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv图像处理及视频处理基本操作 的相关文章

  • 如何测试使用 XCom 的 Apache Airflow 任务

    我正在尝试找出一种测试 DAG 的方法 其中有几个任务使用 XCom 进行通信 由于控制台命令只允许我从 DAG 运行任务 有没有一种方法可以测试通信而无需通过 UI 运行 DAG Thanks 这是一种对我有用的方法 尽管 Airflow
  • 在 Python 中绘制分类数据的三个维度

    我的数据包含三个我试图可视化的分类变量 城市 五个之一 职业 四种之一 血型 四种之一 到目前为止 我已经成功地以一种我认为易于使用的方式对数据进行了分组 import numpy as np pandas as pd Make data
  • 使用 Pymongo 从 Windows 连接到 AWS 实例上的 MongoDB

    此行反复抛出错误 client MongoClient ec2 12 345 67 89 us east 2 compute amazonaws com 27017 ssl True ssl keyfile C mongo pem 由于显而
  • 小数缓存是Python规范中定义的还是一个实现细节?

    Python 似乎有一个所谓的 小数字缓存 用于存储 5 到 256 范围内的数字 我们可以使用以下程序来演示这一点 for i in range 7 258 if id i id i 0 print i is cached else pr
  • OpenCV - 我需要将彩色图像插入黑白图像并且

    我用以下代码将黑白图像插入彩色图像 没问题 face grey cv cvtColor face cv COLOR RGB2GRAY for row in range 0 face grey shape 0 for column in ra
  • Seaborn 热图中的自定义调色板间隔

    我正在尝试绘制一个heatmap https seaborn pydata org generated seaborn heatmap html使用seaborn库 绘图函数如下所示 def plot confusion matrix da
  • 如何在Python中求和

    我想知道如何在 python 中表示总和而不需要像这样的循环here http docs scipy org doc scipy reference tutorial optimize html 我们有 def rosen x The Ro
  • 使用 3d 对象作为 3d 散点图中的标记 - Python

    使用下面的代码 我尝试模拟一个用罐头制成的碗 我希望每个标记都是一个罐头 最好的方法是什么 我真的很感激任何建议 谢谢 import pylab import numpy as np from math import pi sin cos
  • 使用 python 只读取 Excel 中的可见行

    我想只读取 python 中 Excel 工作表中的可见行 输入 Excel表 所以当我过滤时 作为 python 中的输出 在本例中我将仅获得可见数据 1 行 这是我的代码 from openpyxl import load workbo
  • pandas to_sql sqlalchemy 与 secure_transport 的连接

    我正在尝试将数据发送到具有 require secure transport ON 的服务器上的 mysql 数据库 当我尝试使用以下代码连接到它时 import pandas as pd import pymysql from sqlal
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 如何绘制多类分类器的精度和召回率?

    我正在使用 scikit learn 我想绘制精度和召回曲线 我正在使用的分类器是RandomForestClassifier scikit learn 文档中的所有资源都使用二元分类 另外 我可以绘制多类的 ROC 曲线吗 另外 我只找到
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P
  • Python 队列 get()/task_done() 问题

    我的消费者端队列 m queue get queue task done
  • 如何可视化多维数据上的 kmeans 聚类

    我在 mnist 数据集上使用 kmeans 聚类算法 并希望可视化聚类后的图 到目前为止我做了这个 from mnist import MNIST mndata MNIST Datasets X train y train mndata
  • 如何保持 python 3 脚本 (Bot) 运行

    不是母语英语 抱歉 英语可能很蹩脚 我也是编程新手 您好 我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来创建机器人 经过几天的努力 它有效 只有 1 个问题 而我却被这个问题困扰了 如果您需要检查 这是我正在使
  • 使用 OpenCV 进行三角形检测

    我有以下示例图像 我想用白色填充角落里的这些三角形 我如何使用 OpenCV 检测它们 当然 在这个特定的示例中 我可以只依靠渐变或亮度 然而 未来图像的形状不会如此完美 所以我正在考虑一些形状检测 我听说形状通常可以通过例如霍夫变换来检测
  • VSCode无法切换matplotlib后端:ImportError:无法加载需要“qt5”交互框架的后端“Qt5Agg”

    我只想通过在 VSCode 中运行 Python 来进行绘图 但结果失败了 我无法将后端从 agg 切换到 Qt5Agg 但是 我可以在 VSCode 的终端中轻松执行此操作 VSCode集成终端中的问题如下所示 我尝试了各种解决方案但失败
  • 在多个图表上绘制一条线

    I don t know how this thing is called or even how to describe it so the title may be a little bit misleading The first a
  • django admin 中内联模型的分页器

    我有这个简单的 django 模型 由一个传感器和特定传感器的值组成 每个日射强度计的值数量很多 gt 30k 是否可以以某种方式分页PyranometerValues在特定日期或一般情况下将分页器应用于管理内联视图 class Pyran

随机推荐

  • Linux OOM killer(转)

    OOM killer 当物理内存和交换空间都被用完时 如果还有进程来申请内存 内核将触发OOM killer 其行为如下 1 检查文件 proc sys vm panic on oom 如果里面的值为2 那么系统一定会触发panic 2 如
  • 最新AI创作系统ChatGPT程序源码+详细搭建部署教程+微信公众号版+H5源码/支持GPT4.0+GPT联网提问/支持ai绘画+MJ以图生图+思维导图生成!

    使用Nestjs和Vue3框架技术 持续集成AI能力到系统 新增 MJ 官方图片重新生成指令功能 同步官方 Vary 指令 单张图片对比加强 Vary Strong Vary Subtle 同步官方 Zoom 指令 单张图片无限缩放 Zoo
  • stm32 esp8266配网-smartConfig和BT串口方式配网

    stm32 esp8266 ota系列文章 stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 ota升级 h
  • 概要设计、详细设计:概念、方法、实践步骤

    完整软件开发流程 需求分析 概要设计 详细设计 一 1 概念 方法 实践步骤 设计是指根据需求开发的结果 对产品的技术实现由粗到细进行设计的过程 根据设计粒度和目的的不同可以将设计分为概要设计 详细设计等阶段以便于管理和确保质量 设计内容也
  • MFC导出到Excel

    软件 vs2013 程序功能 将ListControl内容导出到Excel里 步骤 第一步 创建基于对话框的MFC工程 第二步 添加库 添加Excel类库 在工程名上右键 选择 添加 类 或者点击菜单栏的 项目 gt 添加类 选择 Type
  • SQL自动生成字段功能实现

    背景 最近在维护的一款数据产品 有一个数据推送功能 就是把数据从A数据源同步到B数据源 通过SQL指定A数据源里面的数据表 和字段 前面有SQL编辑框 可以提交语法无误的SQL 上面截图中的字段 表示期望推送到下游数据源的字段 左侧提供一个
  • node 连接 mysql 报错 ER_NOT_SUPPORTED_AUTH_MODE

    node 版本 v12 12 0 mysql 版本 8 0 我再家尝试使用node连接mysql数据库的时候 发现连接不上 报错信息显示为 code ER NOT SUPPORTED AUTH MODE errno 1251 sqlMess
  • ChatGPT - 基于 Visual Studio Code 进行 AI 编码

    2023 04 15 周六 杭州 晴 前情提要 ChatGPT AutoGPT AgentGPT 现在各种人工智能编码工具层出不穷 通过人工智能编码再也不用记大量的技术知识点了 现在所谓开发人员的经验性的东西也好像弱化了很多 我们可以更有效
  • protobuf与json互相转换

    Java http code google com p protobuf java format maven
  • vue + springboot poi 实现excel模板导出 完整代码

    有导入导出功能的时候 避免用户导入数据有误 提供了excel模板下载 用户直接在系统导出的excel模板中填写数据 再导入该excel 例如下图excel 提供前后台所有导出代码 3 代码 3 1 前台 1 按钮
  • Python 循环所有文件夹(含子文件夹),读取指定格式文件,另存为其他格式文件...

    循环所有文件夹 含子文件夹 读取指定格式文件 另存为其他格式文件 与原有文件在同一级目录 并删除原有文件 usr bin python coding utf 8 遍历所有文件夹 将指定格式文件 批量另存为其他文件 或其他格式 import
  • 【OpenCV学习笔记】【函数学习】十四(cvSeq的用法说明(功能很多,按照需求使用))

    OpenCV CvSeq 结构 一直困惑于CvSeq到底是个什么样的东西 因为曾经拿到别人写的一个函数库 其返回值是一个CvSeq指针 我的任务是遍历所有的Sequence 然后删除其中不符合要求的Sequence 由于没有文档 我当时并不
  • 优雅的获取文件及文件夹

    string filepath D WEB var rel Directory GetFiles filepath SearchOption AllDirectories ToList foreach var file in rel Con
  • Java垃圾回收机制

    Java垃圾回收机制 Java垃圾回收机制是指一种自动化的内存管理方式 Java程序员无需手动管理内存 而是由JVM Java虚拟机 自动进行垃圾回收 下面是简要的Java垃圾回收机制 垃圾收集器 JVM中垃圾回收器 Garbage Col
  • 外包征途-甲方、乙方、外包

    甲方 乙方 外包 在IT这行 我们经常都会听到这几个词 那这几个词到底是什么意思 我们先看看官方的解释 甲方 一般是指提出目标的一方 在合同拟定过程中主要是提出要实现什么目标 是合同的主导方 甲方是合同中双方平等主体的代称 也是为了方便在下
  • Meta算力争夺演变成团队动荡!LLaMA、LLaMA2、OPT团队成员多位离职

    据TheInformation报道 原参与Llama项目的团队成员有多位已经辞职 原因是Meta内部的OPT研究团队与Llama团队之间发生了一场关于计算资源的内部斗争 看来不管是谷歌 微软 OpenAI还是Meta 人才流失都是一个避不开
  • 【满分】【华为OD机试真题2023 JS】组装新的数组

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 组装新的数组 知识点回溯数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给你一个整数M和数组N N中的元素为连续整数 要求根据N中的元素组装成新的数组R 组
  • iOS 299美元企业账号申请流程及注意事项

    iOS开发者众多 但并不是所有的开发者都对账号申请 证书配置这些问题都清楚 毕竟不是所有开发者都能够经历这个环节 多数情况下是进公司之前这些东西都已经有了 作为一个合格的iOS开发者 我们必须要了解苹果的三种开发者账号 下图对三者进行了比较
  • C# 中的委托和事件(详解)

    C 中的委托和事件 委托和事件在 NET Framework 中的应用非常广泛 然而 较好地理解委托和事件对很多接触 C 时间不长的人来说并不容易 它们就像是一道槛儿 过了这个槛的人 觉得真是太容易了 而没有过去的人每次见到委托和事件就觉得
  • opencv图像处理及视频处理基本操作

    计算机眼中的图像由一个个像素组成 每个像素点的值在0 255之间 代表像素点的亮度 0为最暗 255为最亮 通常彩色图为三通道 灰度图 黑白图 为单通道 彩色图像包括三个颜色通道 B G R 分别表示蓝 绿 红 目录 1 图像的表示 2 图