热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

01图像视频的加载和显示(OpenCV基础)(机器视觉)

知识重点OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列,一般图片通道都是按照RGB来排列.基于OpenCV的机器视觉ord(q):表示计算ASCII码值#113#对应配

知识重点


  • OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列, 一般图片通道都是按照RGB来排列.
  • 基于OpenCV的机器视觉
  • ord('q'):  表示计算ASCII 码值      # 113   # 对应配对函数chr()
  • imwrite(path, img): 使用imwrite保存图片
  • 打开视频文件: vc = cv2.VideoCapture('./1.mp4')
  • 视频是由图片组成的, 视频的每一帧就是一幅图片, 一般是30帧, 表示一秒显示30张图片.
  • 创建窗口

cv2.namedWindow('window',cv2.WINDOW_NORMAL) # WINDOW_NORMAL可以让窗口大小可以调节
cv2.resizeWindow('window', 800,600) # 更改窗口大小
cv2.imshow('window', 0) # 展示名字为window的窗口

  • 使用waitkey() 关闭窗口    # waitKey方法表示等待按键, 0表示任何按键, 其他整数表示等待按键的时间

key = cv2.waitKey(0) # key是int型, 最少是16位, 但ASCII 是8位
if key&0xFF == ord('q'):
print('准备销毁窗口')
cv2.destroyAllWindows()

  • VideoWriter() :  录制视频,  参数一为输出文件, 参数二为多媒体文件格式 VideoWriter_fourcc, 参数三为帧率, 参数四为分辨率.

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # *mp4v就是解包操作 等同于'm','p','4','v'
# (640, 480)表示摄像头拍视频, 这个大小搞错了也不行. 主要是这个分辨率.
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))

  • 可以一直显示一张图片:    cv2.imshow( '窗口名' , img)

img = np.zeros((360, 640, 3), np.uint8)
cv2.imshow('mouse', img)



1. 机器视觉介绍

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

1.1 机器视觉的应用


  • 物体识别: 人脸识别, 车辆检测

  • 识别图像中的文字(OCR)

  • 图像拼接, 修复, 背景替换


2. OpenCV介绍


  • Gray Bradsky于1999年开发, 2000年发布

  • C++, Python, Java, JS

  • 跨平台(Windows, Linux, Mac...)

为什么选择python语言:

  • python语言简单, 开发速度快

  • 底层使用C/C++, 速度有保障

  • 有完整的生态链

学习目标:

  • 了解OpenCV的运行机制

  • 可以使用OpenCV处理一些图像常见问题

  • 学会物体识别, 文字识别等问题的处理思路


3. 安装OpenCV

进入虚拟环境, 执行pip install opencv-python==3.4.1.15,  3.4.2之后有些算法申请了专利,用不了

安装opencv扩展包(选装): pip install opencv-contrib-python==3.4.1.15

如果装不了去:https://www.lfd.uci.edu/~gohlke/pythonlibs/下载相应的包手动安装.

pip install opencv-python3.4.1.15 opencv-contrib-python3.4.1.15 jupyter matplotlib -i https://pypi.douban.com/simple

4. 图像视频的加载和显示


4.1 创建和显示窗口


  • namedWindow() 创建命名窗口

  • imshow() 显示窗口

  • destroyAllwindws() 摧毁窗口

  • resizeWindow() 改变窗口大小

  • waitKey() 等待用户输入

# opencv 名字叫OpenCV,导包叫cv2
import cv2
# 创建窗口 cv2.window_autosize 不容许修改窗口大小,
# WINDOW_NORMAL可以让窗口大小变得可以调节
cv2.namedWindow('window',cv2.WINDOW_NORMAL)
# 更改窗口大小
cv2.resizeWindow('window', 800,600)
# 展示名字为window的窗口
cv2.imshow('window', 0)
# waitKey方法表示等待按键, 0表示任何按键, 其他整数表示等待按键的时间,
# 单位是毫秒, 超过时间没有发生按键操作窗口会自动关闭.
key = cv2.waitKey(0)
# key是int型, 最少是16位, 但ASCII 是8位
if key&0xFF == ord('q'):
print('准备销毁窗口')
cv2.destroyAllWindows()

4.2 加载显示图片

