1.opencv基础学习–图像&视频的加载与展示
一.创建与使用窗口
- namedWindow()–创建窗口并起名
- imshow()–显示窗口(第一个参数为窗口名,若没有会自动创建)
- destoryAllWindows()–销毁所有窗口
- resizeWindows()–设置窗口大小,不设置默认为图片大小,也可自设定。
import cv2
#WINDOW_NORMAL可改变窗口大小
cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)
#设置窗口打开的大小
cv2.resizeWindow('new', 1280, 680)
cv2.imshow('new', 0)
#等窗口的显示时长,0则一直显示
key = cv2.waitKey(0)
#接收到q则关闭窗口
if(key == 'q'):
exit()
cv2.destroyAllWindows()
二.加载图片
import cv2
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/bus.jpg')
cv2.imshow('img', img)
#等窗口的显示时长,0则一直显示
key = cv2.waitKey(0)
if(key & 0xFF == ord('q')):
cv2.destroyAllWindows()
三.保存图片
- imwrite(name, img)
- name:需要保存的文件名
- img:是Mat类型(保存图片的类型)
import cv2
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
img = cv2.imread('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/bus.jpg')
cv2.imshow('img', img)
#等窗口的显示时长,0则一直显示
key = cv2.waitKey(0)
if(key & 0xFF == ord('q')):
cv2.destroyAllWindows()
elif(key & 0xFF == ord('s')):
#保存路径+名字
cv2.imwrite('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/bus.png', img)
四.视频采集(从摄像头内)
- VideoCapure(device_num,CAP_V4L2:一般为Linux下;CAP_DSHOW:WIN下):打开一个虚拟摄像头,一般第一个为0
- cap.read():读取摄像头信息(读取摄像头采集的一帧一帧数据)
- 返回两个值,第一个为状态值,读到帧为true,反之false
- 第二个为视频帧
- cap.release():释放资源
import cv2
#获取视频设备
cv2.namedWindow("video", cv2.WINDOW_AUTOSIZE)
cap = cv2.VideoCapture(0)
while True:
#从摄像头读取视频帧
ret, frame = cap.read()
#输出:(480, 640, 3)
print(numpy.shape(frame))
#将视频帧展示
cv2.imshow(cv2.imshow('video', frame))
#等待键盘事件,如果为q则退出
key = cv2.waitKey(0)
if(key & 0xFF == ord('q')):
break
#释放VideoCapture
cap.release()
cv2.destroyAllWindows()
五.视频采集(从视频文件内)
- 与视频读取无区别,只是把参数换为文件
- 如果要跟原视频同速度,只需要把等待时间设置为1000/22。一般视频每秒22帧,就是22FPS,1000就是一秒。
import cv2
#获取视频设备
cv2.namedWindow("video", cv2.WINDOW_AUTOSIZE)
#与视频读取无区别,只是把参数换为文件
cap = cv2.VideoCapture('/media/lyd/文档1/出苗率/data_origin1/DJI_0003.MP4')
while True:
#从摄像头读取视频帧
ret, frame = cap.read()
#输出:(480, 640, 3)
print(numpy.shape(frame))
#将视频帧展示
cv2.imshow(cv2.imshow('video', frame))
#等待键盘事件,如果为q则退出
key = cv2.waitKey(int(1000/24))
if(key & 0xFF == ord('q')):
break
#释放VideoCapture
cap.release()
cv2.destroyAllWindows()
六.视频录制
- 将视频数据录制成视频文件
- VideoWriter()
- 参数一为输出文件
- 参数二为多媒体(编码器)文件格式(VideoWriter_fourcc):常见MJPG(.MP4),X264
cv.VidwoWriter_fourcc(*‘MJPG’) or
cv.VidwoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) - 参数三为帧率
- 参数四为分辨率
- write():上面类调用此方法就可保存数据
- relase():清除视频的缓冲区
import cv2
import numpy
#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 多媒体格式
#采集分辨率必须与摄像头一致,不然会出错
vw = cv2.VideoWriter('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/out.mp4', fourcc, 25, (640, 480))
#创建窗口
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
#获取视频设备/从视频文件中读取视频帧
cap = cv2.VideoCapture(0)
while True:
#从摄像头读取视频帧
ret, frame = cap.read()
print(numpy.shape(frame))
# 将视频帧展示
cv2.imshow('video', frame)
vw.write(frame)
key = cv2.waitKey(int(1000/24))
if (key & 0xFF == ord('q')):
break
#释放Videoapture
cap.release()
#释放Vidworiter
vw.replace()
cv2.destroyAllWindows()
七.代码优化
- 显示窗口为什么变大了?
- 使用isOpened()判断摄像头是否开启
- 采集数据时要判断数据是否获取到了
import cv2
import numpy
#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 多媒体格式
#采集分辨率必须与摄像头一致,不然会出错
vw = cv2.VideoWriter('/home/lyd/pyHub/unbox_yolov5_deepsort_counting/image/out.mp4', fourcc, 25, (640, 480))
#创建窗口
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
#获取视频设备/从视频文件中读取视频帧
cap = cv2.VideoCapture(0)
#此处解决了问题2,判断视频是都打开了
while cap.isOpened():
#从摄像头读取视频帧
ret, frame = cap.read()
#解决了问题3判断是否读取到数据
if ret == True:
print(numpy.shape(frame))
#将视频帧展示
cv2.imshow('video', frame)
# 此处解决了问题1,因为会把视频撑大,展示前将其固定住
cv2.resizeWindow('video', 640, 360)
vw.write(frame)
key = cv2.waitKey(int(1000 / 24))
if (key & 0xFF == ord('q')):
break
else:
break
#释放Videoapture
cap.release()
#释放Vidworiter
vw.replace()
cv2.destroyAllWindows()
八.Opencv控制鼠标
- 设置鼠标回调函数
- setMouseCallback(winname,callback,userdata)
- winname:控制的窗口
- callback:设置鼠标点盘操作窗口后的响应函数
- 给回调函数设置传递参数
- callback(event,x,y,flags,userdata):回调函数(函数名可自拟)
- event:鼠标事件(鼠标的点击事件)
- x,y:鼠标所在位置
- flags:主要用于组合键(例如按shift+鼠标键 or ctrl+鼠标键)
- userdata:上面传过来的
import cv2
import numpy as np
#鼠标回调响应函数
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
#创建显示窗口
cv2.namedWindow("mcallb", cv2.WINDOW_AUTOSIZE)
cv2.resizeWindow('mcallb', 640, 360)
#设置鼠标响应
cv2.setMouseCallback('mcallb', mouse_callback, "123")
# 创建图像背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow("mcallb", img)
key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
九.TrackBar控件
- createTrackbar
-
1.1trackbarname:控件名字
-
1.2winname:打开窗口名字
-
2.1value:trackbar当前值
-
3.1count:最小值为0,最大值为count
-
4.1callback:回调函数
-
4.2userdata:回调函数输入值
-
- getTrackbarPos
- trackbarname:控件名
- winname:所在窗口名
- 返回值:当前值(Trackbar所在值)
十.【实战】使用TrackBar控件
import cv2
import numpy as np
# 回调函数
def callback():
pass
# 创建窗口
cv2.namedWindow("trackbar", cv2.WINDOW_AUTOSIZE)
# 创造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()