【自我提升】openCV基本操作

news2024/11/20 8:15:36

写在前面:本篇博客主要是记录opnecv的基本操作,不记录安装等步骤。方便回顾和查找方法。

一、图像的IO操作,读取和保存方法

读取图像

        在OpenCV中,读取图像的函数是imread()。该函数可以从指定的文件中加载图像,返回值是一个包含图像数据的多维数组。imread()函数的原型如下:

cv2.imread(filename[, flags])

参数:

  • filename:一个字符串,指定要读取的图像文件的名称和路径。该文件的路径可以是相对路径也可以是绝对路径。

  • flags:该参数是可选的,用于指定加载图像的方式。可能的值包括:

    • cv2.IMREAD_COLOR:读取彩色图像。这是默认参数,此参数下,图像的透明度会被忽略,总是返回三通道的图像。(可以使用参数1代替)

    • cv2.IMREAD_GRAYSCALE:以灰度模式读取图像。(可以使用参数0代替)

    • cv2.IMREAD_UNCHANGED:读取图像中包含的所有通道,包括透明度通道。(可以使用参数-1代替)

例如,以下代码会以灰度模式加载图像:

img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

注意:如果加载的路径有误,不会报错,会返回一个None值。

 显示图像

imshow()函数的原型如下:

cv2.imshow(winname, mat)
  • winname:一个字符串,指定显示图像的窗口的名称。

  • mat:需要显示的图像,通常是使用imread()函数读取的图像。

注意:需要使用waitKey()函数来暂停程序,等待用户按键,如果不使用这个函数,图像窗口会立刻关闭,你可能看不到图像。

例如,以下代码会在一个名为"Image"的窗口中显示图像:

img = cv2.imread('image.jpg')
cv2.imshow('Image', img)
cv2.waitKey(0)//参数为0代表永远的显示下去

在显示图像之后,你可以使用destroyAllWindows()函数来关闭所有打开的窗口。

cv2.destroyAllWindows()

保存图像

imwrite()函数的原型如下:

cv2.imwrite(filename, img[, params])

参数说明:

  • filename:一个字符串,指定要保存的图像文件的名称和路径。该文件的路径可以是相对路径也可以是绝对路径。

  • img:需要保存的图像,通常是你处理过的图像数据。

  • params:该参数是可选的,表示一系列指定的写入参数。例如,对于JPEG图像,可以使用cv2.IMWRITE_JPEG_QUALITY来控制图像的质量。

例如,以下代码会保存一幅图像:

cv2.imwrite('output.jpg', img)

注意: imwrite()函数总是尝试将图像写入到文件中,如果指定的文件已经存在,它将会被新的图像文件覆盖。此外,虽然OpenCV支持多种图像格式,但是不是所有的图像格式都支持所有的颜色和像素深度。例如,JPEG不支持透明度通道,如果你试图保存一个包含透明度通道的图像为JPEG格式,透明度通道将会被忽略。因此,你应该选择合适的图像格式来保存你的图像。

pycharm运行测试:

import cv2 as cv

# 1 读取图像
img = cv.imread('readImage/image/springboot.png')
# 2 显示图像
# 2.1 利用opencv展示图像
cv.imshow('springboot', img)
cv.waitKey(0)
cv.destroyAllWindows()
# 3 保存图像
cv.imwrite('readImage/image/messigray.png', img)

 

转换图像的颜色空间

cvtColor()函数的原型如下:

cv2.cvtColor(src, code[, dst[, dstCn]])

参数说明:

  • src:输入图像。

  • code:颜色空间转换的类型。例如,cv2.COLOR_BGR2GRAY表示从BGR到灰度的转换,cv2.COLOR_BGR2HSV表示从BGR到HSV的转换。

  • dst:输出图像,通常不需要指定。

  • dstCn:输出图像的通道数,如果该参数有指定,那么这个通道数将应用到输出图像,否则,通道数将从src和code推断出来。

例如,下面的代码将一个BGR图像转换为灰度图像:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

注意: cvtColor()函数需要输入的图像是颜色图像,如果输入的是灰度图像,然后试图进行某些颜色空间的转换,例如从BGR到HSV的转换,将会产生错误。同时,不同的颜色空间转换类型需要的输入图像的通道数是不同的,例如,从BGR到灰度的转换需要3通道的输入图像,而从灰度到BGR的转换只需要1通道的输入图像。如果输入图像的通道数和颜色空间转换类型不匹配,将会产生错误。

图像的基本操作(获取像素值,修改像素值,获取图像的形状等)

在OpenCV和Python中,图像被表示为NumPy数组。这意味着我们可以使用标准的NumPy操作和函数来操作图像的像素和获取图像的属性。

