读取cv.VideoCapture(0)的frame帧转变为PIL.Image图片格式时遇到的坑

2023-05-16

在项目中遇到一个问题是想将VideoCapture()读到的frame图片转变成PIL的Image图片格式。

坑1:BGR还是RGB模式?

兴冲冲地在在网上找到一段代码,将opencv中的imread()图像转成PIL.Image格式,详见python中PIL.Image和OpenCV图像格式相互转换

OpenCV转换成PIL.Image格式:

import cv2  
from PIL import Image  
import numpy  

img = cv2.imread("plane.jpg")  
cv2.imshow("OpenCV",img)  
image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))  
image.show()  
cv2.waitKey()  

于是将image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))复制了一遍,结果得到

open cv error: (-215) scn == 3 || scn == 4 in function cvtColor

的错误,参考了下stackflow上类似的回答发觉应该是颜色空间的问题——意思是原来的颜色空间和要改的颜色空间是一样的,比如原来是灰度空间,就不用再cv.COLOR_BGR2GRAY了,于是这才意识到有可能VideoCapture(0)imread()得到的颜色空间是不同的。

其实VideoCapture()与imread()得到图像的颜色空间并不相同,VideoCapture得到的图片是RGB空间的,而imread得到的图片是BGR空间的,因此这里不需要cv2.cvtColor(imgmcv2.COLOR_BGR2RGB),直接image = Image.fromarray(frame)即可,frameVideoCapture读到的帧,Image.fromarray()可以将np.array转成image格式的图像。

坑2 : type(frame)的结果是 ‘Nonetype’

上一步改完后image = Image.fromarray(frame)后还是会报错,我寻思是不是frame的格式还是有问题,结果测试得到opencv读取的帧是Nonetype摄像头也没有画面。

报的错是Image.fromarray(object)没有Nonetype这种格式,仔细想了想,以前久遇到过这种问题,就是opencv的VideoCapture没有读到帧的时候frame就会返回Nonetype,而ret返回的是False,所以在读取视频的循环中加一个条件判断语句即可,if ret ==True:的时候进行操作:

cap = cv2.VideoCapture(0)
while(1):
    ret,frame =cap.read()
    if ret==True:
        print (type(frame))
        print (ret)#观察frame和ret的类型

        img = Image.fromarray(frame)#完成np.array向PIL.Image格式的转换

        cv2.imshow("frame", frame)#正常显示frame
        cv2.waitKey(1)

后面得到的结果就是retTrue,frame的type()为np.array

总结

