OpenCV 01(图像加载与显示)

一、机器视觉

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

1.1 机器视觉的应用

人脸识别, 车辆检测,识别图像中的文字(OCR),图像拼接, 修复, 背景替换

二、OpenCV

Gray Bradsky于1999年开发, 2000年发布
C++, Python, Java, JS
跨平台(Windows, Linux, Mac...)

学习opencv可以:

  • 了解OpenCV的运行机制
  • 可以使用OpenCV处理一些图像常见问题
  • 学会物体识别, 文字识别等问题的处理思路

2.1 安装OpenCV 

使用服务器虚拟环境安装:

pip install opencv-python==4.7.0.72


安装opencv扩展包(选装):

pip install opencv-contrib-python==4.7.0.72

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

三、OpenCV读取与显示

3.1 创建窗口

namedWindow() 创建命名窗口# WINDOW_AUTOSIZE 窗口大小不允许修改
cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE) # WINDOW_NORMAL可以让窗口大小变得可以调节
# cv2.namedWindow('new', cv2.WINDOW_NORMAL)# 修改窗口大小
# cv2.resizeWindow('new', 1920, 1080)imshow('new', 显示内容) 显示窗口
# 销毁图像窗口 cv2.destroyAllWindows()# waitKey方法表示等待按键, 0表示任何按键, 其他整数表示等待按键的时间,单位是毫秒, 超过时间没有发生按键操作窗口会自动关闭.
waitKey() 等待用户输入# 会返回按键的ascii的值
# key = cv2.waitKey(0)
if key == ord('q'):
cv2.destroyAllWindows()

ord()获取ascii值


 

3.2 图片读写

使用imread可以读取图片, 默认读取的是彩色图片.
imread(path, flag)
imwrite(path, img): 使用imwrite保存图片

cv2.imread('01_Picture/01_cat.jpg')
cv2.imshow('cat',img)
cv2.waitKey(0)

 使用matplotlib显示`plt.imshow(img)`

import matplotlib.pyplot as pltimg= cv2.imread('D:\\3-project\\zyj\\pythonCNN\\pic\\cat.jpeg')
plt.imshow(img)
plt.show()

因为OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列的, 一般图片通道都是按照RGB来排列的.为了正常的显示猫的图片, 我们要用OpenCV的图像显示方法:

3.3 视频播放和录制

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

cv2.VideoCapture可以捕获摄像头, 用数字来表示不同的设备, 比如0, 1
vc = cv2.VideoCapture('./1.mp4')  # 打开视频文件
vc = cv2.VideoCapture(0)  # 打开摄像头

import cv2
import matplotlib.pyplot as plt
import numpy as npcv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)vc = cv2.VideoCapture(0) #打开摄像头while True:# vc.read() 返回两个值, 第一个为状态值, 读到帧为True, 第二个值为视频帧ret, frame = vc.read()if not ret:breakcv2.imshow('video',frame)  # 将视频帧放在窗口中显示key= cv2.waitKey(10)if key & 0xFF == ord('q'):break# 释放
vc.release()
cv2.destroyAllWindows()

录制视频

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...')breakvw.write(frame)cv2.imshow('frame', frame)if cv2.waitKey(1) == ord('q'):breakcap.release()#释放VideoWriter
vw.release()cv2.destroyAllWindows()

