深度学习:OpenCV基础方法总结及示例


1.机器视觉介绍

​ 现在说的机器视觉(Machine Vision)一般指的是计算机视觉(Computer Vision),简单来说就是研究如何使得机器看懂东西,利用摄像机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像,当前两者已不存在较大区别。

​ 首先在很多文献中,计算机视觉与机器视觉是不加区分的,但其实这两个术语既有区别又有联系的。计算机视觉是采用图像处理、模式识别、人工智能技术相结合的手段,着重于一幅或多幅图像的计算机分析。机器视觉则偏重于计算机视觉技术工程化,能够自动获取和分析特定图像,以控制相应的行为。

1.1 机器视觉的应用

物体识别,人体识别,车辆检测,OCR (Optical Character Recognition,光学字符识别)

2.OpenCV介绍

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像识别和计算机视觉方面的很多通用算法。

OpenCV用C++语言编写,它具有C ++,PythonJavaMATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。 [2]

3.OpenCV环境安装

3.1安装步骤

首先 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文件进行执行。

3.2安装测试

同样在虚拟环境文件夹内进入cmd环境

在这里插入图片描述

输入activate激活虚拟环境

输入ipython进入python环境

在这里插入图片描述

import cv2
cv2.__version__
# 获得打印结果 是安装时选择的版本号 
# 此处我的电脑安装版本为 3.4.11

在这里插入图片描述

4.创建显示窗口

4.1方法介绍
  • namedWindow()
  • imshow()
  • destroyAllwindows()
  • resizeWindow()
  • waitKey()
4.2简单案例
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’后窗口会被关闭

在这里插入图片描述

5.窗口显示图像

5.1方法介绍
  • imread(path) ——读取指定路径的文件
5.2简单案例
# 导包
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()

6.窗口保存图片

6.1方法介绍
  • imwrite(path, img) ——向指定path写入图片img
6.2简单案例
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’后 程序窗口关闭。

在这里插入图片描述

7.视频采集(本地视频+调用摄像头设备)

7.1方法介绍
  • VideoCapture(0) ——捕获摄像头,用数字来表示不同的设备,如0或1
  • VideoCapture(video) ——捕获本地视频资源
7.2简单案例
#尝试打开mp4文件
import cv2
vc = cv2.VideoCapture('video/0.mp4')
if vc.isOpened():
    # 每次读取一帧 视频则是由连续的帧组成
    open,frame = vc.read()
else:
    open = False

得open为True 证明打开视频文件成功,frame为读取的图片格式。

在这里插入图片描述

# -*- coding: <encoding name> -*- : # -*- 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

在这里插入图片描述

8.录制视频

8.1方法介绍
  • VideoWriter:参数一为输出文件地址 参数二为多媒体文件格式 参数三为帧率 参数四为分辨率
  • write 编码并写入缓存
  • release 缓存内容写入磁盘,并释放磁盘
8.2简单案例
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文件 这也是刚刚录的视频。

在这里插入图片描述

9.鼠标行为

9.1方法介绍
  • 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键
9.2简单案例
# 导包
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()

1.运行程序
在这里插入图片描述

2.触发鼠标事件
在这里插入图片描述

3.触发按键事件 窗口关闭

10.可拖动控件TrackBar

10.1方法介绍
  • createTrackbar(trackbarname,winname,value,count,onChange)
  • 创建TrackBar控件 value为trackbar的默认值 count为bar的最大值,最小值为0
  • getTrackbarPos(trackbarname,winname)获取TrackBar当前值
10.2简单案例
## 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 观察颜色实时变化

在这里插入图片描述

10.3补充:色彩空间
  • 用于识别色彩的人眼以及常见的色彩空间均为RGB
  • 但OpenCV默认使用的是BGR;BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同。

猜你喜欢

转载自blog.csdn.net/yt266666/article/details/127269150