1. 获取和修改像素值

        通过索引来访问和修改图像的像素值。例如,假设你有一幅BGR图像,你可以这样获取第y行第x列的像素的蓝色分量的值:

blue = img[y, x, 0]

修改这个像素的蓝色分量的值:

img[y, x, 0] = 255

2. 获取图像的形状

        可以使用NumPy的shape属性来获取图像的形状,这将返回一个元组,元素的顺序是(高度,宽度,通道数)。例如:

height, width, channels = img.shape

注意,对于灰度图像,shape属性将只返回高度和宽度。

3. 获取图像的数据类型

        可以使用NumPy的dtype属性来获取图像的数据类型。这对于调试非常有用,因为大部分在OpenCV中的错误是由无效的数据类型导致的。例如:

print(img.dtype)

注意: 因为像素值通常是无符号的8位整数(即范围在0到255之间),所以当你修改像素值时,需要确保新的像素值在这个范围内。如果像素值超出这个范围,将会被截断。例如,如果你尝试设置像素值为260,实际上会被设置为4。

二、视频的IO操作,读取和保存方法

读取视频文件或摄像头流

使用cv2.VideoCapture()函数来读取视频文件或摄像头流。例如:

cap = cv2.VideoCapture('video.mp4')  # 从文件读取
cap = cv2.VideoCapture(0)  # 从第一个摄像头读取

读取帧

ret, frame = cap.read()

        这个方法返回两个值:一个布尔值ret,如果帧已经正确读取,它将是True,否则是False;一个frame,这是读取的帧。

显示帧

cv2.imshow('Frame', frame)

保存帧

cv2.imwrite('frame.jpg', frame)

写入视频

使用cv2.VideoWriter()函数来创建一个VideoWriter对象,然后使用write()方法来写入帧。

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
out.write(frame)

注意,VideoWriter_fourcc()函数用于指定视频编码,VideoWriter()的参数分别是输出文件名、编码、帧率和帧大小。

释放资源

cap.release()
out.release()

案例:读取一个视频文件,将每一帧转换为灰度,然后写入到一个新的视频文件中.

import cv2

# 创建一个 VideoCapture 对象
cap = cv2.VideoCapture('video/ceshi1.mp4')

# 检查是否成功打开
if not cap.isOpened():
    print("Could not open video")
    exit()

# 获取一些视频的基本信息
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

# 创建一个 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (frame_width, frame_height), isColor=False)

while True:
    # 读取一帧
    ret, frame = cap.read()

    # 如果帧没有正确读取,就退出循环
    if not ret:
        break

    # 转换帧到灰度
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 写入帧到输出文件
    out.write(gray)

    # 显示帧
    cv2.imshow('Frame', gray)

    # 等待用户按下 'q' 键
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放 VideoCapture 和 VideoWriter
cap.release()
out.release()

# 关闭所有窗口
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt6.2教程——5.QT常用控件QLabel

1. QLabel简介 QLabel是Qt库中一个非常基础且重要的类。它主要用于在图形用户界面(GUI)中展示文本或图片。最常见的用法就是在窗口上显示一段文字或者标签,比如“用户名”,“密码”等等。QLabel继承自QFrame,因此它也可以具有框架。它能处理…

0005Java程序设计-jsp企业财务管理系统设计与实现

企业财务管理系统 摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用,企业发展速度在不断加快,在这种市场竞争冲击下企业财务管理系统必须优先发展,这样才能保证在竞争中处于优势地位。对此企业必须实现财务管…

安卓平板修改和平精英90帧、120帧超广角,2k/4k分辨率(无需root!!!)

前言:今天我们将探讨如何在安卓平板上修改和平精英超广角以及高帧率画质效果。 1、首先,我们要知道平板改超广角的好处是什么?我们都知道平板相比于手机显示宽度是要更大的,如果平板再改个超广角效果,甚至连脚都可以看…

避免滥用Qt信号与槽——改进taskBus 平台以吞吐20M IQ采样带宽

taskBus 软件无线电平台是一款依靠 stdin-stdout进行数据吞吐的教学平台。在平台创建之初,主要使用 RTL-SDR进行简单的窄带接收应用,并没有考虑采样率超过1.8M的情况。引入 USRP B210/B205mini后,采样率瞬间提高到2M以上,此时&…

springboot+vue项目中如何利用七牛云实现头像的上传

做了个前后端分离的项目,对于用户的头像修改一直不是很满意, 于是用了Vant4的组件库改成了文件点击上传,先是打算存到本地,了解到七牛云的方便后(主要是免费),决定改成七牛云存储图片&#xff…

ElasticSearch的安装和访问

