基于OpenCV实战(基础知识一)
目录
简介
1.计算机眼中的图像
2.图片的读取、显示与保存
3.视频的读取与显示
简介
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版本支持该编解码器,否则可能会出现错误。
相关文章:

基于OpenCV实战(基础知识一)
目录 简介 1.计算机眼中的图像 2.图片的读取、显示与保存 3.视频的读取与显示 简介 OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和…...
如何高效的接入第三方接口
作为程序员的我们,经常会接到领导的安排,接入某某的接口,方面我们如何如何, 例如:领导在1号时给作为员工的你说,最近系统需要增加一个新的支付方式,一会和对方技术组建一个群,有什么问题,可以直接在群里说,最近还说,尽快接入,客户等着用,让你在5号前,完成接入工…...
docker pip下载依赖超时或失败问题解决
Docker容器使用pip安装Python库时超时,可能是由于多种原因。以下是一些建议和解决方法: 使用国内镜像源: 如果你位于中国,可以尝试更换到国内的镜像源。例如,可以使用阿里云、腾讯云、清华大学提供的镜像。 你可以在Dockerfile中添…...

python并发编程
一、程序提速的方法 二、python对并发编程的支持 多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成;多进程:multiprocess,利用多核CPU的能力,真正的并行执行任务&am…...
【面试题】:前端怎么实现权限设计及遇到的bug
一.权限的概念 前端权限分为页面权限、按钮权限、API权限。 二.页面权限的实现过程 ①用户登录进去调用获取用户信息接口,后端会给我们返回一个权限标识符 ②在获取到数据之后,我们就要判断用户能访问到哪些页面,我们可以在vuex中permission模块中的action…...

Vue 2 插槽
可以先阅读组件基础-简单了解通过插槽分发内容。 一、插槽定义 插槽将子组件标签间的内容分发到子组件模板的<slot>标签位置。 如果没有<slot>标签,那么该内容将被丢弃。 二、编译作用域 内容在哪个作用域编译,就可以访问哪个作用域的数据…...

Spring 容器启动耗时统计
为了了解 Spring 为什么会启动那么久,于是看了看怎么统计一下加载 Bean 的耗时。 极简版 几行代码搞定。 import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;import java.util.HashMap; imp…...
1. 优化算法学习
参考文献 1609:An overview of gradient descent optimization algorithms 从 SGD 到 Adam —— 深度学习优化算法概览(一) - 知乎 机器学习札记 - 知乎...

再获荣誉丨通付盾WAAP解决方案获“金鼎奖”优秀金融科技解决方案
今年四月,2023中国国际金融展在首钢会展中心成功落下帷幕。中国国际金融展作为金融开放创新成果的展示、交流、传播平台,历经多年发展,已成为展示中国金融发展成就、宣传金融改革成果、促进金融产业创新和推动金融信息化发展的有效平台。 “金鼎奖”评选…...

【腾讯云 TDSQL-C Serverless 产品测评】“橡皮筋“一样的数据库『MySQL高压篇』
【腾讯云 TDSQL-C Serverless 产品测评】"橡皮筋"一样的数据库 活动介绍服务一览何为TDSQL ?Serverless 似曾相识? 降本增效,不再口号?动手环节 --- "压力"山大实验前瞻稍作简介资源扩缩范围(CCU&…...
python http文件上传
server端代码 import os import cgi from http.server import SimpleHTTPRequestHandler, HTTPServer# 服务器地址和端口 host = 0.0.0.0 port = 8080# 处理文件上传的请求 class FileUploadHandler(SimpleHTTPRequestHandler):def do_POST(self):# 解析多部分表单数据form = …...

Android学习之路(9) Intent
Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: 启动 Activity Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity()&…...

vue项目配置git提交规范
vue项目配置git提交规范 一、背景介绍二、husky、lint-staged、commitlint/cli1.husky2.lint-staged3.commitlint/cli 三、具体使用1.安装依赖2.运行初始化脚本3.在package.json中配置lint-staged4.根目录新增 commitlint.config.js 4.提交测试1.提示信息格式错误时2.eslint校验…...

影响交叉导轨运行速度的因素有哪些?
交叉导轨具有精度高,速度快,承载能力大、结构简单等特点,被广泛应用在固晶机、点胶设备、自动化设备、OA机器及其周边机器、测定器、印刷基板开孔机,精密机器,光学测试仪、光学工作台、操纵机构、X 射缐装置等的滑座部…...
List转Map
一、list转map Map<Long, User> maps userList.stream().collect(Collectors.toMap(User::getId,Function.identity())); 看来还是使用JDK 1.8方便一些。 二、另外,转换成map的时候,可能出现key一样的情况,如果不指定一个覆盖规则&…...

ES:一次分片设计问题导致的故障
### 现象: 1. 单节点CPU持续高 2.写入骤降 3.线程池队列积压,但没有reject 4.使用方没有记录日志 ### 排查 1.ES监控 只能看到相应的结果指标,无法反应出原因。 2.ES日志:大量日志打印相关异常(routate等调用栈&a…...

vue 简单实验 自定义组件 综合应用 传参数 循环
1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"todo-list-app"><ol><!--现在我们为每个 todo-item 提供 todo 对象todo 对象是变量,即其内容可以是动态的。…...
【OpenCV实战】2.OpenCV基本数据类型实战
OpenCV基本数据类型实战 〇、实战内容1 OpenCV helloworld1.1 文件结构类型1.2 CMakeList.txt1.3 Helloworld 2. Image的基本操作3. OpenCV 基本数据类型4. 读取图片的像素 & 遍历图片4.1 获取制定像素4.2 遍历图片 5. 图片反色5.1 方法1 :遍历5.2 方法2 &#…...

MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式
目录 引言 一、使用正确的方式实现分页 1.1.什么是分页 1.2.MyBatis中的分页实现方式 1.3.避免SQL注入的技巧 二、特殊字符的正确使用方式 2.1.什么是特殊字符 2.2.特殊字符在SQL查询中的作用 2.3.如何避免特殊字符引起的问题 2.3.1.使用CDATA区段 2.3.2.使用实体引…...

安装Node(脚手架)
目录 一,安装node(脚手架)1.1, 配置vue.config.js1.2, vue-cli3x的目录介绍1.3, package.json 最后 一,安装node(脚手架) 从官网直接下载安装即可,自带npm包管…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...

C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
更新 Docker 容器中的某一个文件
🔄 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法,适用于不同场景。 ✅ 方法一:使用 docker cp 拷贝文件到容器中(最简单) 🧰 命令格式: docker cp <…...

代理服务器-LVS的3种模式与调度算法
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件:…...