OpenCV-Python入门(1)如何安装opencv库?如何用opencv读取图片、视频?如何打开摄像头?如何保存图像?如何保存视频?

一、安装opencv库

在python上安装第三方库最简单的方式就是用pip工具进行安装了,安装opencv也不例外:

pip install opencv-python

opencv这个库是挺大的一个包,所以要从国内镜像源站点进行下载,如果直接从国外下载很大可能会下载失败。
如果不清楚如何设置pip从国内镜像源下载,可以参考这篇文章:
pip更换镜像源、添加到环境变量、常用功能、常见问题汇总

如何检测opencv-python是否安装成功?

import cv2

在python代码里能够成功导入cv2的话就说明安装成功啦。
记住哦,不是import opencv,也不是import opencv-python

通常可以这样写:

import cv2 as cv

OpenCV-Python入门(1)如何安装opencv库?如何用opencv读取图片、视频?如何打开摄像头?如何保存图像?如何保存视频?_第1张图片


二、用opencv读取图片

import cv2 as cv

img = cv.imread('file.jpg')
cv.imshow('img', img)

cv.waitKey()
cv.destroyAllWindows()

这里用到了这3个函数:

  • cv.imread()
  • cv.waitKey()
  • cv.destroyAllWindows()

cv.imread(filename[,flags])
这个函数是用来读取图片,参数filename是图片的文件名;可选参数flags可以等于许多值,常用flags=1和flags=0。
flags = 1,表示将图像调整为BRG通道的彩色图像。(flags = 1 是默认值)
flags = 0,表示将图像调整为单通道的灰度图像。
OpenCV-Python入门(1)如何安装opencv库?如何用opencv读取图片、视频?如何打开摄像头?如何保存图像?如何保存视频?_第2张图片
**注意:**如果读取的图片不存在,从cv.imread()语句是不会报错的,但是返回值是None,
因此,在cv.imshow()语句才会报错:
错误提示信息:
cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘cv::imshow’
所以以后遇到这种错误,不管是读取图片还是视频,都要检查一下是不是图片文件名的错误或者路径有误。

cv.waitKey()
该函数表示等待用户输入案件,可用来接受键盘事件,opencv在显示单个图像时必须加入这个函数,否则显示的图像会一闪而过或者窗口陷入卡顿。
还有这些用法:

cv.waitKey(10)  # 等待10毫秒
cv.waitKey(0)  # 无限等待,参数为空或者<=0都会无限等待

cv.waitKey()函数有返回值,如果用户在参数设置的时间内没有按下按键,则返回-1,有按下按键则返回该按键的ASCII码值:

if cv.waitKey(0) == ord('A'):
    # 判断按键事件
    print('按下按键A')

cv.destroyAllWindows()
用于销毁窗口,当程序不再显示画面的时候要把之前的显示窗口进行销毁,不然会无法进入接下来的程序。

更多cv.waitKey()和cv.destroyAllWindows()用法及问题,可参考:
OpenCV中waitKey()函数失效问题汇总(按键失效、按键不灵、按键导致程序崩溃)


三、读取视频&打开摄像头

读取视频和摄像头用的是同一个函数:
cv.VideoCapture()

读取视频:

import cv2 as cv

cap = cv.VideoCapture(r'video.mp4')
if not cap.isOpened():
	# 判断cv.VideoCapture()初始化是否成功
    print('视频打开失败')
    exit()
    
while True: # 用循环是为了读取视频的每一帧画面

    is_opened, frame = cap.read()  # 开始读取视频
	# is_opened 读取成功返回True,读取失败返回False
	# frame 读取的画面内容
	
    if not is_opened:
	    # 视频结束的时候,cap.read()就读取不到内容了,因此结束循环。
        print('视频读取完成')
        break

    cv.imshow('video', frame)

    if cv.waitKey(25) == ord('0'):
        break

cap.release() # 释放cap对象
cv.destroyAllWindows()

打开摄像头:

