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