OpenCV是计算机视觉中经典的专用库,其支持多语言、跨平台,功能强大。
如何显示和保存图像和视频,控制鼠标事件以及创建轨迹栏。
cv.imread()
:读取图像;
cv.IMREAD_COLOR
: 加载 彩色 图像,图像透明度都会被忽视(默认)(可以写成 1
)
cv.IMREAD_GRAYSCALE
:加载 灰度 图像(可以写成 0
)
cv.IMREAD_UNCHANGED
:加载图像,包括 alpha通道(可以写成 -1
)
import cv2 as cv
img = cv.imread('./00.png', -1) # 等同于cv.IMREAD_UNCHANGED
img = cv.imread('./01.png', 0) # 等同于cv.IMREAD_GRAYSCALE
img = cv.imread('./02.png', 1) # 等同于cv.IMREAD_COLOR
cv.imshow()
:在窗口中显示图像,窗口自动适合图像尺寸,一般使用 cv_show()
函数给封装起来;
默认参数为 cv.WINDOW_AUTOSIZE
显示窗口大小不可以调整,
可以通过使用 cv.namedWindow(name, cv.WINDOW_NORMAL)
函数实现窗口的大小调整;
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
cv.namedWindow(name, cv.WINDOW_NORMAL) # 窗口可调整
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
cv.imwrite()
:保存图像;
cv.imwrite('path', img)
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('./00.png', 0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])
plt.show()
注:
OpenCV 加载的彩色图像通道为 BGR
,但是 Matplotlib 以 RGB
通道显示。
cv.VideoCapture()
默认分辨率为 640* 480 ,可以通过修改参数,例如 1080* 720 :
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1080)
宽度
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)
高度
capture.set(CV_CAP_PROP_FPS, 30)
帧数
capture.set(CV_CAP_PROP_BRIGHTNESS, 1)
亮度
capture.set(CV_CAP_PROP_CONTRAST, 40)
对比度
capture.set(CV_CAP_PROP_SATURATION, 50)
饱和度
capture.set(CV_CAP_PROP_HUE, 50)
色调
capture.set(CV_CAP_PROP_EXPOSURE, 50)
曝光
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0) # 选择对应的相机,0默认为笔记本自带相机
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# 逐帧捕获
ret, frame = cap.read() # 如果正确读取帧,ret为True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 逐帧显示结果
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'): # 按 'q' 退出
break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()
可以利用 cap.set()
函数读取原视频的一些参数,例如宽和高:
cap.get(cv.CAP_PROP_FRAME_WIDTH)
cap.get(cv.CAP_PROP_FRAME_HEIGHT)
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('./00.avi')
while cap.isOpened():
ret, frame = cap.read() # 如果正确读取帧,ret为True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
cv.VideoWriter()
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID') # 定义编解码器
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) # 创建 VideoWriter 对象
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# frame = cv.flip(frame, 0) # 视频翻转
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# 完成工作后释放所有内容
cap.release()
out.release()
cv.destroyAllWindows()
cv.line()
(图像,起点,终点,颜色,线宽)
import numpy as np
import cv2 as cv
# 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 绘制一条厚度为5的蓝色对角线
cv.line(img, (0,0), (511,511), (255,0,0), 5)
cv.rectangle()
(图像,起点,终点,颜色,线宽)
cv.rectangle(img, (384,0), (510,128), (0,255,0), 3)
cv.circle()
(图像,圆心,半径,颜色,线宽)
cv.circle(img, (447,63), 63, (0,0,255), -1)
cv.ellipse()
(图像,椭圆中心,(长轴半径,短轴半径),
椭圆沿水平方向逆时针旋转的角度,
沿长轴顺时针方向开始显示的角度,
沿长轴顺时针结束显示的角度,
颜色,线宽(cv.FILLED表示实心))
cv.ellipse(img, (256,256), (100,50), 0, 0, 180, (255,0,255), 3)
cv.ellipse(img, (128,128), (100,50), 0, 0, 360, (255,0,255), cv.FILLED)
cv.polylines()
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img, [pts], True, (0,255,255)) # 设置为False 绘制折线而不是封闭图形
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4, (255,255,255), 2, cv.LINE_AA)
结果显示 :
cv.imshow('test', img)
cv.waitKey(0)
cv.destroyAllWindows()
cv.setMouseCallback()
鼠标点到的地方绘制一个圆:
import numpy as np
import cv2 as cv
# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x,y), 10, (255,0,0), -1)
# 创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27: # esc 键
break
cv.destroyAllWindows()
cv.getTrackbarPos()
import numpy as np
import cv2 as cv
def nothing(x):
pass
# 创建一个黑色的图像,一个窗口
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
# 创建颜色变化的轨迹栏
cv.createTrackbar('R', 'image', 0, 255, nothing)
cv.createTrackbar('G', 'image', 0, 255, nothing)
cv.createTrackbar('B', 'image', 0, 255, nothing)
# 为 ON/OFF 功能创建开关
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image', 0, 1, nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
# 得到四条轨迹的当前位置
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv.destroyAllWindows()
OpenCV官方文档链接 :OpenCV-Python 官方文档
OpenCV系列链接:会变魔术的 OpenCV
会变魔术的 OpenCV_01 简介与安装
会变魔术的 OpenCV_02 GUI特性
会变魔术的 OpenCV_03 核心操作
会变魔术的 OpenCV_04 图像处理
会变魔术的 OpenCV_05 实例分析