ElasticSearch的安装 前言: 本次下载是在Windows系统进行操作,版本为7.6.1,因为下周最新版本的8.1.2有问题 ElasticSearch基于Java开发,JDK最低1.8版本 ElasticSearch的版本要和之后引入的Maven的Jar包版本对应 1 下载ElasticSearch 官网:https://www.elastic.co/cn/ 产品…

01.2总线驱动设备设计思想

sysfs文件系统 sysfs文件系统是Linux2.6版本引入的虚拟文件系统。sysfs把连接在系统上的设备模型组织_ 成为一个分级的层次视图。并且可以向用户空间导出内核数据结构以及属性。 比如下面的图可以看出来当前支持的总线和相关的数据 在sys文件系统中每一个目录都对应着一个kob…

电商项目10:商品管理、仓库管理

电商项目10:商品管理、仓库管理 1、商品管理1.1、spu检索1.1.1、后端1.1.2、前端 1.2、sku检索1.2.1、后端 2、库存管理2.1、启动ware后端微服务2.2、仓库维护查询2.3、查询商品库存2.4、查询采购需求 1、商品管理 1.1、spu检索 1.1.1、后端 spu检索接口文档 S…

用了这么久IDEA其中中的Modules、Libraries、Facets、Artificats他们的作用到底是什么?

Modules Modules通常是说我们该项目当前拥有的模块。拿微服务来说,通常需要将功能分离出来,形成一个个模块,因此每个功能就需要一个模块Modules,即一个小项目。 里面有Sources、Paths、Dependencies。像Sources我们可以将我们想…

如何安装 kubernetes dashboard 让 k8s 的操作可视化

kubernetes dashboard 是 k8s 自带的 k8s 图形化管理工具。使用这个工具可以帮助用户通过图形化页面配置 k8s 资源,掌握 k8s 系统的整体使用情况,把用户的双手从敲 kubectl 命令中解放出来。 下面我们就介绍安装 kubernetes dashboard 的详细步骤。 下载…

d2l_notes_ch1-ch2

1. 引言 1)机器学习 > 表示学习 > 深度学习 表示学习是机器学习子集,其研究重点是如何⾃动找到合适的数据表示方式。深度学习是通过学习多层次的转换来进⾏的多层次的表示学习。 深度学习是机器学习的一个子集,但相比传统的机器学习方…

DevOps系列文章之Docker部署web ssh工具sshwifty

一、介绍 1.sshwifty简介 sshwifty是一款Web SSH & Telnet(WebSSH & WebTelnet 客户端工具。 2.shwifty 特点 shwifty 是为 Web 设计的 SSH 和 Telnet 连接器。它可以部署在您的计算机或服务器上,为任何兼容(标准)的网络…

自定义Spring Boot Starter

Spring Boot starter 我们知道Spring Boot大大简化了项目初始搭建以及开发过程,而这些都是通过Spring Boot提供的starter来完成的。在实际项目中一些基础模块其本质就是starter,所以我们需要对Spring Boot的starter有一个全面深入的了解,这是…

Codesys单轴控制实现多段速控制功能

b一、序言 在设备加工行业,很多工艺要用到多段速控制,比如切割,打孔,攻丝等,刀具未碰到工件时可以快速行走,刀具碰到工件时需要慢速加工,而有些工艺在加工时随着刀具越走越深,其进刀…

掌握Python的X篇_4_开发工具ipython与vscode的安装使用,作业

本篇将会介绍两个工具的安装及使用来提高Python的编程效率。 ipython:比python更好用的交互式开发环境vscode:本身是文本编辑器,通过安装相关的插件vscode可以作为python集中开发环境使用 掌握Python的X篇_4_开发工具ipython与vscode的安装使…

GIT保存记录原理之commit对象

GIT 中提交对象非常的重要,我们通过它记录代码提交过程、进行文件保存、回退等操作,那么它是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的 .git 文件夹中。 新建空项目 gitDemo使用 git init初始化,在文件夹根目录…

57 KVM工具使用指南-制作 LibcarePlus 热补丁

文章目录 57 KVM工具使用指南-制作 LibcarePlus 热补丁57.1 概述57.2 手动制作57.3 通过脚本制作 57 KVM工具使用指南-制作 LibcarePlus 热补丁 57.1 概述 LibcarePlus 支持如下方式制作热补丁: 手动制作通过脚本制作 手动制作热补丁的过程繁琐,对于…

java——反射与注解

文章目录 Java反射基础1. 概念详解2. 示例代码 Java反射进阶1. 框架设计2. 动态代理3. 模板方法 Java注解基础1. 概念2. 基本语法3. 自定义注解4. 反射获取注解信息 Java注解进阶1. 应用场景2. 内置注解3. 第三方注解库4. 总结 Java反射与注解实战1. 实战场景2. 代码实现 Java反…