其实出现这么多的坑就是因为对opencv读取图片的颜色空间和数据格式不清楚,他们里面有BGRRGB颜色空间,而一般cv2.imread()读取的图片都是BGR颜色空间的图片,cv2.VideoCapture()获取的视频帧是RGB颜色空间的图片。PIL(Python Image Library)读取的图片是RGB颜色空间的。
opencv读取的图片不管是视频帧还是图片都是矩阵形式,即np.array,转PIL.Image格式用PIL.Image.fromarray()函数即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取cv.VideoCapture(0)的frame帧转变为PIL.Image图片格式时遇到的坑 的相关文章

  • ROS入门21讲笔记(七)自定义消息消息类型和使用

    这一节主要是学习如何自定义一个服务类型并使用它 一 如何自定义服务消息 xff1f 服务数据是以 srv结尾的文件 xff0c 是一个用于描述ROS服务信息简单文本文件 xff0c 用于生成不同语言消息的源代码 srv文件存放在packag
  • ROS入门21讲笔记(十二)常用可视化工具

    一 QT类可视化工具 1 1 rqt console rqt console 为显示和过滤ROS信息提供了一个GUI插件 1 2 rqt plot rqt plot使用不同的绘图后端提供数值可视化功能 1 3 rqt Image view
  • (二)CMake 使用头文件

    一 include directories 该命令用于增加一个编译头文件 其基本语法是 xff1a include directories span class token punctuation span span class token
  • cargo 宏展开遇到的问题

    最近学习rust xff0c 看到宏展开命令 span class token comment 单独文件 span rustc Z unstable options pretty span class token operator 61 s
  • 工程师笔记|常见的嵌入式软件工程师面试题

    Q xff1a 什么是ISR xff1f A xff1a ISR 是指中断服务程序 这些是存储在特定内存地址的函数 xff0c 当发生某种类型的中断时会调用这些函数 Cortex M 处理器系列具有管理中断执行的 NVIC Q xff1a
  • 计算机中的速率、带宽、时延、利用率解读

    计算机网络的性能一般是指它的几个重要的性能指标 但除了这些重要的性能指标外 xff0c 还有一些非性能特征 xff08 nonperformance characteristics xff09 也对计算机网络的性能有很大的影响 那么 xff
  • 手把手教你写链表,小学生看了都说好~

    摘要 xff1a 明明我们在之前已经接触了数组 xff0c 感到数组已经是万能的数据存储位置了 但是 xff0c 如果我们一直在使用比较复杂的数据 xff08 也就是比较多的数据时 xff09 xff0c 肯定会感到很反感 因为对于数组这种
  • 15-JavaScript高级程序设计-创建对象

    一 创建对象 创建单个对象 xff1a Object构造函数 new Object 对象字面量 xff08 参见8 Object amp Array xff09 创建多个对象 xff1a 以下7种方式 1 工厂模式 span class t
  • FreeRtos源码分析之启动任务调度vTaskStartScheduler(二)

    一 概述 FreeRtos在创建任务之后 xff0c 需要启动任务调度器才能使任务正常有序的运行 任务调度器的开启依赖于底层硬件 xff0c 对于CortexM3内核而言 xff0c 任务调度器需要用到中断和滴答定时器 FreeRtos在对
  • FreeRtos源码分析之任务状态管理(三)

    一 概述 FreeRtos的每一个任务都有一个对应的优先级 xff0c 较高优先级的任务具有优先运行的权利 xff0c 当高优先级的任务调用系统的延时函数或者需要阻塞等待某些信号时 xff0c 会让出CPU的使用权 xff0c 从而使低优先
  • FreeRtos源码分析之任务切换原理(四)

    一 CortexM3中断优先级 CortexM3支持多达240个外部中断和16个内部中断 xff0c 每一个中断都对应一个中断都对应一个优先级寄存器 每一个优先级寄存器占用8位 xff0c STM32采用其中的高四位来表示优先级 xff0c
  • ubuntu切换python版本

    一 概述 在ubuntu环境下进行嵌入式开发 xff0c 我们在进行不同的项目开发时 xff0c 可能会遇到python环境不统一的情况 这时 xff0c 我们可以通过update alternatives来方便更新ubuntu下的pyth
  • 本地Windows远程连接阿里云服务器图形界面(使用vnc viewer)

    文章目录 前言Motivation of writing1 场景说明2 给阿里云服务器安装图形界面3 给服务器配置VNC Server4 让服务器放行5901端口5 本地windows配置vnc viewer总结 标题 xff1a 本地Wi
  • 十分钟教你配置frp实现内网穿透

    十分钟教你配置frp实现内网穿透 一 frp的作用 利用处于内网或防火墙后的机器 xff0c 对外网环境提供 http 或 https 服务 对于 http https 服务支持基于域名的虚拟主机 xff0c 支持自定义域名绑定 xff0c
  • 5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器

  • Jetson带CUDA编译的opencv4.5安装教程与踩坑指南,cmake配置很重要!

    环境 xff1a Jetson NX 43 Jetpack4 4 43 Ubuntu18 04 0 jtop前后对比1 安装教程2 踩坑指南2 1 cv2 error OpenCV 4 4 0 tmp pip build 2do2xloi
  • C++ 获取系统当前时间

    C 43 43 获取系统当前时间 c 43 43 time函数 C 43 43 的日期和时间函数获取系统当前时间实例大体思路具体使用与解析四 回顾与梳理 c 43 43 time函数 C 43 43 的日期和时间函数 C 43 43 标准库
  • KAFKA结构图

    转载 https blog csdn net sillyzhangye article details 86181323 utm medium 61 distribute pc relevant none task blog BlogCom
  • vue-企业微信绑定和解绑

    一 企业微信绑定解绑 项目中需要对账号进行企业微信的绑定和解绑 企业微信页面显示 xff1a span class token operator lt span FormItem label span class token operato
  • cannot currently show the desktop 树莓派 vnc viewer 无法显示的解决方法

    文章由来 2021 04 24 xff0c 周六 xff0c 一个人在家没什么事情 xff0c 突然发现了自己的树莓派4B xff0c 那个时候就买来的时候用了一会 xff0c 今天突然想用它搭一个服务器 那个时候玩的时候资料没有整理 xf

