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。默认是彩色的

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

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

相关文章

代码随想录算法训练营 ---第五十八天

今天开启单调栈的征程。 第一题: 简介: 本题有两种解法,第一种:暴力破解 两层for循环 时间复杂度为O(n^2) 超时了 第二种:单调栈解法也是今天的主角。 单调栈是什么? 单调递增栈:单调递增栈…

计算机操作系统4

1.什么是进程同步 2.什么是进程互斥 3.进程互斥的实现方法(软件) 4.进程互斥的实现方法(硬件) 5.遵循原则 6.总结: 线程是一个基本的cpu执行单元,也是程序执行流的最小单位。 调度算法:先来先服务FCFS、短作业优先、高响应比优先、时间片…

大数据项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈:大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据爬虫、机器学…

第七次作业

1, 给定一个包含n1个整数的数组nums,其数字在1到n之间(包含1和n),可知至少存在一个重复的整数,假设只有一个重复的整数,请找出这个重复的数 arr input("") num [int(n) for n in arr.split()]…

网络安全(五)--Linux 入侵检测分析技术

8. Linux 入侵检测分析技术 目标 了解入侵检测分析的基本方法掌握查看登录失败用户的方法掌握查阅历史命令的方法掌握检查系统开机自启服务的方法 8.1. 概述 最好的安全防护当然是“域敌于国门之外”, 通过安全防护技术,来保证当前主机不被非授权人员…

【计算机网络笔记】物理层——频带传输基础

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

Java基础50题:14. 使用方法求最大值(2种方法)

概述 使用方法求最大值。 创建方法求两个数的最大值max2,随后再写一个求3个数的最大值函数max3。 要求: 在max3这个方法中,调用max2函数,来实现3个数的最大值计算。 方法一 【代码】 public class P14 {public static int max…

Linux 文件写入报错E297: Write error in swap file

错误原因 Linux系统不能向文件写入内容,无论写入都无保存,并且提示下文信息 E297: Write error in swap file "abc.txt" [New File] Press ENTER or type command to continue 经过查找资料得知可能是磁盘满了。通过df -h命令查看磁盘情况…

DDD架构思想专栏二《领域层的决策设计思想详解》

如果不了解DDD基本概念的读者可以去看这篇文章,传送门:DDD架构思想专栏一《初识领域驱动设计DDD落地》-CSDN博客 前言介绍 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅仅只是从一个简单的分层结…

智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金枪鱼群算法4.实验参数设定5.算法结果6.参考…

总结一篇本地idea配合阿里云服务器使用docker

idea打包打镜像发到阿里云服务器 先说一下使用docker desktop软件怎么使用 1.下载docker desktop官网,先注册个账号吧,后面桌面软件登录会用到(当然,配合这个软件使用需要科学上网) 安装这个要配合wsl使用&#xf…

Qt之QGraphicsView —— 笔记1:绘制简单图元(附完整源码)

效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…