OpenCV(一)之图片&视频的加载和显示
2022/6/25 23:30:40
本文主要是介绍OpenCV(一)之图片&视频的加载和显示,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
OpenCV(open source version)
注意OpenCV的颜色通道是BGR和正常RGB相反
开发环境为Jupyter
1.机器视觉的应用
物体识别:人脸、车辆
识别图像中的文字(OCR)
图像拼接、修复背景更替
2.OpenCV介绍
- 跨平台
- Gray Bradsky于1999年开发,2000年开发
- C++、Python、Java、JS
- 最早使用C写的,C++重构的,C++可以直接使用(fastest),但实现了Java、Python等接口
- 底层C/C++,Python开发简单
学习目标:
- OpenCV运行机制
- 可以使用OpenCV处理一些图像常见问题
- 学会物体识别,文字识别等问题的处理思路 - 人工智能简单应用
3.OpenCV安装
# 豆瓣源安装虚拟环境的包 pip install virtualenv -i https://pypi.doubanio.com/simple/ # 安装虚拟环境 语法:virtualenv 虚拟环境名 virtualenv venv # 进入venv的Scripts目录的cmd,激活虚拟环境 activate # 老版本算法无版权争议 # 多个包一起安装:pip install 包名 包名 -i 镜像源 # contrib 是opencv的拓展包 pip install opencv-python==3.4.0.14 opencv-contrib-python==3.4.0.14 jupyter matplotlib -i https://pypi.doubanio.com/simple/
查看pip版本
python -m pip --version # 查看python版本 python -m pip install --upgrade pip #pip版本太老了,使用此命令更新
安装opencv
pip install opencv-python numpy matplotlib -i https://pypi.douban.com/simple
4.OpenCV使用
4.1基本函数
- namedWindow() 创键命名窗口
- imshow()显示窗口
- destroyAllwindows() 摧毁窗口
- resizeWindows() 改变窗口大小
- waitKey() 等待用户输入
4.2创建窗口
# opencv的包名叫cv2 import cv2 # 创键窗口 shift+tab 查看函数 cv2.namedWindow('window1',cv2.WINDOW_NORMAL) # 更改指定窗口的大小 cv2.resizeWindow('window1',800,600) # 展示名字为window1的窗口,0是图片对象 cv2.imshow('window1',0) # 等待按键 # waitKey会返回按键的ascii码值 # 0 表示接受任意按键,如果给其他的整数,表示按键的时间(ms),时间过了,返回-1 # 可以利用waitKey来销毁窗口,不用每次重启python key = cv2.waitKey(0) # 销毁窗口 if key & 0xFF == ord('q'): # & 0xFF写不写都行 cv2.destroyAllWindows() # python中计算ascii的函数 ord('q')
4.3 加载显示图片
- imread(path,flag):使用imread可以读取土拍你,默认读取的是彩色图片
# m进入makedown模式,alt+enter/ctrl+enter,执行makerdown语法 import cv2 import matplotlib.pyplot as plt # 从指定文件读取图片,路径不能包含中文,返回图片对象(matrix) cat = cv2.imread('G:\\a.jpg') # 显示图片对象,会发现读取图片颜色不同,因为opencv都进来的图片的数据通道是BGR(蓝绿红),不是RGB # 所以opencv读取的图片要使用opencv自己的方法显示图片 cv2.imshow('a',cat) # 可以利用waitKey来销毁窗口,不用每次重启python key = cv2.waitKey(0) if key & 0xFF == ord('q'): # & 0xFF写不写都行 cv2.destroyAllWindows()
4.3.1封装一个显示图片的函数 -- 方便重用
%run utils.py #jupyter中执行外部文件
# utils.py # name : 窗口名 # img : 图片对象 import cv2 def cv_show(name,img): cv2.imshow(name,img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
4.4 保存图片
- imwrite(path,img):使用imwrite保存图片到path路径下
import cv2 # 命名窗口为img cv2.namedWindow('img',cv2.WINDOW_NORMAL) # 设置窗口img大小 cv2.resizeWindow('img',800,600) # 读一个图片 img = cv2.imread("G:\\a.jpg") while True: # 显示img窗口 cv2.imshow('img',img) # 等待输入按键 key = cv2.waitKey(0) if key == ord('q'): break elif key == ord('s'): # 保存图片img到G:\\b.png cv2.imwrite('G:\\b.png',img) else: print(key) cv2.destroyAllWindows()
4.5 视频采集
视频是有一定帧率的图片组成的 ==> 视频 == 一秒显示的图片组合(帧数)
30帧表示一秒显示50张图片
- cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,eg:0,1...
- 如果是视频文件,可以直接指定路径即可.
# 打开视频文件,返回视频对象 vs = cv2.VideoCapture(path) # 打开摄像头 0:表示第一个摄像头,返回摄像头对象 cap = cv2.videoCapture(0) cap.isOpened():判断是否打开摄像头
4.5.1 实时摄像头
import cv2 cv2.namedWindow('video',cv2.WINDOW_NORMAL) cv2.resizeWindow('video',640,480) # 返回摄像头对象 cap = cv2.VideoCapture(0) # 摄像头打开失败不报错 # 循环读取摄像头每一帧 while cap.isOpened(): # 读一帧数据,然会返回标记和一帧数据,Ture成功,False没到到数据 ret,frame = cap.read() if not ret: # 没读到数据 break # 读到了数据,显示到窗口上 cv2.imshow('video',frame) # 等到10ms输入键盘字符 key = cv2.waitKey(10) if key & 0XFF == ord('q'): break # 释放资源 cap.release() # 销毁窗口 cv2.destroyAllWindows()
4.5.2 打开视频
import cv2 cv2.namedWindow('video',cv2.WINDOW_NORMAL) cv2.resizeWindow('video',640,560) cap = cv2.VideoCapture('G:\\c.mp4') while cap.isOpened(): ret,frame = cap.read() if not ret: break cv2.imshow('video',frame) # 如果一个视频是30帧,那麽每张图片之间要间隔多少ms # 所以播放视频时候,还要考虑原视频的帧率 # 每张图片间隔1000//3ms key = cv2.waitKey(1000//3) # 只能使用整数 if key & 0XFF == ord('q'): break cap.release() cv2.destroyAllWindows()
4.5.3 视频录制(把摄像头录制的视频保存下来)
- VideoWriter:参数一为输出文件,参数二为多媒体文件格式(VideoWriter_fourcc(多媒体文件格式)),参数三为帧率,参数四为分辨率
- VideoWriter('out.mp4',cv2.VideoWriter_fourcc(*'mp4v'),20,(640,480))
- mp4v格式:压缩比高,视频文件小,XVID格式:视频文件大,早期用的
- write 编码并写入缓存
- release 缓存内容写入磁盘,并释放资源
- 输出文件的格式和
import cv2 cv2.namedWindow('frame',cv2.WINDOW_NORMAL) cv2.resizeWindow('frame',600,560) # 捕获相机 cap = cv2.VideoCapture(0) # *'mp4v' 解包操作 == 'm','p','v','4' # 创键文件格式对象 fourcc = cv2.VideoWriter_fourcc(*'mp4v') # fourcc = cv2.VideoWriter_fourcc(*'XVID') # 创键VideoWriter vw = cv2.VideoWriter('G:\\output.mp4',fourcc,30,(640,480)) while cap.isOpened(): ret,frame = cap.read() if not ret: break # 读到了数据,把这一帧的图片写入到缓存中,释放的时候写入指定文件 vw.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) == ord('q'): break # 释放资源 cap.release() vw.release() cv2.destroyAllWindows()
4.6 控制鼠标
OpenCV允许我们对窗口上的鼠标动作做出相应。
- setMouseCallback(winname,callback,userdate):winname是窗口的名字,callback是回调函数,userdata是给回调函数的参数
- callback(event,x,y,flags,userdata):回调函数必须包含这5个参数,event是事件(鼠标移动、左键、右键,),x,y是点鼠标的坐标点,flags主要用于组合键,userdata就是上面的setMouseCallback的userdata
import cv2 import numpy as np # 回调函数名可以随便取,但是参数必须是5个 # event表示鼠标事件 # (x,y)是发生事件的坐标 # flags是按键组合 # userdata是用户传入的数据 def mouse_callback(event,x,y,flags,userdata): print(event,x,y,flags,userdata) # 按下鼠标右键退出 if event == 2: cv2.destroyAllWindows() # 创建窗口 cv2.namedWindow('mouse',cv2.WINDOW_NORMAL) # 宽度和高度 # 行是高度,列是宽度 # 所以和zeros数组中传入的行和列要相反 -- attention cv2.resizeWindow('mouse',640,360) # 设置鼠标的回调函数 # '123'会传送到userdata中 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()
4.6 TrackBar控件
应用:用于三原色控制
- createTrackBar(trackbarname,winname,value,count,onChange):创键TrackBar控件
- trackbarname为控件名,winname为cv2创建的窗口名,value为tarckbar的默认值,count为bar的最大值,最小为0,onChange为TrackBar的值改变的时候触发的回调函数
- getTrackbarPos(tackbarname,winname):获取TrackBar当前值
调色板
import cv2 import numpy as np # 创建窗口 cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL) cv2.resizeWindow('trackbar',640,480) # 定义回调函数 def callback(value): pass # 创键3个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()
这篇关于OpenCV(一)之图片&视频的加载和显示的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升