opencv入门到精通——图片,视频,摄像头的读取与保存

 简介


OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C++语言编写,同时也支持Python、Java、C等语言。由于其开源和广泛使用的特点,在计算机视觉和机器学习领域得到了广泛的应用。


1.计算机眼中的图像

RGB图像是一种由红色(R)、绿色(G)和蓝色(B)三个颜色通道组成的彩色图像。每个像素点都有三个数值,分别代表其在红色、绿色和蓝色通道中的亮度。每个数的取值为(0-255),三个不同的值组合就形成一个像素点。

这三个通道共同组成了RGB图像,它们的组合形成了每个像素点的颜色。通过调整每个通道的亮度和色彩分布,可以改变图像的颜色和外观。

import cv2
import numpy as np# 读取图片
image = cv2.imread('image/1.jpg')
#   打印图片的形状,即高宽和通道数
h, w, c = image.shape
print(h, w, c)#  打印(60,60)的像素点的rgb值
pixel = image[60, 60]
print(pixel)#  创建一个空数组和图像格式大小相同
pixels = np.zeros((h, w, c), dtype=np.uint8)
# 遍历每个像素点
for y in range(h):for x in range(w):# 获取像素点的数值pixel = image[y, x]# 将像素点的数值存储到新数组中pixels[y, x] = pixel# 输出结果
print(pixels)

 打印结果如下所示,这就是一张的图片在计算机眼中的结构,实操过程中可以采用断点方式依次打印。

当然以上是为了更好的看清图片的本质,我们可以直接用数组完成上述的操作

import cv2
import numpy as np# 读取图片
image = cv2.imread('image.jpg')# 将图像转换为NumPy数组
pixels = np.array(image)# 输出结果
print(pixels)

2.图片的读取、显示与保存

import cv2# 读取图片并转为灰度图
# image = cv2.imread('image/1.jpg')
image = cv2.imread('image/1.jpg', cv2.IMREAD_GRAYSCALE)
# 显示图片窗口,并命名为 'IMG'
cv2.imshow('IMG', image)# 保存到image路径下并命名为jujingyi
cv2.imwrite('image/jujingyi.jpg', image)
# 等待键盘输入,参数为0表示一直等待,直到按下任意键
cv2.waitKey(0)# 关闭所有打开的窗口
cv2.destroyAllWindows()

 cv2.imread()函数用来读取图片

cv2.imwrite()函数用来保存图片

cv2.waitKey(0) 0表示按任意键停止,1000表示1000毫秒后关闭窗口

 

3.视频的读取与显示

import cv2cap = cv2.VideoCapture(0)while True:success, image = cap.read()cv2.imshow('IMG', image)# 等待1毫秒,检测键盘输入if cv2.waitKey(1) & 0xFF == ord('q'):break# 循环结束后释放摄像头资源和关闭窗口
cap.release()
cv2.destroyAllWindows()

cv2.VideoCapture(0)  设为0 表示使用电脑自带的摄像头,使用外设的话,选择1或者2,具体查看你的外设摄像头在电脑中的编号。你也可以输入视频地址来读取指定视频。

使用while循环来遍历摄像头读取的每一帧图片,并存入image中。

我们使用了 cv2.waitKey(1) 函数等待1毫秒并检测键盘输入。使用位运算符 & 和函数 ord() 将键盘输入的字符与 ASCII 码中字符 'q'(即按下 'q' 键)进行比较。如果相等,则通过 break 语句退出循环。

当退出循环后,我们需要释放摄像头资源和关闭窗口。使用 cap.release() 释放摄像头资源,然后调用 cv2.destroyAllWindows() 关闭显示窗口。

这样,当按下键盘上的 "q" 键时,程序会退出循环,并释放摄像头资源和关闭窗口。

如果我们希望保存我们摄像头记录的图片

import cv2cap = cv2.VideoCapture(0)# 设置保存视频的参数
save_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
save_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (save_width, save_height))while True:success, image = cap.read()cv2.imshow('IMG', image)# 保存每一帧图像到视频文件out.write(image)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
out.release()
cv2.destroyAllWindows()

我们根据摄像头的参数设置视频保存的相关参数:保存的视频宽度和高度与摄像头的参数相同,使用四字符码(fourcc)定义视频编解码器为XVID,帧率设定为20.0,并指定保存的视频尺寸。

