热门标签 | 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()




推荐阅读
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 装饰者模式(Decorator):一种灵活的对象结构设计模式
    装饰者模式(Decorator)是一种灵活的对象结构设计模式,旨在为单个对象动态地添加功能,而无需修改原有类的结构。通过封装对象并提供额外的行为,装饰者模式比传统的继承方式更加灵活和可扩展。例如,可以在运行时为特定对象添加边框或滚动条等特性,而不会影响其他对象。这种模式特别适用于需要在不同情况下动态组合功能的场景。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
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社区 版权所有