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()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值