【OpenCV学习】(二)数据的加载和展示
背景
在实际工程中,最重要的往往是数据的读取和展示,OpenCV能够支持图像和视频数据,并且给予了很好的支持;不管是做传统项目还是基于深度学习的项目,读取数据都是必不可少的;
创建和显示窗口
使用API:
- namedWindow():创建一个窗口,给定名字和传窗口类型;
- imshow():展示窗口;
- destroyAllWindows():销毁所有窗口;
- resizeWindow():
代码案例:
import cv2
// cv2.WINDOW_NORMAL是定义一个可调整大小的窗口
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 1920, 1080)
cv2.imshow('window', 0)
key = cv2.waitKey(0)
if(key == 'q'):
cv2.destroyAllWindows()
读取图片
-
imread(图片路径,图片类型)
图片类型一般情况下有两种:0表示灰度图,1表示彩色图,不传值默认为彩色图;
代码案例:
img = cv2.imread('test2.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
保存图片
- imwrite(图片保存路径及名称,Mat格式数据)
代码案例:
imwrite("save.jpg", img)
视频采集和读取
使用API:
-
VideoCapure():参数需要设备id号,默认填0即可;
注意:如果想要读取视频,只需要将传入参数改为视频路径即可;
-
read():返回两个值,第一个为状态值(读取到为true),第二个值为视频帧;
-
release():释放视频资源;
代码案例:
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
cv2.imshow('video', frame)
key = cv2.waitKey(10)
# 键盘事件,用户输入q退出
if(key == ord('q')):
break
cap.release()
cv2.destroyAllWindows()
视频录制
使用API:
-
VideoWrite():参数一为输出文件,参数二为多媒体文件格式,参数三为帧率,参数四为分辨率;
-
VideoWriter_fourcc(*‘四字符格式’):创建多媒体文件格式;
媒体文件格式举例:DIVX(.avi)、MJPG(.mp4)、X264(.mkv)
-
write():将数据写入视频文件中;
-
release():释放资源;
代码案例:
# 创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
# 注意如果读取摄像头数据的话,保存的分辨率需要和摄像头采集的一致
vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720))
# 写数据到多媒体文件, 中间省略读取数据部分
vw.write(frame)
# 释放VideoWriter
vw.release()
鼠标控制
使用API:
- setMouseCallback(winname,callback,userdata)
- callback(event,x,y,flags,userdata):event就是事件(鼠标移动、按下左键等),flags是鼠标键及组合键;
event的类别可以参考源码中highgui.hpp的定义:
代码案例:
#鼠标回调函数
def mouse_callback(event, x, y , flags, userdata):
print(event, x, y, flags, userdata)
#创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)
#设置鼠标回调
cv2.setMouseCallback('mouse', mouse_callback, "123")
#显示窗口和背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow('mouse', img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
上述代码创建了一个窗口,并传入一个全黑的图像,会返回鼠标事件的值,如下图:
TrackBar控件
使用API:
- createTrackbar(trackname,winname,默认当前值,最大值,callback函数)
- getTrackbarPos(trackname,winname)
代码案例(一个简单调色板,调整RGB的值):
def callback():
pass
#创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
#创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)
#创起家一个背景图片
img = np.zeros((480, 640, 3), np.uint8)
while True:
#获取当前trackbar的值
r = cv2.getTrackbarPos('R', 'trackbar')
g = cv2.getTrackbarPos('G', 'trackbar')
b = cv2.getTrackbarPos('B', 'trackbar')
#改变背景图片颜色
img[:] = [b, g, r]
cv2.imshow('trackbar', img)
key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
随机调了一个我喜欢的海蓝色,大家可以自己尝试调出自己喜欢的颜色;
总结
OpenCV这个库对图像和视频是非常友好的,支持多种格式,并且功能强大;本篇仅仅介绍了数据的读取和写入,重点是窗口的创建和一些辅助操作;这仅仅是OpenCV功能的冰山一角,下篇带大家继续探讨其中的常用功能模块;