随机推荐

  • AI就是闭上眼想要一份凉皮,睁开眼就会有一份凉皮摆在眼前

    回答这个问题之前 xff0c 先听下这段对话 xff1a 你愿意让别人帮你干活吗 xff1f 愿意 xff01 那么你愿意让别人干你的活吗 xff1f 愿意 最后问你 xff0c 你愿意让别人替代你吗 xff1f 作为一个对AI没有过深的了
  • 什么是主线程?

    主线程 是执行主 main 方法的线程 单线程程序 java程序中只有一个线程 执行从main方法开始 从上到下依次执行 主线程的概念 JVM执行main方法 main方法会进入到栈内存 JVM会找操作系统开辟一条main方法通向cpu的执
  • Python爬虫Xpath方法返回值有[]引号等问题解决方法

    在搞Python爬虫的时候会使用到Xpath方法 xff0c 比如在爬取某个链接的时候返回值会是 39 http www baidu com demo jpg 39 示例链接 而后面的代码会因为有这几个字符串而受到影响 解决方法 xff1a
  • error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable

    k8s报error no configuration has been provided try setting KUBERNETES MASTER environment variable错误解决方法1 18 1版本 使用vi编辑器打开
  • ubuntu 安装PHP+Apache

    安装Apache sudo apt install apache2 安装PHP 7 4 Ubuntu 20 04默认安装的版本 sudo apt install php libapache2 mod php 安装完成重启Apache服务 s
  • ASCII码判断大小

    ASCII码的值大小排列 xff1a a z gt A Z gt 0 9 在小写字母中z最大 xff0c a最小 在大写字母中Z最大 xff0c A最小 在0到9中 9最大 xff0c 0最小 故选D选项
  • 二进制运算相关的题目

    将二进制数01011010 转换成十进制数 xff0c 然后将十进制数 x 2 得到的值将其化为二进制数 01011010 十进制数为90 180 二进制数为10110100 故选C选项
  • 重装Ubuntu系统及系列软件安装

    重装Ubuntu系统及系列软件安装 1 安装ubuntu20 04 03系统下载Ubuntu20 04 03系统更换系统apt的源 2 CUDA和cudnn安装下载CUDA安装包并安装 3 pycharm的安装 4 conda的安装 5 兼
  • Qt中UI对象只能在主线程中操作,那如何在子线程中操作UI呢

    为什么在Qt中UI对象只能在主线程中操作 在Qt中 xff0c UI对象只能在主线程中操作 xff0c 因为Qt采用了事件循环机制 xff0c UI事件 xff08 如鼠标点击 键盘输入 xff09 都是在主线程中处理的 如果在子线程中直接
  • python学习记录

    python学习记录 python学习python运行顺序类的使用模块导入import不同级模块导入模块导入的重名问题 xff1a 注意的点 修饰器 正则表达式 python学习 本文是关于python的学习记录文章 比较基本 比较潦草 p
  • 案例二:基于MapReduce分词统计

    案例二 xff1a 基于MapReduce的分词统计 一 准备条件 xff1a 1 数据源 xff1a 六个 txt 诗经文件 2 Hadoop集群环境 五 功能实现 前提准备 xff1a 引入类库将Hadoop包解压 xff0c 并进入相
  • RHEL8.3 配置VNC 远程

    一 安装VNC 选取比较流行的tigervnc dnf install tigervnc span class token operator span server tigervnc span class token operator sp
  • 一次使用Dockerfile构建tomcat镜像时遇到的Linux内核问题

    当前版本 span class token punctuation span root 64 zyrox test alpine images span class token punctuation span span class tok
  • Java中Lambda表达式的使用

    Lambda表达式是Java SE 8中一个重要的新特性 lambda表达式允许你通过表达式来代替功能接口 lambda表达式就和方法一样 它提供了一个正常的参数列表和一个使用这些参数的主体 Lambda表达式还增强了集合库 Java SE
  • 用mscomm控件编写串口通信出现error reading comm device错误-已解决

    一 问题描述 用mscomm控件编写串口通信过程中 xff0c 在消息响应函数OnComm函数下接受串口发送过来的数据时 xff0c 在get Input 函数会出现error reading comm devece 错误 具体代码如下 x
  • 使用Spring Security后,页面iframe加载不出来

    错误 Refused to display http localhost 8080 console in a frame because it set X Frame Options to deny 解决办法 授权的时候开启iframe的加
  • 软件工程笔记八__面向对象

    1 面向对象方法四要点 xff08 1 xff09 对象 xff1a 客观世界有各种对象组成 xff0c 任何事物都是对象 xff0c 比如一支笔 xff0c 一张纸 xff0c 复杂的对象可由简单的对象以某种方式组合而成 对象分解取代功能
  • C++如何获取当前时间

    导读 文章首先介绍了使用C库的接口来获取当前时间的方法 xff0c 然后介绍了使用C 43 43 11标准库中的函数来获取当前时间的方法 此外 xff0c 文章还介绍了使用函数strftime来格式化时间字符串的方法 xff0c 并列举了常
  • Java笔记(一):volatile、synchronized关键字

    volatile关键字 volatile字面意思为易变的 不稳定的 xff0c 事实上也正是如此 这个关键字的作用就是告诉编译器 xff0c 只要是被此关键字修饰的变量都是易变的 xff0c 不稳定的 主要是volatile所修饰的变量是直
  • 读取cv.VideoCapture(0)的frame帧转变为PIL.Image图片格式时遇到的坑

    在项目中遇到一个问题是想将VideoCapture 读到的frame图片转变成PIL的Image图片格式 坑1 xff1a BGR还是RGB模式 xff1f 兴冲冲地在在网上找到一段代码 xff0c 将opencv中的imread 图像转成