OpenCV:01图片&视频的加载显示

Posted Lionetxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV:01图片&视频的加载显示相关的知识,希望对你有一定的参考价值。

文章目录

学习目标:

  • 了解OpenCV的运行机制
  • 可以使用OpenCV处理一些图像常见问题
  • 学会物体识别,文字识别等问题的处理思路

图像与视频的加载显示

导入OpenCV的包cv2

# 导入opencv的包
import cv2

窗口操作

cv2.imshow('window',0) # imshow(winname, mat):'mat’表示展示的内容,0表示什么都不展示

# 创建窗口
#cv2.namedWindow('window',cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('window',cv2.WINDOW_NORMAL)

# 更改窗口大小—>在窗口属性为‘WINDOW_AUTOSIZE’自动设置时无效果
cv2.resizeWindow('window',800,600) # resizeWindow(winname, width, height)

# 展示名字为window的窗口
cv2.imshow('window',0) # imshow(winname, mat):'mat'表示展示的内容,0表示什么都不展示

# 等待按键
#cv2.waitKey(0) # waitKey会返回按下按键的ASCII值(8位)
              # 值为‘0’表示接受任意按键,如果给其他的整数,表示等待按键的时间(单位:毫秒ms)
            # 比如waitKey(5000)如果5000ms后没有按键,则窗口无响应
        # 可以用waitKey来销毁窗口,不用每次都重启python
key = cv2.waitKey(0)
if key == ord('q'): # 如果按下键盘上的'q'
    print("准备销毁窗口")
    cv2.destroyAllWindows() # 销毁窗口

计算按键的ASCII

# 怎么计算按键'x'的ASCII码
# ord()是python中计算ASCII值的函数
ord('q')

读取图片

cv2.imread('./cat.jpeg') # ./是直接调用day1目录下的文件

用其他插件来读取(以matplotlib为例)

先将图片存入我们的文件夹下,命名为cat.jpeg

import matplotlib.pyplot as plt
# 默认按照彩色图片来读取
cat = cv2.imread('./cat.jpeg') # ./是直接调用day1目录下的文件

# 调出cat的值
cat


# 利用matplotlib来显示图像
plt.imshow(cat)

# 我们会发现matplotlib显示的图片和真实的图片颜色不一样,发生了变化
    # 因为opencv读进来的通道不是默认的RGB(红绿蓝)通道,而是BGR(蓝绿红)
    # 因此opencv读进来的图片不要用别的方式去展示(如matplotlib),而是用opencv自带的方式去展示

注意:单独调用imshow()时可以不用创建窗口,opencv会自动生成


OpenCV自带的方式去展示图片

cv2.imshow('cat',cat)
key = cv2.waitKey(0)
if key == ord('q'): # 如果按下键盘上的'q'
    print("准备销毁窗口")
    cv2.destroyAllWindows() # 销毁窗口
    
# 执行时会弹出窗口,显示图片     按‘q’则退出窗口

函数的封装

如果我们需要频繁地显示图片,那么我们可以把显示图片的方法封装成一个函数方便我们显示图片

把这个函数放在一个文件里,需要使用的话就直接导入文件即可

将函数保存为.py文件(命名为utils.py),放在我们的文件夹中

# 如果我们需要频繁地显示图片,那么我们可以把显示图片的方法封装成一个函数方便我们显示图片
    # 把这个函数放在一个文件里,需要使用的话就直接导入文件即可
def cv_show(name,img):
    import cv2
    cv2.imshow(name,img)
    
    # 关闭窗口
    key = cv2.waitKey(0)
    if key  == ord('q') or key == ord('Q'):
        cv2.destroyAllWindows()

想要调用函数时,我们导入文件即可

# 从外部py文件中导入工具类,即可直接使用
from utils import cv_show

注意:导入后必须先执行文件!

# 导入后必须先执行文件
%run utils.py

# 如果出现报错IndentationError:unindent does not match any outer indentation level
    # 那就是Tab和空格混用的缩进问题:本应该用Tab缩进,可能打成了空格缩进

使用函数

cv_show('cat',cat)

