现在说的机器视觉(Machine Vision)一般指的是计算机视觉(Computer Vision),简单来说就是研究如何使得机器看懂东西,利用摄像机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像,当前两者已不存在较大区别。
首先在很多文献中,计算机视觉与机器视觉是不加区分的,但其实这两个术语既有区别又有联系的。计算机视觉是采用图像处理、模式识别、人工智能技术相结合的手段,着重于一幅或多幅图像的计算机分析。机器视觉则偏重于计算机视觉技术工程化,能够自动获取和分析特定图像,以控制相应的行为。
物体识别,人体识别,车辆检测,OCR (Optical Character Recognition,光学字符识别)
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像识别和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。 [2]
首先 pip install virtualenv 安装该包 便于创建虚拟环境
在你指定的文件夹下创建虚拟环境 如virtualenv venv
在venv/Scripts中进入cmd环境 输入activate激活虚拟环境
在激活的虚拟环境中执行下列语句:
pip install opencv-python==3.4.11.45 -i https://pypi.douban.com/simple
pip install opencv-contrib-python==3.4.11.45 -i https://pypi.douban.com/simple
pip install jupyter -i https://pypi.douban.com/simple
pip install matplotlib -i https://pypi.douban.com/simple
至此就安装好了必备的环境
【安装低版本OpenCV是因为高版本中部分算法申请了专利】
或是进入OpenCV官网下载对应的.exe文件进行执行。
同样在虚拟环境文件夹内进入cmd环境
输入activate激活虚拟环境
输入ipython进入python环境
import cv2
cv2.__version__
# 获得打印结果 是安装时选择的版本号
# 此处我的电脑安装版本为 3.4.11
import cv2
# 创建窗口
# cv2.WINDOW_AUTOSIZE 大小自动 不允许开发者修改
# cv2.namedWindow('window',cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('window',cv2.WINDOW_NORMAL)
# 更改窗口大小
cv2.resizeWindow('window',800,600)
# 展示窗口
cv2.imshow('window',0)
# 等待按键
# waitKey会返回按键的ascii的值
# 0表示接受任意按键 如果给其他的整数,则表示等待按键的时间。
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
# 若接收到按键q 则销毁所有窗口
简单的纯黑色窗口,敲击键盘按键‘q’后窗口会被关闭
# 导包
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 读取图片
img = cv2.imread('img/dog.jpg')
# 显示图片
plt.imshow(img)
OpenCV读取图片的通道不是默认的RGB,而是BGR,因此使用matplotlib.pyplot显示的图片与原图存在色差。
因此使用OpenCV进行图片的读取后,同时也需要使用OpenCV进行图片的展示,修改为如下代码:
# 导包
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 读取图片
img = cv2.imread('img/dog.jpg')
# 显示图片
plt.imshow(img)
cv2.imshow('img',img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
图片显示为正常颜色:
将图片显示封装为函数 便于之后调用。
import cv2
def cv_show(name, img):
cv2.imshow(name,img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
import cv2
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',320,240)
img = cv2.imread('img/dog.jpg')
while True:
cv2.imshow('img',img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
print('程序中止')
break
if key & 0xFF == ord('s'):
cv2.imwrite("./dog.png",img)
print('dog.png已保存')
else:
print(key)
cv2.destroyAllWindows()
敲击键盘’s’后 我们的文件系统中保存了dog.png图片
而敲击键盘‘q’后 程序窗口关闭。
#尝试打开mp4文件
import cv2
vc = cv2.VideoCapture('video/0.mp4')
if vc.isOpened():
# 每次读取一帧 视频则是由连续的帧组成
open,frame = vc.read()
else:
open = False
得open为True 证明打开视频文件成功,frame为读取的图片格式。
# -*- coding: -*- : # -*- coding: utf-8 -*-
import cv2
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640, 480)
# 对cap的赋值语句只能够保存一行
# 读取摄像头设备
#cap = cv2.VideoCapture(0)
# 播放video/0.mp4文件
cap = cv2.VideoCapture('video/0.mp4')
# 循环读取
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('video',frame)
# 此处不能使用0作为等待参数 因为0会导致无限等待!
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break;
if key & 0xFF == ord('s'):
cv2.imencode('.png', frame)[1].tofile('img/截图.png')
print('截图已保存')
# 记得释放资源
cap.release()
cv2.destroyAllWindows()
若敲击键盘’s‘将会对此刻视频播放的该帧或是摄像头捕捉的画面进行截图保存
文件保存地址为当前目录的img文件夹下 图片名称为截图.png
import cv2
# 调用摄像头设备
cap = cv2.VideoCapture(0)
# *mp4v是解包操作 = ['m','p','4','v']
# 选定文件格式mp4
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
vw = cv2.VideoWriter('video/output.mp4',fourcc,20,(640,480))
# 事件循环
while cap.isOpened():
# 读取摄像头内容
ret, frame = cap.read()
# 如果未能读取成功 则证明视频录制未在进行工作
if not ret:
print('can not recive frame, Exiting...')
break
# 将读取的画面写入缓存区中
vw.write(frame)
# 将摄像头抓拍内容显示屏幕中
cv2.imshow('frame',frame)
# 按键q则停止录制
if cv2.waitKey(1) == ord('q'):
break
# 记得释放资源 否则内容无法有效保存至内存中
cap.release()
vw.release()
cv2.destroyAllWindows()
在video路径下保存了output.mp4文件 这也是刚刚录的视频。
setMouseCallback(winname,callback,userdata)
设置鼠标事件(窗口名称,回调函数,回调函数参数)
callback(event,x,y,flags,uesrdata)
Event具有固定的选择,是鼠标事件的类型。
X 和 Y是鼠标的坐标,单位是像素
flags用于组合按键
uesrdata与setMouseCallback中同名参数相对应
鼠标事件Event的类型:
常量 | 变量名 | 鼠标行为 |
---|---|---|
1 | EVENT_MOUSEMOVE | 鼠标移动 |
2 | EVENT_LBUTTONDOWN | 按击鼠标左键 |
3 | EVENT_RBUTTONDOWN | 按击鼠标右键 |
4 | EVENT_MBUTTONDOWN | 按击鼠标中键 |
5 | EVENT_LBUTTONUP | 松开鼠标左键 |
6 | EVENT_RBUTTONUP | 松开鼠标右键 |
7 | EVENT_MBUTTONUP | 松开鼠标中键 |
8 | EVENT_LBUTTONDBLCLK | 双击鼠标左键 |
9 | EVENT_RBUTTONDBLCLK | 双击鼠标右键 |
10 | EVENT_MBUTTONDBLCLK | 双击鼠标中键 |
11 | EVENT_MOUSEHWHEEL | 左右滚动鼠标 |
组合按键flags的类型:
常量 | 变量名 | 按键事件 |
---|---|---|
1 | EVENT_FLAG_LBUTTON | 按下左键 |
2 | EVENT_FLAG_RBUTTON | 按下右键 |
4 | EVENT_FLAG_MBUTTON | 按下中键 |
8 | EVENT_FLAG_CRTLKEY | 按下ctrl键 |
16 | EVENT_FLAG_SHIFTKEY | 按下shift键 |
32 | EVENT_FLAG_ALTKEY | 按下alt键 |
# 导包
import cv2
import numpy as np
# 生成全黑的图片 用作初始背景
img = np.zeros((360,640,3),np.uint8)
# 创建名为‘mouse’的窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)
# 设置鼠标回调函数
cv2.setMouseCallback('mouse',mouse_callback,'2')
# 鼠标事件
def mouse_callback(event, x, y, flags, userdata):
# 如果鼠标发生事件4所代表的行为 则执行下列函数
if event == 4:
cv2.destroyAllWindows()
# 读取img文件路径下的dog.jpg
img = cv2.imread('img/dog.jpg')
# 重新创建名为dog的窗口
cv2.namedWindow('dog',cv2.WINDOW_NORMAL)
cv2.resizeWindow('dog', 640, 360)
# 事件循环 展示dog图片
while True:
cv2.imshow('dog',img)
key = cv2.waitKey(1)
#'q'则退出
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
# 显示窗口和背景
while True:
cv2.imshow('mouse',img)
key = cv2.waitKey(1)
#'q'则退出
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
3.触发按键事件 窗口关闭
## trackbar
import cv2
import numpy as np
# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,480)
# 定义回调函数
def callback(value):
print(value)
# 创建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')
# 改变背景图片颜色
# 全部行列(所有像素点)均修改为getTrackbarPos()的值
img[:] = [b, g, r]
# OpenCV的色彩空间为BGR
cv2.imshow('trackbar',img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
1.运行程序
2.拖动控件TrackBar 观察颜色实时变化