在进入循环之前,我们使用cv2.VideoWriter()函数创建一个用于保存视频的对象。其中,第一个参数是保存的视频文件名,第二个参数是指定视频编解码器,第三个参数是帧率,第四个参数是保存的视频尺寸。

在循环中,每一帧图像都会被保存到视频文件中,通过out.write(image)实现。

最后,在退出循环后,我们需要释放摄像头资源和关闭视频对象。使用cap.release()释放摄像头资源,out.release()关闭视频对象。

这样,当按下键盘上的 "q" 键时,程序会退出循环,并保存摄像头读取的数据为视频文件 "output.avi"。

其中

cv2.VideoWriter()函数用于创建一个用于保存视频的对象。它的参数解释如下:

filename: 保存的视频文件名。 这里的 'output.avi' 是保存视频的文件名,可以根据需要自行更改。

fourcc: 视频编解码器。 fourcc 是一个四字符码,用于指定视频的编解码器。常见的四字符码包括 MP4V、XVID、MJPG等,可以根据需要选择。在示例代码中,我们使用了 *'XVID' 表示使用 XVID 编解码器。

fps: 帧率(Frames per Second)。 fps 表示保存视频时的帧率,即每秒播放的帧数。在示例代码中,我们将帧率设定为20.0,可以根据需要进行调整。

frameSize: 视频尺寸。 frameSize 是保存视频时的尺寸,即每一帧图像的大小。在示例代码中,我们将尺寸设置为(save_width, save_height),其中 save_width 和 save_height 是根据摄像头的参数获得的宽度和高度
 

如果你想保存为MP4格式的视频文件,你可以修改fourcc参数为适合MP4格式的编解码器

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (save_width, save_height))

 

在上述代码中,我们使用了*'mp4v'作为fourcc参数,表示使用MP4编解码器。同时,将保存的文件名改为 'output.mp4'

这样修改后,摄像头读取的数据将以MP4格式进行保存。请确保你的OpenCV版本支持该编解码器,否则可能会出现错误。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 友元函数和友元类

前言 在本文中,您将学习在C 中创建友元函数和友元类,并在程序中有效地使用它们。OOP的重要概念之一是数据隐藏,即非成员函数无法访问对象的私有或受保护的数据。但是,有时这种限制可能迫使程序员编写冗长而复杂的代码。因此&#…

AJAX: 对话框大全

