Python-Opencv图像处理的小坑
1.背景
最近在做一点图像处理的事情,在做处理时的cv2遇到一些小坑,希望大家遇到的相关的问题可以注意!!
2. cv2.imwrite保存图像
cv2.imwrite(filename, img, [params])
filename:需要写入的文件名,包括路径和文件名,以及期望的扩展名(例如,.jpg,.png,.bmp等)。img:需要保存的图像数据。这通常是通过其他OpenCV函数(如cv2.imread()或cv2.cvtColor()等)获得的NumPy数组。params:这是一个可选参数,用于指定JPEG或PNG格式的压缩级别等。对于其他格式,此参数将被忽略。默认值为空列表[]。
cv2.imwrite('output.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 50])
将JPEG的压缩质量设置为50(最高质量为100),然后将图像保存为新的文件'output.jpg'。这样保存的图像将具有较低的质量和较小的文件大小。
需要注意的是,这种压缩方法是有损的,也就是说,压缩过程中会丢失一些图像信息。因此,压缩后的图像可能无法完全还原为原始图像。在实际应用中,需要根据需求和图像类型来权衡压缩质量和文件大小。
坑1:cv2.imshow显示白茫茫的问题
cv2.imwrite()函数在保存图像时,通常会将图像数据的dtype(数据类型)转换为8位无符号整数类型(即dtype为uint8),而cv2.imshow不会处理图像成uint8,例如模型推理出来是float32类型,如果用cv2.imshow显示灰度图像的话就会出现白茫茫一片!!!
|
cv2.imshow显示 |
cv2.imwrite保存的图片 |
思路一:直接float32转uint8!!回答:可以!但效果不好
image = image.astype(np.uint8)
在轮廓边边的时候会出现锯齿!!!(图像中偏白的线条很明显)
|
|
思路二:先归一化再转uint8呢? 回答:可以!效果很好!!!
image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX)
image = image.astype(np.uint8)
|
|
现在可以知道cv2.imwrite使用了归一化和类型转换
注意:使用cv2.imshow后面要跟着cv2.waitKey(0)或者下面的代码,不然会出现不显示的问题。
if cv2.waitKey(1) & 0xFF == ord('q'):
break
3. cv2保存视频
cap = cv2.VideoCapture('test.mp4')
# 检查视频是否成功打开
if not cap.isOpened():print("Error: Couldn't open the video file.")return# 获取视频的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 设置视频编码器并创建输出视频对象
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 选择适当的编码器,例如'XVID', 'MJPG', 'MP4V', 等等
out = cv2.VideoWriter('output_file.avi', fourcc, fps, (352, 288), isColor=False)
while cap.isOpened():ret, frame = cap.read() # 读取下一帧# 图片数据前处理if not ret:breakimg = data_pre_processing(frame)compressed_data = sess.run(outputs_name, {input_name: img})compressed_image = data_post_processing(compressed_data)compressed_image = cv2.normalize(compressed_image, None, 0, 255, cv2.NORM_MINMAX)compressed_image = compressed_image.astype(np.uint8)out.write(compressed_image)# 释放资源并关闭视频文件
cap.release()
out.release()
坑2:保存灰度视频出错
我在数据后处理时使用了下面的代码,将rgb转成了灰度图像,但是cv2保存视频默认是rgb的,导致保存的视频只有几KB的错误视频。
cv2.cvtColor(compressed_image, cv2.COLOR_RGB2GRAY)
解决思路:查文档的api使用
cv2.VideoWriter中的
isColor参数
isColor=False: 指定输出视频是否为彩色。isColor被设置为False,表示输出视频将是灰度的(即不是彩色的)。如果你希望输出彩色视频,应该将其设置为True。默认是彩色的
相关文章:
Python-Opencv图像处理的小坑
1.背景 最近在做一点图像处理的事情,在做处理时的cv2遇到一些小坑,希望大家遇到的相关的问题可以注意!! 2. cv2.imwrite保存图像 cv2.imwrite(filename, img, [params]) filename:需要写入的文件名,包括路…...
[LCTF 2018]bestphp‘s revenge
文章目录 前置知识call_user_func()函数session反序列化PHP原生类SoapClient 解题步骤 前置知识 call_user_func()函数 把第一个参数作为回调函数调用 eg:通过函数的方式回调 <?php function barber($type){echo "you wanted a $type haircut, no problem\n";}c…...
HTML中常用表单元素使用(详解!)
Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中常用表单元素使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 …...
掌握C++模板的艺术:类型参数、默认值和自动推导
掌握C模板的艺术:类型参数、默认值和自动推导 模板参数 类型模板参数 在 Grid 示例中,Grid 模板有一个模板参数:存储在网格中的类型。编写类模板时,您需要在尖括号内指定参数列表,例如: template <typename T&g…...
Unity_使用FairyGUI搭建登录页面
Unity_使用FairyGUI搭建登录页面 1. 使用FairyGUI准备一个UI界面,例如:以下登录 2. 发布导出(发布路径设置为Unity的Asset下任何路径) 3. Unity编辑器安装FairyGUI包资源(在资源商店找见并存储为我的资源,…...
百岁时代即将来临,原知因成为消费新潮流
什么叫长寿时代?泰康保险首席执行官陈东升指出:长寿时代,就是百岁人生即将来临,人人带病长期生存。而在这个时代,人类最大的变化在于“生命尺度的改变”,比如过去20岁是年轻人,40岁中年人,60岁…...
16:00的面试,16:07就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到六月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40…...
VUE宝典之el-dialog使用
文章目录 🍁前言🍁el-dialog简介🍁el-dialog属性🍁el-dialog示例🍁父子组件值传递示例 🍁前言 el-dialog是Element UI库中的一个重要组件,用于在Vue应用程序中创建弹出框。它提供了一组实用的属…...
Cocos Creator:坐标系
Cocos Creator:坐标系 坐标系节点位置坐标转换v3.8 实现原理(不想了解可以直接跳过)简单示例:(干货or解决方案在这里!) 锚点缩放和旋转 总结心得 在 Cocos Creator 3.8 中,节点坐标系…...
logback日志框架使用
依赖引入 <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version> </dependency> 使用logback日志框架只需要引入以上即可,(我们平时使用较多的Slf4j…...
【八】python装饰器模式
文章目录 8.1 装饰器模式简介8.2 装饰器模式作用8.3 装饰器模式构成8.3.1 装饰器模式包含以下几个核心角色:8.3.2 UML类图 8.4 装饰器模式python代码实现8.4.1 基本装饰器的使用8.4.2 多个装饰器的执行顺序8.4.3 带返回值的装饰器的使用8.4.4 装饰器模式-关联类模式…...
Unity-小工具-LookAt
Unity-小工具-LookAt 🥙介绍 🥙介绍 💡通过扩展方法调用 gameObject.LookAtTarget,让物体转向目标位置 💡gameObject.StopLookat 停止更新 💡可以在调用时传入自动停止标记,等转向目标位置后自…...
TCP实现一对一聊天
一,创建类 二,类 1.ChatSocketServer类 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Sca…...
全面高压化与全面超快充,破解新能源汽车的时代难题
是什么让新能源车主感到疲惫与焦虑?是什么阻挡更多消费者选择新能源汽车?我们在身边进行一个简单的调查就会发现,问题的答案非常一致:充电。 充电难,充电慢的难题,始终是困扰新能源汽车产业发展,…...
02 CSS基础入门
文章目录 一、CSS介绍1. 简介2. 相关网站3. HTML引入方式 二、选择器1. 标签选择器2. 类选择器3. ID选择器4. 群组选择器 四、样式1. 字体样式2. 文本样式3. 边框样式4. 表格样式 五、模型和布局1. 盒子模型2. 网页布局 一、CSS介绍 1. 简介 CSS主要用于控制网页的外观&#…...
MyBatis框架中的5种设计模式总结
前言 MyBatis框架中使用的5种设计模式分别是:1、建造者模式(生成器模式)。2、工厂模式。3、单例模式。4、代理模式。5、适配器模式。 1、建造者模式(生成器模式) 在MyBatis环境的初始化过程中,SqlSessio…...
ffmpeg相关命令
视频转码 dav转化为mp4格式 ffmpeg -i 2021-08-10.dav -codec copy 11.mp4二进制文件转为mp4格式 // -c:v 指定视频流编码器,不指定编码会默认用mp4这种容器的默认音视频编码进入编码 // copy:不重新编码直接copy源视频流ffmpeg -i 1701687125-4fc72a…...
锂电3V升12V1A升压芯片WT3209
锂电3V升12V1A升压芯片WT3209 WT3209是一款高功率密度全集成BOOST升压转换器,具备高效能解决方案。3V升12V1A,5V升12V1A WT3209内部集成的功率MOSFET管导通电阻为上管13mΩ和下管11mΩ,具备2A开关电流能力,并且能够提供高达12.6V的输出电压。…...
Unity 置顶OpenFileDialog文件选择框
置顶文件选择框 🌭处理前🥙处理后 🌭处理前 🥙处理后 解决方案...
oomall课堂笔记
一、项目分层结构介绍 controller层(控制器层): 作用:负责输出和输入,接收前端数据,把结果返回给前端。 1.处理用户请求,接收用户参数 2.调用service层处理业务,返回响应 servi…...
大模型注意力机制深度解析:从Dot-Product到Flash Attention的演进之路
引言如果让你用一句话概括过去七年人工智能领域最重要的技术突破,答案几乎毫无悬念——注意力机制(Attention Mechanism) 。2017年,Google团队在论文《Attention Is All You Need》中首次提出Transformer架构,彻底摒弃…...
C++11多线程与线程管理
一、线程基础 1.1 thread默认构造函数 std::thread::thread() _NOEXCEPT {_Thr_set_null(_Thr); }默认构造函数创建一个空线程对象,不关联任何执行线程。 1.2 thread带参数构造函数 explicit thread(Fn &&, Args &&...);可变参数模板,可…...
技术文档检索总失败?Perplexity的chunking策略、embedding模型选型与rerank阈值调优(附实测Benchmark数据)
更多请点击: https://codechina.net 第一章:技术文档检索总失败?Perplexity的chunking策略、embedding模型选型与rerank阈值调优(附实测Benchmark数据) 技术文档检索失败常源于文本切分不合理、语义表征能力不足或重排…...
Hermes Agent 权限分级实战:3 级凭证隔离配置与 4 类越权风险规避
1. 权限不是加个 if 就完事:Hermes Agent 的凭证隔离为什么必须分三级 我第一次在生产环境上线 Hermes Agent 时,给所有子智能体(sub-agent)统一配了同一个数据库只读账号。逻辑很朴素:「反正只读,能出什么问题?」——直到某天凌晨三点,监控告警显示核心订单库被高频扫…...
国产ARM主板实战:从设计选型到性能优化的嵌入式开发指南
1. 项目概述:从“能用”到“好用”的国产ARM主板之路最近几年,如果你关注过硬件开发、嵌入式系统或者国产化替代的圈子,一定会频繁听到“国产ARM主板”这个词。它不再是实验室里的样品,而是越来越多地出现在工业控制、边缘计算、智…...
Anaconda安装后必做的两件事:快速配置清华镜像源和验证环境(附常用conda命令清单)
Anaconda安装后的高效配置指南:镜像加速与环境验证全攻略 当你第一次打开Anaconda Prompt时,那种面对全新工具既兴奋又忐忑的心情我深有体会。作为Python数据科学领域的瑞士军刀,Anaconda的强大功能背后隐藏着许多新手容易忽略的配置细节。本…...
如何在Vue3项目中3步完成专业代码编辑器集成:终极指南
如何在Vue3项目中3步完成专业代码编辑器集成:终极指南 【免费下载链接】vue-codemirror codemirror code editor component for vuejs 项目地址: https://gitcode.com/gh_mirrors/vu/vue-codemirror 还在为Vue3项目寻找完美的代码编辑器组件吗?vu…...
5大技术模块深度解析:基于Simscape Electrical的无刷直流电机控制仿真
5大技术模块深度解析:基于Simscape Electrical的无刷直流电机控制仿真 【免费下载链接】Design-motor-controllers-with-Simscape-Electrical This repository contains MATLAB and Simulink files used in the "How to design motor controllers using Simsca…...
告别手写代码!用Roboflow的Auto-Orient和Mosaic增强你的YOLO数据集(附完整流程)
零代码实现YOLO数据集增强:Roboflow自动化工具全解析 在目标检测领域,数据质量往往直接决定模型性能上限。传统数据增强方法需要开发者手动编写Python脚本调整图像方向、处理标注格式,不仅耗时耗力,还容易因格式兼容性问题导致训练…...
在Nodejs后端服务中集成Taotoken实现统一的大模型调用网关
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Nodejs后端服务中集成Taotoken实现统一的大模型调用网关 当你的后端服务需要接入多种大模型能力时,直接对接不同厂商…...



