0.前言
现在说的机器视觉(Machine Vision)一般指计算机视觉(Computer Vision), 简单来说就是研究如何使机器看懂东西.就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。
0.1机器视觉应用场景
物体识别: 人脸识别, 车辆检测
识别图像中的文字(OCR)
图像拼接, 修复, 背景替换
1.窗口创建,显示,保存
窗口创建和显示,opencv给我们提供了一些api,我们可以自己选择合适的使用。如:
namedWindow() //创建命名窗口 可以让窗口自适应 可有可无
imshow() //显示窗口
destoryAllwindows() //销毁窗口
resizeWindow() //定义窗口大小
waitKey() //等待用户输入 用于阻塞
对于api的参数选择,可以去看文档,这里放一个中文文档。
1.1代码示例:
#导入opencv的包
import cv2
#加载图像数据
img=cv2.imread('F:/opencv/opencv_tutorial_data-master/images/hist_01.jpg')
#创建窗口
cv2.namedWindow('one', cv2.WINDOW_NORMAL)
#显示窗口
cv2.imshow("one",img)
#保存
cv2.imwrite("./123.png", img)
# 修改窗口大小
#cv2.resizeWindow('new', 1920, 1080)
#等待
cv2.waitKey(0)
#销毁
cv2.destroyAllWindows()
2.视频图片数据采集
2.1视频介绍
-
视频是由图片组成的, 视频的每一帧就是一幅图片, 一般是24帧,30帧, 表示一秒显示24/30张图片.
-
吃鸡游戏一般都是60帧或者更高,体验感比较好,流畅。
2.2.Api以及讲解
-
cv2.VideoCapture可以捕获摄像头, 用数字来表示不同的设备, 比如0, 1(电脑自带设备默认是0),具体设备号是什么可以自己尝试一下。这里有两篇文章可以去获取设备id号
-
让OpenCV枚举所有摄像头-附如何建立Windows下的OpenCV工程_执假以为真的博客-CSDN博客_opencv 枚举摄像头
-
如果是视频文件, 可以直接指定路径即可.
2.3视频代码案列
#导入opencv的包
import cv2
#创建窗口
cv2.namedWindow('视频', cv2.WINDOW_NORMAL)
#打开视频
vc = cv2.VideoCapture('C:/Users/34952/Desktop/img/sv.mp4')
#判断是否打开
if vc.isOpened() :
print("视频成功打开")
while True:
#读取视频数据 返回值是标志位(true 成功打开 false 打开失败)和照片数据
flag,img=vc.read()
if flag:
cv2.imshow('视频',img)
#假设视频是30帧
key = cv2.waitKey(1000 // 30)
#退出键
if key == ord('q'):
break
else :
print("视频播放完毕")
break
else :
print("视频打开失败")
#释放视频资源
vc.release()
#释放窗口资源
cv2.destroyAllWindows()
2.4摄像头案列代码
摄像头与视频的差别代码就下面这两句
#打开视频
#vc = cv2.VideoCapture('C:/Users/34952/Desktop/img/sv.mp4')
#打开摄像头
vc = cv2.VideoCapture(0)
2.5视频录制
在前面视频或者摄像头案列基础上,我们对每一帧数据保存到视频文件里面就可以了。
注意:摄像头像素 视频编码格式
视频数据先在缓存里面,当#释放视频文件流资源vw.release()时候,会将数据写入磁盘里面。
#导入opencv的包
import cv2
#创建窗口
cv2.namedWindow('视频', cv2.WINDOW_NORMAL)
#打开摄像头
vc = cv2.VideoCapture(0)
# *mp4v就是解包操作 等同于 'm', 'p', '4', 'v' 确定视频编码格式 要和下面保存格式一一对应
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# (640, 480)表示摄像头拍视频, 这个大小搞错了也不行. 30是帧数
# 主要是这个分辨率,符合摄像头的像素要求
vw = cv2.VideoWriter('C:/Users/34952/Desktop/img/output.mp4', fourcc, 30, (640, 480))
#判断是否打开
if vc.isOpened() :
print("摄像头功打开")
while True:
#读取摄像头数据 返回值是标志位(true 成功打开 false 打开失败)和照片数据
flag,img=vc.read()
if flag:
cv2.imshow('视频',img)
vw.write(img)
key = cv2.waitKey(1)
#退出键
if key == ord('q'):
break
else :
print("视频播放完毕")
break
else :
print("摄像头打开失败")
#释放视频资源
vc.release()
#释放视频文件流资源
vw.release()
#释放窗口资源
cv2.destroyAllWindows()
3.鼠标事件
-
setMouseCallback(winname, callback, userdata) winname是窗口的名字, callback是回调函数, userdata是给回调函数的参数.
-
callback(event, x, y, flags, userdata)回调函数必须包含这5个参数. event是事件(鼠标移动, 左键, 右键等), x,y是点鼠标的坐标点, flags主要用于组合键, userdata就是上面setMouseCallback的userdata。
鼠标事件(event):
EVENT_MOUSEMOVE 0 鼠标移动
EVENT_LBUTTONDOWN 1 按下鼠标左键
EVENT_RBUTTONDOWN 2 按下鼠标右键
EVENT_MBUTTONDOWN 3 按下鼠标中键
EVENT_LBUTTONUP 4 左键释放
EVENT_RBUTTONUP 5 右键释放
EVENT_MBUTTONUP 6 中键释放
EVENT_LBUTTONDBLCLK 7 左键双击
EVENT_RBUTTONDBLCLK 8 右键双击
EVENT_MBUTTONDBLCLK 9 中键双击
EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动
EVENT_MOUSEHWHEEL 11 鼠标左右滚动
flags:
EVENT_FLAG_LBUTTON 1 按下左键
EVENT_FLAG_RBUTTON 2 按下右键
EVENT_FLAG_MBUTTON 4 按下中键
EVENT_FLAG_CRTLKEY 8 按下ctrl键
EVENT_FLAG_SHIFTKEY 16 按下shift键
EVENT_FLAG_ALTKEY 32 按下alt键
3.1.案列代码
#导包
import cv2
import numpy as np
#定义函数
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)
# 设置鼠标回调函数
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.TrackBar控件
-
createTrackbar(trackbarname, winname, value, count, onChange) 创建TrackBar控件, value为trackbar的默认值(滚动条的初始值), count为bar的最大值, 最小为0,onChange响应函数
-
getTrackbarPos(trackbarname, winname) 获取TrackBar当前值
4.1案列代码
## 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')
# 改变背景图颜色
img[:] = [b, g, r]
cv2.imshow('trackbar', img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()