保存图片

imwrite(path,img):使用imwrite保存图片

import cv2

# 创建一个窗口
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',640,480)

# 读一个图片
img = cv2.imread('./cat.jpeg') # 打开当前目录下的图像文件

while True:# 进入循环,使得cv2不停地展示img图片
    cv2.imshow('img',img)
    key = cv2.waitKey(0) # 接受任意字符——>写0
    
    if key == ord('q'): # 按下按键'q'——> quit
        break
    elif key == ord('s'): # 按下按键's'——> save
        cv2.imwrite('./123.png',img) # 会把cv2.imshow('img',img)的图片保存到当前文件下下,命名为123.png
    else:
        print(key)

# 关闭窗口
cv2.destroyAllWindows()


读取摄像头与视频数据

打开摄像头

  • 视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧,表示1s显示30张图片
  • cv2.VideoCapture()可以捕获摄像头,用数字来表示不同的设备,比如0,1
  • 如果是视频文件,可以直接指定路径即可
import cv2
# VideoCapture()可以捕获摄像头:如果是视频文件,则直接在参数中写入路径即可;如果是电脑上的摄像头,则可以根据摄像头编号进行索引,通过这个简单的数字去指定调用的摄像头


# 打开视频文件 #
#vc = cv2.VideoCapture()  

# 打开摄像头 #
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)

# 如果打开失败或者没读到数据,会闪退,但并不会报错
#cap = cv2.VideoCapture(1)

cap = cv2.VideoCapture(0) # 该函数会返回一个对象,我们用cap来接受(0是笔记本自带的摄像头)

# 循环读取摄像头的每一帧
while True:
    # 读一帧数据(一帧=视频里的一幅图) 
    flag,frame = cap.read() # 返回“标记”和“这一帧数据(图片)”:True表示读取成功,False表示读取失败
    
    # 可以根据flag做判断
    if not flag:
        print("没读到数据!退出......")
        break
        
    # 显示数据
    else:
        cv2.imshow('video',frame)
        
    key = cv2.waitKey(1) # 此处不可以写0!因为0会允许任何输入并且一直在等待输入,如果这样写就只能看到一帧数据,并且一直在等待
                         # 此处写1,每隔1ms检测一次输入
    if key == ord('q'):
        break
        
# 别忘了释放资源!
cap.release()
cv2.destroyAllWindows()

打开视频

打开视频的操作和打开摄像头是一样的:只需要修改cap = cv2.VideoCapture(0)cap = cv2.VideoCapture(‘./1.mp4’) # 括号内为路径即可

放出的视频会有加速的效果:是因为我们的代码中key = cv2.waitKey(1)每隔1ms就执行下一张图片

那么我们为了完整播放这个视频,提出了一个问题:假如一个视频是30帧,那么每张图之间要间隔多少毫秒呢

# 1帧 = 1s内显示1张图片,每张图片用时t = 1/1(s) = 1000/1(ms)
# 30帧 = 1s内显示30张图片,每张图片用时t = 1/30(s) = 1000/30(ms)

