在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
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,表示将图像调整为单通道的灰度图像。
**注意:**如果读取的图片不存在,从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()
fourCC = cv.VideoWriter_fourcc('I','4','2','0')
,还可以用(‘X’,‘V’,‘I’,‘D’)编码格式等out = cv.VideoWriter()
对象,并设置好视频文件名、编码类型、帧率、视频大小
out.write(frame)
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视频文件了。