【OpenCV】(四)图像视频的加载和显示
系列内容:OpenCV概述与环境配置,OpenCV基础知识和绘制图形,图像的算数与位运算,图像视频的加载和显示,图像基本变换,滤波器,形态学,图像轮廓,图像直方图,车辆统计项目,特征检测和匹配,图像查找和拼接,虚拟计算器项目,信用卡识别项目,图像的分割与修复,人脸检测与车牌识别,目标追踪,答题卡识别判卷与文档ocr扫描识别,光流估计
(一)创建和显示窗口
1.基本操作
- namedWindow()创建命名窗口
- imshow()显示
- destoryAllwindows()摧毁窗口
- resizeWindow()改变窗口大小
- waitKey()等待用户输入
2.示例代码
# 导入cv2包
import cv2
# 创建窗口
# CV2.WINDOW_AUTOSIZE不允许改变窗口大小
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
# 更改窗口大小
cv2.resizeWindow('window', 800, 600)
# 展示名字为window的窗口
cv2.imshow('window', 0) # 这里原代码展示时传入的第二个参数0可能存在问题,一般应传入图像数据,但按原样保留
# 等待按键
# 0表示接收任意按键,如果给其他的整数,则表示等待按键的时间
# 利用waitKey销毁窗口
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
print('准备销毁窗口')
cv2.destroyAllWindows()
# ord()是计算ascii码的函数
ord('q')
(二)读取图片
1.使用matplotlib的pyplot读图片
###读取 图片
import matplotlib.pyplot as plt
# 默认是彩色图片
login = cv2.imread('./login-bg.jpg') # 这里存在潜在问题,前面未导入cv2库,若单独运行此代码块会报错,但按要求原样保留
# numpy的ndarray
login
结果显示为矩阵,如图4.1所示:
2.使用matplotlib的pyplot显示图片
# 发现matplotlib显示的图片和真实的图片颜色不一样,因为opencv读进来的图片数据不是默认的RGB,
# 而是BGR,直接cv2.imshow()展示
plt.imshow(login)
使用matplotlib的pyplot显示图片,如图4.2所示:
3.读图函数的封装与调用
(1)函数封装与调用:
# 把展示图片的代码封装成函数,方便重用
def cv_show(name, img):
cv2.imshow(name, img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
函数调用:cv_show('image',image)
(2)工具封装与调用:
# 把展示图片的代码封装成函数,方便重用
def cv_show(name, img):
import cv2
cv2.imshow(name, img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
# 从外部py文件导入工具类,即可直接使用
from npm import cv_show
# 必须执行外部文件
%run npm.py
cv_show('login', login)
(三)保存图片
使用imwrite(path,img);保存图片
示例:
import cv2
# 创建窗口
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
# 读取图片
img = cv2.imread('./login-bg.jpg')
while True:
cv2.imshow('img', img)
key = cv2.waitKey(0)
if key == ord('q'):
break
elif key == ord('s'):
cv2.imwrite('./123.png', img)
else:
print(key)
cv2.destroyAllWindows()
(四)视频采集
1.基础知识
视频由帧组成,一帧为一张图片,一般是三十帧;
cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,比如0,1;
如果是视频文件,可以直接指定路径即可.
2.打开摄像头
# 打开摄像头
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
cap = cv2.VideoCapture(0)
# 循环读取摄像头的每一帧
while True:
# 读一帧数据,返回标记和这一帧数据,True表示读到了数据,False表示没有读到数据
ret, frame = cap.read()
# 可以根据ret做个判断
if not ret:
# 没读到数据,直接退出
break
# 显示读到的数据
cv2.imshow('vidio', frame) # 展示窗口名拼写与前面创建窗口名不一致,但按原样保留
key = cv2.waitKey(10)
if key == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
3.播放视频
# 打开摄像头
import cv2
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('vidio', 640, 480)
# 打开视频,输入视频的地址
cap = cv2.VideoCapture('./1.mp4')
# 循环读取摄像头的每一帧
while True:
# 读一帧数据,返回标记和这一帧数据,True表示读到了数据,False表示没有读到数据
ret, frame = cap.read()
# 可以根据ret做个判断
if not ret:
# 没读到数据,直接退出
break
# 显示读到的数据
cv2.imshow('vidio', frame)
# 假如一个视频是30帧,那么每张图片之间的间隔是多少毫秒?
key = cv2.waitKey(1000 // 30)
if key == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
(五)录制视频
1.mp4视频
# 录制视频
import cv2
cap = cv2.VideoCapture(0)
# *mp4v就是解包操作,等同于'm','p','4','v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# avi格式
# (640,480)表示摄像头拍视频,这个大小搞错了也不行,
# 注意分辨率
# 创建videowriter
vw = cv2.VideoWriter('output.mp4', fourcc, 30, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
printf('can not recive frame, Exiting...')
break
# 写1每一帧数据
vw.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# 释放
cap.release()
vw.release()
cv2.destroyAllWindows()
2.avi视频(大小是mp4的1/3)
# 录制视频
import cv2
cap = cv2.VideoCapture(0)
# *mp4v就是解包操作,等同于'm','p','4','v'
# fourcc=cv2.VideoWriter_fourcc(*'mp4v')
# avi格式
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# (640,480)表示摄像头拍视频,这个大小搞错了也不行,
# 注意分辨率
# 创建videowriter
# vw=cv2.VideoWriter('output.mp4',fourcc,30,(640,480))
vw = cv2.VideoWriter('output.avi', fourcc, 30, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
printf('can not recive frame,Exiting...')
break
# 写1每一帧数据
vw.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# 释放
cap.release()
vw.release()
cv2.destroyAllWindows()
(六)控制鼠标
1.基本操作
OpenCV允许我们对窗口上的鼠标动作做出响应;
setMouseCallback(winname,callback,userdata),winname是窗口的名字,callback是回调函数,userdata是给回调函数的参数;
callback(event x,y,flags,userdata)回调函数必须包含这五个参数,event是事件(鼠标移动,左键,右键),x,y是点鼠标的坐标点,flags主要用于组合键,userdata来自于setMouseCallback的userdata
2.鼠标事件
以下为事件定义
- EVENT_MOUSEMOVE 0 鼠标移动
- EVENT_LBUTTONDOWN 1 按下鼠标左键
- EVENT_RBUTTONDOWN 2 按下鼠标右键
- EVENT_MBUTTONDOWN 3 按下鼠标中键
- EVENT_LBUTTONUP 4 左键释放
- EVENT_RBUTTONUP 5 右键释放
- EVENT_MBUTTONUP 6 中键释放
- EVENT_LBUTTONDBLCLK 7 左键双击
- EVENT_RBUTTONDBLCLK 8 右键双击
- EVENT_MBUTTONDBLCLK 9 中键双击
- EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动
- EVENT_MOUSEHWHEEL 11 鼠标左右滚动
以下为标志定义
flags:
- EVENT_FLAG_LBUTTON 1 按下左键
- EVENT_FLAG_RBUTTON 2 按下右键
- EVENT_FLAG_MBUTTON 4 按下中键
- EVENT_FLAG_CTRLKEY 8 按下ctrl键
- EVENT_FLAG_SHIFTKEY 16 按下shift键
- EVENT_FLAG_ALTKEY 32 按下alt键
3.示例
# 鼠标事件
import cv2
import numpy as np
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控件
滑动条图片,如图4.3所示:
1.基本函数
createTrackbar(trackbarname,winname,value,count,onchange)创建TrackBar控件,value为trackbar的默认值,count为bar的最大值,最小值为0;
getTrackbarPos(trackbarname,winname)获取Trackbar的当前值
2.示例
##tracker
import cv2
import numpy as np
# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
# 定义回调函数
def callback(value):
print(value)
# 创建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(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
滑动条示例,如图4.4所示:
更多推荐
所有评论(0)