key = cv2.waitKey(1000 // 30)	# 括号内必须是整数!"//"两个斜线表示除后向下取整

视频录制

opencv打开一个视频或一个摄像头,我们把捕获到的每一帧存储在一个视频中

  • VideoWrite:参数一为输出文件,参数二为多媒体文件格式,参数三为帧率,参数四为分辨率
  • write:编码并写入缓存
  • release:缓存内容写入磁盘,并释放资源
import cv2
cap = cv2.VideoCapture(0) # 把摄像头捕获的内容存入cap中

# 创建对象 (fourcc表示视频的一种格式)
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # *mp4v表示“解包操作”——> 等同于解成'm','p','4','v'

# 创建对象
vw = cv2.VideoWriter('output.mp4',fourcc,30,(640,480)) # ('保存的文件名',指定存储的格式,帧率,摄像头的分辨率(一定要正确否则报错!))

# 判断摄像头是否打开
while cap.isOpened() :
    ret,frame = cap.read()
    if not ret: # 如果没有打开
        print('can not recive frame ,Exiting...')
        break
        
    else : # 如果成功打开——> 写每一帧数据
        vw.write(frame) # 把 这一帧数据 写到Videowriter中
        cv2.imshow('frame',frame) # 展示 这一帧数据 到窗口
        
    if cv2.waitKey(1) == ord('q') or cv2.waitKey(1) == ord('Q'):
        break

# 别忘了release
cap.release()
        
# 释放Videowriter
vw.release() # write是先写到缓存中,再由release写入到磁盘中 

cv2.destroyAllWindows()

视频处理

OpenCV不仅仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到视频处理的目的。

要想处理视频,需要先对视频进行读取、显示、保存等相关操作。为此,OpenCV提供了VideoCapture类和VideoWrite类的相关方法


摄像头

摄像头视频是指从摄像头中实时读取到的视频。为了读取并显示摄像头视频,OpenCV提供了VideoCapture类的相关方法,这些方法包括:

  • 摄像头的初始化方法
  • 检验摄像头初始化是否成功的方法
  • 从摄像头中读取帧的方法
  • 关闭摄像头的方法等

视频是由大量的图像构成的,把这些图像称作 “帧”


摄像头的初始化

VideoCapture类提供了构造方法VideoCapture()用于完成摄像头的初始化工作

关键API:capture = cv2.VideoCapture(index)
其中:

  • index:摄像头的设备索引
    • index = 0时,表示要打开的是第1个摄像头;对于64位的Window 10笔记本来说,表示要打开的是笔记本内置摄像头capture = cv2.VideoCapture(0)
    • index = 1时,表示要打开的是第2个摄像头;对于64位的Window 10笔记本来说,表示要打开的是一个连接笔记本的外置摄像头capture = cv2.VideoCapture(1)

返回值:

  • capture:要打开的摄像头

检测初始化结果

为了检测摄像头是否初始化成功,VideoCapture类提供了isOpened()方法

关键API:retval = cv2.VideoCapture.isOpened()
返回值:

  • retval如果摄像头初始化成功,retval = True;否则,retval = False
  • 注意:在初始化格式的基础上,isOpened()方法的语法格式可以简写为retval = capture.isOpened()

读取摄像头中的图像

当摄像头初始化后,就可以从摄像头中读取帧了,为此VideoCapture类提供了read()方法

关键API:retval,frame = cv2.VideoCapture.read()
其中:

  • retval:布尔类型,是否读取到帧。如果读取到帧,则retval = True;否则retval = False
  • frame:读取到的帧。因为帧指的是构成视频的图像,所以可以把“读取到的帧”理解为“读取到的图像”
  • 注意:注意:在初始化格式的基础上,read()方法的语法格式可以简写为retval,frame = capture.read()

关闭摄像头

OpenCV在官网中特别强调,在不需要摄像头时,一定要关闭摄像头。为此,VideoCapture类提供了release()方法。

关键API:cv2.VideoCapture.release()


读取并显示摄像头视频

编写一个程序,打开笔记本内置摄像头实时读取并显示视频,当按下空格键时,关闭笔记本内置摄像头,销毁显示摄像头的窗口

示例代码:

import cv2

capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头

# 判断摄像头是否被打开
while(capture.isOpened()):
    # 如果打开
    retval,image = capture.read() # 从摄像头中实时读取数据
    cv2.imshow('video',image)# 从窗口中显示读取的数据
    
    
    #每1ms检测用户是否按下键盘
    key = cv2.waitKey(1)
    if key == 32: # 如果按下空格键
        break
    
# 释放内存
capture.release()
cv2.destroyAllWindows()

将摄像头视频由彩色视频转化成灰度视频

上个例程我们已经成功地读取并显示了摄像头视频,那么如何对这个视频进行处理?

其实,处理视频所用的方法与处理图像所用的方法是相同的—> gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

下面我们将使用处理图像的相关方法把读取并显示的彩色视频转换成灰度视频

示例代码:

import cv2

capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头

# 判断摄像头是否被打开
while(capture.isOpened()):
    # 如果打开
    retval,frame = capture.read() # 从摄像头中实时读取数据
    
    # 将读取到的帧转换为灰度图
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    
    cv2.imshow('video',gray)# 从窗口中显示读取的数据
    
    
    #每1ms检测用户是否按下键盘
    key = cv2.waitKey(1)
    if key == 32: # 如果按下空格键
        break
    
# 释放内存
capture.release()
cv2.destroyAllWindows()

显示并保存摄像头视频中某一时刻的图像

编写一个程序,打开笔记本内置的摄像头,实时读取并显示视频。当按下空格键时,关闭笔记本内置摄像头,保存并显示这个时刻摄像头视频中的图像

示例代码:

import cv2

capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头

# 判断摄像头是否被打开
while(capture.isOpened()):
    # 如果打开
    retval,frame = capture.read() # 从摄像头中实时读取数据
    cv2.imshow('Video',frame)
    #每1ms检测用户是否按下键盘
    key = cv2.waitKey(1)
    if key == 32: # 如果按下空格键  
        # 释放内存
        capture.release()
        cv2.destroyWindow('Video')
        cv2.imwrite('D:\\OpenCV11\\基于OpenCV的机器视觉\\day1\\copy.png',frame)
        cv2.imshow('img',frame)# 从窗口中显示读取的数据
        cv2.waitKey()
        
        break
    
# 释放内存
cv2.destroyAllWindows()

读取并显示两个摄像头视频

编写一个程序,在打开笔记本内置摄像头实时读取并显示视频的同时,再打开一个连接笔记本的外置摄像头。

当按下空格键时,关闭笔记本内置摄像头和连接笔记本的外置摄像头,销毁显示视频的窗口

示例代码:

import cv2

capture_Inner = cv2.VideoCapture(0) # 打开笔记本内置摄像头
capture_Outer = cv2.VideoCapture(1) # 打开一个连接笔记本的外置摄像头


# 判断摄像头是否被打开
while(capture_Inner.isOpened() and capture_Outer.isOpened()):
    # 如果两个摄像头都被打开
    retval_In,frame_In = capture_Inner.read() # 从内置摄像头中实时读取数据
    retval_Out,frame_Out = capture_Outer.read() # 从摄像头中实时读取数据
    
    # 展示
    cv2.imshow('Video_In',frame_In)
    cv2.imshow('Video_Out',frame_Out)
    
    
    #每1ms检测用户是否按下键盘
    key = cv2.waitKey(1)
    if key == 32: # 如果按下空格键 
        break
    
# 释放内存
capture_Inner.release()
capture_Outer.release()
cv2.destroyAllWindows()

播放视频文件

VideoCapture类及其方法除了能够读取并显示摄像头视频外,还能够读取并显示视频文件

当窗口根据视频文件的时长显示视频文件时,便实现了播放视频文件的效果


读取并显示视频文件

VideoCapture类的构造方法VideoCapture()不仅能够用于完成摄像头的初始化工作,还能够用于完成视频文件的初始化功作。当VideoCapture()用于初始化视频文件时,其语法格式如下:

关键API:video = cv2.VideoCapture(filename)
其中:

  • filename:打开视频的文件名

返回值:

  • video:要打开的视频

注意:OpenCV能够支持各种格式的视频文件,但是在不同的操作系统中,可能不支持某种格式的视频文件
尽管如此,无论在哪种操作系统,OpenCV都支持后缀名为.avi的视频文件

示例代码:

# 播放视频文件

import cv2

video = cv2.VideoCapture('./公司宣传.avi')


# 判断视频是否被打开
while(video.isOpened()):
    # 如果视频被成功打开
    retval ,frame = video.read()
    
    # 修改窗口大小
    cv2.namedWindow('video',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video',420,300)
    
    # 展示 ——> 当没有读到视频时自动退出!不写判断语句会发生报错
    if retval == True:
        cv2.imshow('video',frame)
    
    else:
        break
    
    
    #每1ms检测用户是否按下键盘
    key = cv2.waitKey(1)
    if key == 32: # 如果按下空格键 
        break
    
# 释放内存
video.release()
cv2.destroyAllWindows()

结果:

说明:调整cv2.waitKey()方法中的参数值可以控制视频文件的播放速度。例如当cv2.waitKey(1)时,视频文件的播放速度非常快;当cv2.waitKey(50)时,就能够减缓视频文件的播放速度


将视频文件由彩色视频转换成灰度视频

使用图像处理的相关方法,能够将摄像头视频颜色由彩色转换为灰度视频。那么,使用相同的方法也能够将视频文件由彩色视频转换为灰度视频

关键API:gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

示例代码:

# 将视频文件由彩色视频转换成灰度视频

import cv2

video = cv2.VideoCapture('./公司宣传.avi')


# 判断视频是否被打开
while(video.isOpened()):
    # 如果视频被成功打开
    retval ,frame = video.read()
    
    # 修改窗口大小
    cv2.namedWindow('video',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video',420,300)
    
   
    
    # 展示 ——> 当没有读到视频时自动退出!不写判断语句会发生报错
    if retval == True:
         # 转换为灰度视频
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.imshow('video',gray)
    else:
        break
    
    
    #每1ms检测用户是否按下键盘
    key = cv2.waitKey(1)
    if key == 27: # 如果按下ESC键 
        break
    
# 释放内存
video.release()
cv2.destroyAllWindows()

结果:


视频的暂停播放和继续播放

通过按键指令,在播放视频的过程中,实现视频的暂停播放和继续播放

  • 继续播放:cv2.waitKey(50) # 括号内只要有非零数值即可,表示隔50ms检测一次是否按下键盘:如果按下了则执行对应的事件;如果没有按下则继续播放视频
  • 暂停播放:cv2.waitKey(0) 表示机器无限等待用户按下键盘按键,此时停止播放视频,实现暂停效果

示例代码:

# 视频的暂停播放和继续播放

import cv2

video = cv2.VideoCapture('./公司宣传.avi')


# 判断视频是否被打开
while(video.isOpened()):
    # 如果视频被成功打开
    retval ,frame = video.read()
    
    # 修改窗口大小
    cv2.namedWindow('video',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video',420,300)
    
   
    
    # 展示 ——> 当没有读到视频时自动退出!不写判断语句会发生报错
    if retval == True:
         # 转换为灰度视频
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.imshow('video',gray)
    else:
        break
    
    
    #每1ms检测用户是否按下键盘
    key = cv2.waitKey(1)
    if key == 27: # 如果按下ESC键 
        break
        
    elif key == 32: # 如果按下空格键
        cv2.waitKey(0) # 无限等待用户按下键盘按键,实现暂停效果
        
        
    
# 释放内存
video.release()
cv2.destroyAllWindows()

视频文件的属性

  • 视频是由大量的、连续的图像构成的,把其中的每一幅图像称作一帧
  • 帧数指的是视频文件中含有的图像总数,帧数越多,视频播放时越流畅
  • 在播放视频的过程中,把每秒显示图像的数量称作帧速率(FPS,单位:帧/s)
  • 帧宽度指的是图像在水平方向上含有的像素总数
  • 帧高度指的是图像在垂直方向上含有的像素总数

保存视频文件

在实际开发过程中,很多时候希望保存一段视频,为此OpenCV提供了VideoWrite


构造VideoWrite类对象

关键API:创建的对象 = cv2.VideoWriter(filename,fourcc,fps,frameSize)
其中:

  • filename:保存视频时的路径(含有文件名)
  • fourcc:用4个字符表示的视频编码格式
    • 在OpenCV中,用cv2.VideoWriter_fourcc()来确定视频编码格式
    • 常用fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
  • fps:帧速率
  • frameSize:每一帧的大小
  • 在Windows操作系统下,fourcc的值为fourcc = cv2.VideoWriter_fourcc('X','V','I','D'),帧速率fps = 20,帧大小为frameSize = (640 ,480)

如:

fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
# 也可以写成fourcc = cv2.VideoWriter_fourcc(* 'XVID')

output = cv2.VideoWriter('output.avi',fourcc,20,(640,480))

保存一段摄像头视频

为了保存一段视频,除需要使用VideoWriter类的构造方法外,还需要使用VideoWrite类提供的write方法

write()方法的作用时在创建好的VideoWriter类对象中写入读取到的帧

关键API:cv2.VideoWriter.write(frame)

  • frame:读取到的帧

注意:使用write()方法时,需要由VideoWrite类对象进行调用。例如在创建好的VideoWriter类对象output中写入读取到的帧frame,可以写成output.write(frame)

并且当不使用时要把VideoWriter类对象释放掉:cv2.VideoWriter.release()

例:编写一段程序,
首先打开笔记本内置摄像头,实时读取并显示视频;
然后按下ESC键,关闭笔记本内置摄像头,销毁显示摄像头视频的窗口,
并且把从打开摄像头到关闭摄像头的这段视频保存为当前文件夹下的.avi视频

代码如下:

# 保存一段摄像头视频

import cv2

# 打开笔记本内置摄像头
capture = cv2.VideoCapture(0) 

# 确定视频被保存后的编码格式
fourcc = cv2.Vide

OpenCv初学者学习笔记:图像视频的加载与显示

目录

一.图像视频的加载与显示

1.1创建和显示窗口

1.2加载显示图片

1.3保存图片

1.4视频采集

1.5视频录制

1.1创建和显示窗口

cv2.namedWindow() 创建命名窗口

cv2.imshow()显示窗口

cv2.destroyAllWindows() 销毁窗口

cv2.resizeWindow() 自定义窗口尺寸

cv2.waitKey() 等待结束时间

(ps:我是在pycharm下运行的,其他的编译器的代码可能运行会报错)

运行代码如下:

import cv2  #导入cv2库

#cv2.namedWindow('first',cv2.WINDOW_AUTOSIZE)  # 创建名为‘first’的窗口,自动适应窗口大小(不能改变窗口大小)

cv2.namedWindow('first', cv2.WINDOW_NORMAL)
cv2.resizeWindow('first', 800, 100)  # (window名字,宽,高)
# img=cv2.imread('face1.jpg')
cv2.imshow('first', 0)  # 显示名为‘first’的窗口,0是指啥都不显示
key = cv2.waitKey(0)  # 等待按键结束,0表示能接受任意按键;如果是其它整数,表示等待按键时间,单位ms; key是int型,16位
# print(ord('o'))  ord()返回的是ASCII码
cv2.destroyAllWindows()  # 销毁窗口

1.2加载显示图片

cv2.imread(path,flag) :读取图片,默认读取的是彩色图片;

详细代码讲解如下:

import cv2
import matplotlib.pyplot as plt
import pylab
import numpy as np

#读取图片

img = cv2.imread('./face1.jpg')
# 绝对路径(从根目录开始)和相对路径(在同一目录下的相对路径)都可以;

print(img.max())
# 如果格式为png,值为0~1的小数;jpg、jpeg为255~2500

print(img)
# img打印为numpy的ndarray

plt.imshow(img) 
#在pycharm上显示matplotlib图片与真实不一样

pylab.show()
# 在pycharm上显示matplotlib图片一定要导入pylab库,再加上这句话才可以,不然无法显示

cv2.imshow('face1',img)

key = cv2.waitKey(0)
if key == ord('q'):
    print('准备销毁窗口')
    cv2.destroyAllWindows()
    

注意

  1. 调用 cv2.imread()函数引用相对路径时,图片一定要放在此.py文件同一目录中才可以
  2.  要先用cv2.imread()读取图片,用参数指代图片的像素点数组,才可以再用cv2.imshow()函数显示图片像素点数组即显示图片,不能直接调用cv2.imshow()
  3.  左边是原图,matplotlib显示如右图:    

                                           

                                       (原图)                                          (matplotlib)

我们可以发现:

  1. 在pycharm上显示matplotlib图片与真实不一样,因为opencv读进来的图片数据的通道不是默认的RGB(红绿蓝),而是BGR;
  2. 所以opencv读进来的图片一般不要用其他方式显示,比matplotlib,用cv2.imshow()就可以了;
  3. 在pycharm上显示matplotlib图片一定要导入pylab库,再调用函数pylab.show()才可以,不然无法显示             

另外,可以把展示图片的代码封装成函数,方便经常调用。完整代码如下:

import cv2
import matplotlib.pyplot as plt
import pylab
import numpy as np

#自定义函数显示读取之后的图像

#防止主函数未导入库,可重新导入一下
import cv2
def cv_show(name,img):
    cv2.imshow(name, img)
    key = cv2.waitKey()
    if key ==ord('q'):
        cv2.destroyAllWindows()


#先读取再显示
#读取图片
img = cv2.imread('./face1.jpg')  

#调用函数
cv_show('face1', img)

1.3保存图片

cv2.imwrite(path,img)保存图片

import cv2
img = cv2.imread('./face1.jpg')

cv2.imwrite('./fafa.jpg', img)   
#用“./”表示将图片保存在同一目录下;
#如果不在同一目录下保存,则需要复制绝对路径

代码结果如下:

 将与此.py文件存放在同一目录下的图片'face1.jpg'保存为此目录下的'fafa.jpg'图片

1.4视频采集

  • cv2.VideoCapture()  可以捕获摄像头,用数字来表示不同的设备,如0,1;
  • isOpened()  可以返回True,False,表示视频是否成功打开;
  • read()  返回两个参数,第一个参数为bool类型,表示此帧是否读取成功,第二个是此帧图片的像素矩阵数据
  • 如果是视频文件,可以直接指定路径;
    import cv2
    
    # 读取视频文件
    vc = cv2.VideoCapture('./vc1.mp4')
    # 读取摄像头
    # vc = cv2.VideoCapture(0)
    
    # 检查是否正确打开
    # if vc.isOpened():
    
    # 循环读取视频的每一帧
    while True:
        ret, frame = vc.read()
        # ret为布尔类型,表示是否成功读取一帧数据;frame为读取图片的一帧
        # 可以读到内容则ret返回True
        if not ret:
            print('打开失败')
            break
        # 进行下一帧读取
        ret, frame = vc.read()
        # 显示读取到的图片数据
        cv2.namedWindow('xin', cv2.WINDOW_NORMAL)
        cv2.resizeWindow('xin', 500, 700)
        cv2.imshow('xin', frame)
    
        key = cv2.waitKey(1000 // 30)
        # 1000指视频时间(ms),30是视频总帧数
        # 数值指读取下一帧的间隔时间,时间越长,播放速度越慢
        # 间隔一定要是整数,'//'是上下取整
        if key == ord('q'):
            break
    
    # 释放资源
    vc.release()
    cv2.destroyAllWindows()

    1.5视频录制

  • VideoWriter 参数一为输出文件,参数二为多媒体文件格式VideoWriter_fourcc,参数三为帧率,参数四为分辨率;
  • write 编码并写入缓存;
  • release 缓存内容写入磁盘,并释放资源
    import cv2
    # 打开摄像头
    cap = cv2.VideoCapture(0)
    # 第一个参数是输出视频文件的名称,第二个是文件类型,第三个是帧率,第四个是视频尺寸
    vw = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (640, 480))
    
    while cap.isOpened():
        # 读取每一帧
        ret, frame = cap.read()
        if not ret:
            print('cannot receive frame,exiting')
            break
        # 保存每一帧
        vw.write(frame)
        # 显示每一帧
        cv2.imshow('frame', frame)
    
        if cv2.waitKey(1) == ord('q'):
            break
    cap.release()
    vw.release()
    cv2.destroyAllWindows()

以上是关于OpenCV:01图片&视频的加载显示的主要内容,如果未能解决你的问题,请参考以下文章

OpenCv初学者学习笔记:图像视频的加载与显示

番外1. OpenCV 图像处理之图片加载与视频加载

番外1. OpenCV 图像处理之图片加载与视频加载

Opencv 快速使用(基础使用&手势识别)

关于opencv读取图片、视频总是窗口一闪不出图、视频的问题

OpenCV | 图片与视频的相互转换(C++&Python)