import cv2 as cv
cap = cv.VideoCapture(-1)
# 参数默认为-1,如果电脑有多个摄像头,可以按0,1,2,3……指定对应的摄像头
# 如果成功打开摄像头,但是无法正常显示画面,尝试将参数设置为 cv.CAP_DSHOW

if not cap.isOpened():
    print('摄像头无法打开')
    exit()

while True:
    ret,frame = cap.read()
    if not ret:
        print('没有读取到视频')
        break
        
    cv.imshow('camera', frame)

    if cv.waitKey(20) == ord('0'):  # 20ms
        break

cap.release()
cv.destroyAllWindows()

VideoCapture()还可以设置或读取许多属性:

cap = cv.VideoCapture(-1)
# 用set()设置属性值,用get()读取属性值

cap.get(cv.CAP_PROP_FRAME_WIDTH) #获得当前帧的宽度
cap.get(cv.CAP_PROP_FRAME_HEIGHT) #获得当前帧的高度

cap.set(cv.CAP_PROP_FRAME_WIDTH, 720) #设置帧的宽度为720像素
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 480) #设置帧的高度为480像素
cap.set(cv.CAP_PROP_POS_FRAMES,100)  # 设置接下来要捕获视频的第100帧

# 其他属性值(未列全):
cv.CAP_PROP_FPS  # 帧速
cv.CAP_PROP_FRAME_COUNT  # 帧数
cv.CAP_PROP_BRIGHTNESS  # 图像的亮度(仅适用于相机)
cv.CAP_PROP_CONTRAST  # 图像的对比度(仅适用于相机)
cv.CAP_PROP_SATURATION  # 图像的饱和度(仅适用于相机)

四、保存图像

cv.imwrite(filename, img)

import cv2 as cv
import numpy as np

img = np.zeros((256,512,3),dtype='uint8')  #创建大小为512X256的黑色图像img
font = cv.FONT_HERSHEY_DUPLEX
cv.putText(img,'hello,FujLiny',(50,100),font,fontScale=1.5,color=(60,60,200),thickness=2)  # 在img图像上写入文本'hello,FujLiny'
cv.imshow('img', img)
if cv.waitKey(0) == ord('s'):
	# 按下键盘S则把img保存为图像new.png
    cv.imwrite('new.png',img)

cv.destroyAllWindows()

OpenCV-Python入门(1)如何安装opencv库?如何用opencv读取图片、视频?如何打开摄像头?如何保存图像?如何保存视频?_第3张图片


五、保存视频

  1. 创建编码类型:fourCC = cv.VideoWriter_fourcc('I','4','2','0'),还可以用(‘X’,‘V’,‘I’,‘D’)编码格式等
  2. 创建out = cv.VideoWriter()对象,并设置好视频文件名、编码类型、帧率、视频大小
    • 视频文件名需要包括后缀名:例如:out.avi(后缀名可以随便定义,不会影响编码格式)
    • 编码类型设置为刚刚创建好的编码类型 fourcc=fourCC
    • 帧率一般可以设置为 fps=20
    • 视频大小,例如:(640,320)。视频大小必须和原视频(图片)大小一致,否则会保存失败,
  3. 写入视频 out.write(frame)
  4. 关闭cv.VideoWriter()对象:out.release()

这里以打开摄像头显示画面并保存到video.avi为例:

import cv2 as cv
cap = cv.VideoCapture(1)
if not cap.isOpened():
    print('the camera cannot open')
    exit()

# 保存视频
w,h = int(cap.get(cv.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fourCC = cv.VideoWriter_fourcc('I','4','2','0')
out = cv.VideoWriter('output.avi', fourCC, 20, (w,h))
# w,h分别表示视频的宽和高,保存视频的宽和高必须和远视频大小一致,否则会保存失败

while True:
    ret,frame = cap.read()
    if not ret:
        print('cannot receive frame')
        break

    out.write(frame)
    cv.imshow('camera', frame)

    if cv.waitKey(1) == ord('0'): 
        break

out.release()
cap.release()
cv.destroyAllWindows()

运行之后就可以在代码所在目录得到一个out.avi视频文件了。



你可能感兴趣的:(OpenCV,opencv,python)