imread(path, flag): 使用imread可以读取图片, 默认读取的是彩色图片.比如:

# 导入opencv包
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 读取图片
img = cv2.imread('./cat.jpeg?s=#39;)
plt.imshow(img)

原始图片为前一张, 使用matplotlib显示为后一张:    # 因为读取数据时维度发生了变化

 发现这个猫的样子没变, 但是颜色不太对, 这是因为OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列的, 一般图片通道都是按照RGB来排列的.为了正常的显示猫的图片, 我们要用OpenCV的图像显示方法 。

我们可以把显示图片的方法封装成一个函数方便我们显示图片:

def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv_show('cat', img) # 按任意键关闭窗口

 

4.3 保存图片


  • imwrite(path, img): 使用imwrite保存图片.

import cv2
# 创建窗口
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
# 读取图片
img = cv2.imread('./img/cat.jpeg?s=#39;)
while True:
cv2.imshow('img', img)
key = cv2.waitKey(0)
if key == ord('q'):
break
elif key == ord('s'):
cv2.imwrite('./123.png', img)
else:
print(key)
cv2.destroyAllWindows()

4.4 视频采集


  • 视频是由图片组成的, 视频的每一帧就是一幅图片, 一般是30帧, 表示一秒显示30张图片.

  • cv2.VideoCapture可以捕获摄像头, 用数字来表示不同的设备, 比如0, 1

  • 如果是视频文件, 可以直接指定路径即可.

  • 读取视频文件: vc = cv2.VideoCapture('./1.mp4')

# 打开视频文件
vc = cv2.VideoCapture('./1.mp4')
# 打开摄像头
vc = cv2.VideoCapture(0)

  • 检查是否正常打开

if vc.isOpened():
# 读取视频的一帧.
open, frame = vc.read() # frame 是图片, 视频帧
else:
open = False

  • 循环读取视频每一帧数据

while True:
# 可以读到内容ret返回True
ret, frame = vc.read()
# 读到最后frame就是空
if frame is None:
break
if ret == True:
cv2.imshow('result', frame)
# 0xFF == 27表示按esc退出键会退出
if cv2.waitKey(33) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()

  • cap.read() 返回两个值, 第一个为状态值, 读到帧为True, 第二个值为视频帧

  • cap.release()

  • 循环读取摄像头的每一帧数据

## 从摄像头一直读取数据
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
# 获取视频设备
cap = cv2.VideoCapture(0)
while True:
# 从摄像头读取视频
ret, frame = cap.read()

# 将视频帧放在窗口中显示
cv2.imshow('video', frame)

# 等待键盘事件, 如果为q,退出
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break

# 释放
cap.release()
cv2.destroyAllWindows()

4.5 视频录制


  • VideoWriter : 参数一为输出文件, 参数二为多媒体文件格式(VideoWriter_fourcc, 参数三为帧率, 参数四为分辨率.

  • write 编码并写入缓存

  • release 缓存内容写入磁盘, 并释放资源

cap = cv2.VideoCapture(0)
# *mp4v就是解包操作 等同于 'm', 'p', '4', 'v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# (640, 480)表示摄像头拍视频, 这个大小搞错了也不行.
# 主要是这个分辨率.
vw = cv2.VideoWriter('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)
if cv2.waitKey(1) == ord('q'):
break

cap.release()
#释放VideoWriter
vw.release()
cv2.destroyAllWindows()

4.6 控制鼠标

OpenCV允许我们对窗口上的鼠标动作做出响应.

  • setMouseCallback(winname, callback, userdata) winname是窗口的名字, callback是回调函数, userdata是给回调函数的参数  # 结合callback使用

  • callback(event, x, y, flags, userdata)回调函数必须包含这5个参数. event是事件(鼠标移动, 左键, 右键等), x, y是点鼠标的坐标点, flags主要用于组合键, userdata就是上面的setMouseCallback 的 userdata

    鼠标事件:

    • 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键

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.7 TrackBar控件  (追踪条)

TrackBar控件

  • createTrackbar(trackbarname, winname, value, count, onChange) 创建TrackBar控件, value为trackbar的默认值, count为bar的最大值, 最小为0

  • getTrackbarPos(trackbarname, 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 == ord('q'):
break
cv2.destroyAllWindows()




推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
独孤求独孤_715
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有