C/C++教程

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

本文主要是介绍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(一)之图片&视频的加载和显示的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!