AJAX:$.ajax({url: "/admin/cutting/getDataWeek",type: "GET",data:{},dataType:json,success: function (res) {if (res.code 1) {}},error:function (error) {console.log(请求失败);console.log(error);}}); $(.sub).unbind(click).click(funct…

Note——torch.size() umr_maximum() array.max() itertools.product()

torch.size Problem TypeError: ‘torch.Size’ object is not callable Reason Analysis torch.Size函数不可调用 因为torch只可以.size() 或 shape Solution 将y.shape()替换为y.size() 或 y.shape ytorch.normal(0,0.01,y.size())2 return umr_maximum(a, axis, None…

【斗罗二】天梦哥告白冰帝,唐三再返场,雨浩通过冰帝考验,觉醒新武魂

Hello,小伙伴们,我是小郑继续为大家深度解析斗罗大陆2绝世唐门国漫资讯。 斗罗大陆动画第二部绝世唐门第19集已经更新了,全都是霍雨浩与天梦哥在极北之地,吸引冰帝加入造神计划的过程。不仅有天梦哥的爱情宣言告白,唐三也再次限时…

Python学习笔记——类、魔术方法

食用说明:本笔记适用于有一定编程基础的伙伴们。希望有助于各位! 类 类的运用很常见:在大部分情况下,对一些特有的对象,可以使用特定的类来指向它: class Person:name unknownage -1sex 0partner No…

逗号表达式

#include<stdio.h> int cmp() {return(2,1); } int main() {int z cmp();printf("%d",z);return 0; } 逗号表达式括号里的优先级是自左向右&#xff0c;最后一个值为最终的结果。

反向传播back propagation

深度学习概述 决定要怎么连接这些neuron的时候 就已经确定了function set 相比于之前做logistic regression&#xff0c;linear regression的时候&#xff0c;换一个方式来决定function set 比较大&#xff0c;包含了logistic regression&#xff0c;linear regression没法包含…

01、Python 安装 ,Pycharm 安装

目录 安装安装 Python安装 Pycharm 创建项目简单添加文件运行 简单爬取下载小视频 安装 python-3.8.10-amd64.exe – 先安装这个 pycharm-community-2022.2.exe 再安装这个 安装 Python python-3.8.10-amd64.exe 安装&#xff08;这个是其他版本的安装&#xff0c;步骤一样…

[C++]3.类和对象下(this指针补充)+ 类和对象中构造函数和析构函数。

类和对象下&#xff08;this指针补充&#xff09; 类和对象中构造函数和析构函数 一.this补充&#xff1a;1.概念总结&#xff1a;2.两个问题&#xff1a; 二.构造函数和析构函数&#xff1a;一.类的默认构造&#xff1a;1.初始化和清理&#xff1a;2.拷贝复制&#xff1a;3.取…

打卡go学习第一天

8.1 下面展示一些 代码。 package mainimport ("fmt""net""os""time" )type Clock struct {Name stringAddr string &#xff5d; func main() {clocks : []Clock{{Name: "New York", Addr: "localhost:8000"…

基于深度学习网络的蔬菜水果种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1数据集准备 4.2构建深度学习模型 4.3模型训练 4.4模型评估 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; wa…

如何更换微信公众号主体?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不止局限…

CAD Exchanger SDK 3.22.0 Crack

Docker 映像、Autodesk Inventor 2022 支持以及从 CAD Exchanger 3.22.0 中的 CATIA 导入属性 使用 Docker 映像将您的软件运送到任何地方&#xff0c;独立于 Autodesk 软件读取 .ipt、.iam 文件&#xff0c;从 CATIA 探索机械、产品和自定义属性。 软件开发工具包产品更新发明…

使用 Rust 开发:以太坊与 Layer2 生态建设新趋势

Rust 是一种系统编程语言&#xff0c;以其出色的性能、内存安全和并发性而闻名&#xff0c;在区块链和 Web3 中广泛应用&#xff0c;大多数编程语言和开发框架都以 Rust 为核心&#xff0c;如 Polkadot、Solana、NEAR、Elrond&#xff08;现名 MultiversX&#xff09;、Hyperle…

华为云文件上传(单个上传和分段上传)

首先引入静态文件&#xff1a; 华为云官网提供js下载的链接 然后后端提供一个公用接口&#xff0c;返回华为云上传的基本配置&#xff1a; 官网提供的链接&#xff1a;华为云obs信息配置 一&#xff1a;单个上传 huaweiyunUpload (file, fileName, name, url, size, callb…

13.3测试用例进阶

一.测试对象划分 1.界面测试(参考软件规格说明书和UI视觉稿) a.什么是界面 1)WEB站(浏览器) 2)app 3)小程序 4)公众号 b.测试内容 1)界面内容显示的一致性,完整性,准确性,友好性.比如界面内容对屏幕大小的自适应,换行,内容是否全部清晰展示. 2)验证整个界面布局和排版…

设计模式_中介者模式

中介者模式 介绍 设计模式定义案例问题堆积在哪里解决办法中介者代替了多个对象之间的互动 使对象1 2 3 之间的互动 变为&#xff1a; 对象1->中介 对象2->中介 对象3->中介好友之间 约饭好友1 通知 好友2 -3 -4 等等加一个群 谁想吃饭就 通知一下 类图 代码 角色 …

【ROS 2 Humble】 Ubuntu 20.04(Focal)平台 源码安装

提问链接&#xff1a; https://answers.ros.org/questions/ —————————————— ROS 1 各版本支持截止时间查看 ROS 1 支持时间查看 链接 https://wiki.ros.org/Distributions ROS 2 各版本支持截止时间查看 ROS 2 版本支持时间查看 ROS 2 https://docs.ros.…

element-ui中表格树类型数据的显示

项目场景&#xff1a; 1&#xff1a;非懒加载的情况 1&#xff1a;效果展示 2&#xff1a;问题描述以及解决 1&#xff1a;图片展示 2&#xff1a;html <-- default-expand-all 代表默认展开 如果不展开删除就行 --> <el-tableref"refsTable"v-loadin…

高速DSP系统设计参考指南(六)锁相环(PLL)

&#xff08;六&#xff09;锁相环&#xff08;PLL&#xff09; 1.模拟锁相环2.数字锁相环3.PLL隔离技术 系统设计人员需要隔离PLL&#xff0c;使其免受内部和外部噪声的影响。PLL通常用作频率合成器&#xff0c;将输入时钟乘以一个整数。该整数是反馈计数器M除以输入计数器N的…