- VideoWriter : 参数一为输出文件, 参数二为多媒体文件格式(VideoWriter_fourcc, 参数三为帧率, 参数四为分辨率.
- write 编码并写入缓存
- release 缓存内容写入磁盘, 并释放资源

3.4 控制鼠标

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

setMouseCallback(winname, callback, userdata) winname是窗口的名字, callback是回调函数, userdata是给回调函数的参数.

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 npdef 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'):breakcv2.destroyAllWindows()

3.5 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('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'):breakcv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/72481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

道一云·七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口

道一云七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口 数据源平台:道一云七巧 道一云七巧拥有强大的自定义表单设计工具,并配置工作流程,通过流程智能流转,打通各个业务场景中的审批、协作环节,包含数据采集单、任务单…

用于独立系统应用的光伏MPPT铅酸电池充电控制器建模(Simulink实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【0906 C高级day1】 Linux中的文件相关指令

一、使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 grep "ubuntu" /etc/passwd | cut -d "/" -n -f 2-3 | cut -c 1-11 二、思维导图 文件相关指令:

WordPress(5)在主题中添加文章字数和预计阅读时间

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…

记一次生产环境服务卡死排查记录

接现场运维报告某java服务CPU狂飙,服务处于卡死无响应状态 询问现场运维什么场景造成的,答复是偶发现象,没有规律,和请求高峰期并没有关系。 因为服务是负载均衡的(A、B两台),临时处理让运维重…

go语言学习笔记

Go学习 一直想学一门新语言,难度又不想太大,C和Java都会但是不怎么精通,某天看到Go语言,好的,就是它了。总体来说,go语言的学习还是相对简单,有编程基础的入手很快。 简介 go是一种并发、带垃…

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分:表级锁、页级锁、行锁 为了提高数据库并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但管理锁是很耗资源(涉及获取、检查、释放锁等动作)。因…

全网超50万粉丝的Linux大咖良许,出书了!

全网超50万粉丝的Linux大咖良许 出书了! 今天我们要说的就是这本由Linux领域头部号主,良许老师编写的这本《速学Linux:系统应用从入门到精通》 如果你是刚开始学习Linux的小白同学,相信你已经体会到与学习一门编程语言相比&…

fastjson 1.2.24 反序列化导致任意命令执行漏洞复现

拉取docker容器 访问并抓包 修改为POST 方式,文件类型改为json格式,发送json数据包,发送成功 这里安装一个bp的插件 使用安装的插件 可以看到,插件告诉我们这里有漏洞,并且提供了POC 既然我们发现有 rmi ,…

【数字通信原理】笔记(持续更新ing)

通信原理学习笔记,课程见b站: 由于教材不同,我们的课程使用的是《数字通信原理》主编:李白萍 版本,因此此笔记以我们的教材为主整理up主的笔记。 详情见:通信原理 文章目录 第一章 绪论1. 通信的基本概念2. 信息的量度3. 通信系统的性能指标 …

【多思路附源码】2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策

赛题介绍 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬…

如何修改VS2017、VS2019、VS2022中C++默认版本

首先明确VS各个版本对C标准的支持情况: IC版本 VS版本 支持情况 C11 2015完全支持 ,13基本支持,12部分支持,10以及以下不支持 完全支持 C14 2017完全支持 ,15基本支持,13部分支持 完全支…

国内访问香港服务器选择什么路线?

​  国内访问香港服务器可以选择多种路线。首先,我们了解下各个线路的速度延迟。 一、CN2直连:解决了不同互联网服务提供商之间访问的难题,不需要绕到国际网络再从中国的三个网络入口进入。 二、优化直连:全国平均延迟60ms&…

UNIAPP之js/nvue混淆探索

因项目需要对UNIAPP的js混淆做了一些调研 混淆教程: https://uniapp.dcloud.net.cn/tutorial/app-sec-confusion.html 按照教程配置进行打包正式包进行混淆 下载正式包将 .ipa改为.zip 解压获取到HBuilder.app 右键显示包内容 获取到混淆的key 不同时间进行打包混淆同一文…

解决Microsoft Edge无法正常运行的有效方案分享!

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

【启扬方案】启扬多尺寸安卓屏一体机,助力仓储物料管理系统智能化管理

随着企业供应链管理的不断发展,对仓储物料管理的要求日益提高。企业需要实时追踪和管理物料的流动,提高物流效率、降低库存成本和减少库存的风险。因此,仓储物料管理系统的实现成为必要的手段。 仓储物料管理系统一体机作为一种新型的物料管理…

Linux:工具(vim,gcc/g++,make/Makefile,yum,git,gdb)

目录 ---工具功能 1. vim 1.1 vim的模式 1.2 vim常见指令 2. gcc/g 2.1 预备知识 2.2 gcc的使用 3.make,Makefile make.Makefile的使用 4.yum --yum三板斧 5.git --git三板斧 --Linux下提交代码到远程仓库 6.gdb 6.1 gdb的常用指令 学习目标: 1.知道…

Android jni引用第三方so动态库和.a静态库并且调用(c)方法

最近花了一周时间来入门学习 Android JNI方面的知识,因为后续的工作很多需要用到c c++库,我需要用jni来包装一下c函数,来提供给上次java调用。总之多学点知识对自己有好处。 案例效果: 上文我们讲解了 android studio cmake生成.a文件(静态库)及调用(c c++)静态库.a 本文…

java网络编程,套接字socket

目录 一 网络概述 二 网络的类型分类 三 网络体系结构 四 网络通信协议概述 五 网络通信协议种类 六 Socket简介 七 Socket路径 八 java网络编程三要素 九 基于UDP协议的Socket编程 十 基于TCP协议的Socket编程 十一 基于TCP协议和UDP的区别 一 网络概述 多台相互连…

Python网络编程详解

概要 Python作为一种强大的编程语言,拥有丰富的网络编程库和框架,能够方便地进行各种网络编程任务。本文将介绍Python网络编程的基础知识,包括socket编程和HTTP协议,然后深入探讨一些流行的Python Web框架,包括Flask和…