ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OpenCV(一)之图片&视频的加载和显示

2022-06-25 22:34:28  阅读:197  来源: 互联网

标签:视频 窗口 img cap cv2 OpenCV key waitKey 加载


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()        

标签:视频,窗口,img,cap,cv2,OpenCV,key,waitKey,加载
来源: https://www.cnblogs.com/nanfengnan/p/16412553.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有