目录

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

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显示如右图:    

               

openCV修改窗口名称 opencv显示图像指定窗口_openCV修改窗口名称

               

openCV修改窗口名称 opencv显示图像指定窗口_opencv_02

            

                                       (原图)                                          (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)   
#用“./”表示将图片保存在同一目录下;
#如果不在同一目录下保存,则需要复制绝对路径

代码结果如下:

openCV修改窗口名称 opencv显示图像指定窗口_显示图片_03

将与此.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()