注意OpenCV的颜色通道是BGR和正常RGB相反
开发环境为Jupyter
物体识别:人脸、车辆
识别图像中的文字(OCR)
图像拼接、修复背景更替
学习目标:
# 豆瓣源安装虚拟环境的包 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
# 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')
# 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()
%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()
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()
视频是有一定帧率的图片组成的 ==> 视频 == 一秒显示的图片组合(帧数)
30帧表示一秒显示50张图片
# 打开视频文件,返回视频对象 vs = cv2.VideoCapture(path) # 打开摄像头 0:表示第一个摄像头,返回摄像头对象 cap = cv2.videoCapture(0) cap.isOpened():判断是否打开摄像头
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()
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()
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()
OpenCV允许我们对窗口上的鼠标动作做出相应。
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()
应用:用于三原色控制
调色板
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()