OpenCV-Python从入门到实战,学完变大神!
bigegpt 2024-10-12 06:57 7 浏览
目录(关注博主,持续分享编程干货!)
I 走进 OpenCV 10
1 关于 OpenCV-Python 教程 10
2 在 Windows 上安装 OpenCV-Python 11
3 在 Fedora 上安装 OpenCV-Python 12
II OpenCV 中的 Gui 特性 13
4 图片 13
4.1 读入图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2 显示图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.3 保存图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.4 总结一下 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5 视频 18
5.1 用摄像头捕获视频 . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.2 从文件中播放视频 . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.3 保存视频 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6 OpenCV 中的绘图函数 24
6.1 画线 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2 画矩形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.3 画圆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.4 画椭圆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.5 画多边形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.6 在图片上添加文字 . . . . . . . . . . . . . . . . . . . . . . . . . 26
7 把鼠标当画笔 28
7.1 简单演示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.2 高级一点的示例 . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8 用滑动条做调色板 32
8.1 代码示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
III 核心操作 36
——————————————————————————
48.2.2仅有一个特征的数据 . . . . . . . . . . . . . . . . . . . . 282
48.2.3颜色量化 . . . . . . . . . . . . . . . . . . . . . . . . . . 286
IX 计算摄影学 288
49图像去噪 288
49.1OpenCV 中的图像去噪 . . . . . . . . . . . . . . . . . . . . . . 289
49.1.1cv2.fastNlMeansDenoisingColored() . . . . . . . . 290
49.1.2cv2.fastNlMeansDenoisingMulti() . . . . . . . . . . 290
50图像修补 294
50.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
50.2代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
X 对象检测 297
51使用 Haar 分类器进行面部检测 297
51.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
51.2OpenCV 中的 Haar 级联检测 . . . . . . . . . . . . . . . . . . 299
部分 I
走进 OpenCV
1 关于 OpenCV-Python 教程
2 在 Windows 上安装 OpenCV-Python
3 在 Fedora 上安装 OpenCV-Python
部分 II
OpenCV 中的 Gui 特性
目标
? 在这里你将学会怎样读入一幅图像,怎样显示一幅图像,以及如何保存一幅图像
? 你将要学习如下函数:cv2.imread(),cv2.imshow(),cv2.imwrite()
? 如果你愿意的话,我会叫你如何使用 Matplotlib 显示一幅图片
4.1 读入图像
使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,或者给函数提供完整路径,第二个参数是要告诉函数应该如何读取这幅图片。
? cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
? cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道
1 # -*- coding: utf-8 -*-
2 """
3 Created on Tue Dec 31 19:16:05 2013
4
5 @author: duan
6 """
7
8 import numpy as np
9 import cv2
10
11 # Load an color image in grayscale
12 img = cv2.imread('messi5.jpg',0)
警告:就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命令print img时得到的结果是None。
4.2 显示图像
使用函数 cv2.imshow() 显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字
1 cv2.imshow('image',img)
2 cv2.waitKey(0)
3 cv2.destroyAllWindows()
窗口屏幕截图将会像以下的样子 (in Fedora-Gnome machine):
cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否被按下,这个后面我们会接着讨论。
cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删除的窗口名。
建 议:一 种 特 殊 的 情 况 是, 你 也 可 以 先 创 建 一 个 窗 口, 之 后再 加 载 图 像。 这 种 情 况 下, 你 可 以 决 定 窗 口 是 否 可 以 调 整大 小。 使 用 到 的 函 数 是 cv2.namedWindow()。 初 始 设 定 函 数标 签 是 cv2.WINDOW_AUTOSIZE。 但 是 如 果 你 把 标 签 改 成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用
代码如下:
1 # -*- coding: utf-8 -*-
2 """
3 Created on Wed Jan 1 20:49:33 2014
4
5 @author: duan
6 """
7 import numpy as np
8 import cv2
9
10 cv2.namedWindow('image', cv2.WINDOW_NORMAL)
11 cv2.imshow('image',img)
12 cv2.waitKey(0)
13 cv2.destroyAllWindows()
4.3 保存图像
使用函数 cv2.imwrite() 来保存一个图像。首先需要一个文件名,之后才是你要保存的图像。
1 cv2.imwrite('messigray.png',img)
4.4 总结一下
下面的程序将会加载一个灰度图,显示图片,按下’s’键保存后退出,或者按下 ESC 键退出不保存。
1 # -*- coding: utf-8 -*-
2 """
3 Created on Wed Jan 1 20:49:33 2014
4
5 @author: duan
6 """
7 import numpy as np
8 import cv2
9
10 img = cv2.imread('messi5.jpg',0)
11 cv2.imshow('image',img)
12 k = cv2.waitKey(0)
13 if k == 27: # wait for ESC key to exit
14 cv2.destroyAllWindows()
15 elif k == ord('s'): # wait for 's' key to save and exit
16 cv2.imwrite('messigray.png',img)
17 cv2.destroyAllWindows()
警告:如果你用的是 64 位系统,你需要将 k = cv2.waitKey(0) 这行改成k = cv2.waitKey(0)&0xFF。
使用 Matplotlib
Matplotib 是 python 的一个绘图库,里头有各种各样的绘图方法。之后会陆续了解到。现在,你可以学习怎样用 Matplotib 显示图像。你可以放大图像,保存它等等。
1 # -*- coding: utf-8 -*-
2 """
3 Created on Wed Jan 1 20:49:33 2014
4
5 @author: duan
6 """
7 import numpy as np
8 import cv2
9 from matplotlib import pyplot as plt
10
11 img = cv2.imread('messi5.jpg',0)
12 plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
13 plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
14 plt.show()
窗口截屏如下:
参见:Matplotib 有多种绘图选择。具体可以参见 Matplotib docs。我们也会陆续了解一些
注意:彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotib 是 RGB模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotib 正确显示。具体细节请看练习
练习:
1. 当你用 OpenCV 加载一个彩色图像,并用 Matplotib 显示它时会遇到一些困难。请阅读this discussion并且尝试理解它。
5 视频
目标
? 学会读取视频文件,显示视频,保存视频文件
? 学会从摄像头获取并显示视频
? 你将会学习到这些函数:cv2.VideoCapture(),cv2.VideoWrite()
5.1 用摄像头捕获视频
我们经常需要使用摄像头捕获实时图像。OpenCV 为这中应用提供了一个非常简单的接口。让我们使用摄像头来捕获一段视频,并把它转换成灰度视频显示出来。从这个简单的任务开始吧。为了获取视频,你应该创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是在指定要使用的摄像头。一般的笔记本电脑都有内置摄像头。所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。之后,你就可以一帧一帧的捕获视频了。但是最后,别忘了停止捕获视频。
1 # -*- coding: utf-8 -*-
2 """
3 Created on Fri Jan 3 21:06:22 2014
4
5 @author: duan
6 """
7
8 import numpy as np
9 import cv2
10
11 cap = cv2.VideoCapture(0)
12
13 while(True):
14 # Capture frame-by-frame
15 ret, frame = cap.read()
16
17 # Our operations on the frame come here
18 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
19
20 # Display the resulting frame
21 cv2.imshow('frame',gray)
22 if cv2.waitKey(1) & 0xFF == ord('q'):
23 break
24
25 # When everything done, release the capture
26 cap.release()
27 cv2.destroyAllWindows()
cap.read() 返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。
有时 cap 可能不能成功的初始化摄像头设备。这种情况下上面的代码会报错。你可以使用 ap.isOpened(),来检查是否成功初始化了。如果返回值是True,那就没有问题。否则就要使用函数 cap.open()。
你可以使用函数 cap.get(propId) 来获得视频的一些参数信息。这里propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性,见下表
其中的一些值可以使用 cap.set(propId,value) 来修改,value 就是你想要设置成的新值。
例如,我可以使用 cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)和 ret=cap.set(4,240) 来把宽和高改成 320X240。
注意:当你的程序报错时,你首先应该检查的是你的摄像头是否能够在其他程序中正常工作(比如 linux 下的 Cheese)。
5.2 从文件中播放视频
与从摄像头中捕获一样,你只需要把设备索引号改成视频文件的名字。在播放每一帧时,使用 cv2.waiKey() 设置适当的持续时间。如果设置的太低视频就会播放的非常快,如果设置的太高就会播放的很慢(你可以使用这种方法控制视频的播放速度)。通常情况下 25 毫秒就可以了。
? CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
? CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
? CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 - start of the film, 1 - end of the film.
? CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
? CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
? CV_CAP_PROP_FPS Frame rate.
? CV_CAP_PROP_FOURCC 4-character code of codec.
? CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
? CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
? CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
? CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
? CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
? CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
? CV_CAP_PROP_HUE Hue of the image (only for cameras).
? CV_CAP_PROP_GAIN Gain of the image (only for cameras).
? CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
? CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
? CV_CAP_PROP_WHITE_BALANCE Currently unsupported
? CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
注意:你应该确保你已经装了合适版本的 ffmpeg 或者 gstreamer。如果你装错了那就比较头疼了。
5.3 保存视频
在我们捕获视频,并对每一帧都进行加工之后我们想要保存这个视频。对于图片来时很简单只需要使用 cv2.imwrite()。但对于视频来说就要多做点工作。
这次我们要创建一个 VideoWriter 的对象。我们应该确定一个输出文件的名字。接下来指定 FourCC 编码(下面会介绍)。播放频率和帧的大小也都需要确定。最后一个是 isColor 标签。如果是 True,每一帧就是彩色图,否则就是灰度图。
FourCC 就是一个 4 字节码,用来确定视频的编码格式。可用的编码列表可以从fourcc.org查到。这是平台依赖的。下面这些编码器对我来说是有用个。
? In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is
more preferable. MJPG results in high size video. X264 gives
very small size video)
? In Windows: DIVX (More to be tested and added)
? In OSX : (I don’t have access to OSX. Can some one fill this?)
FourCC 码以下面的格式传给程序,以 MJPG 为例:
cv2.cv.FOURCC('M','J','P','G') 或者 cv2.cv.FOURCC(*'MJPG')。
下面的代码是从摄像头中捕获视频,沿水平方向旋转每一帧并保存它。
1 # -*- coding: utf-8 -*-
2 """
3 Created on Fri Jan 3 21:06:22 2014
4
5 @author: duan
6 """
7
8 import numpy as np
9 import cv2
10
11 cap = cv2.VideoCapture(0)
12
13 # Define the codec and create VideoWriter object
14 fourcc = cv2.cv.FOURCC(*'XVID')
15 out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
16
17 while(cap.isOpened()):
18 ret, frame = cap.read()
19 if ret==True:
20 frame = cv2.flip(frame,0)
21
22 # write the flipped frame
23 out.write(frame)
24
25 cv2.imshow('frame',frame)
26 if cv2.waitKey(1) & 0xFF == ord('q'):
27 break
28 else:
29 break
30
31 # Release everything if job is finished
32 cap.release()
33 out.release()
34 cv2.destroyAllWindows()
相关推荐
- 得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践
-
一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...
- warm-flow新春版:网关直连和流程图重构
-
本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...
- 扣子空间体验报告
-
在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...
- spider-flow:开源的可视化方式定义爬虫方案
-
spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...
- solon-flow 你好世界!
-
solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...
- 新一代开源爬虫平台:SpiderFlow
-
SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...
- 通过 SQL 训练机器学习模型的引擎
-
关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...
- 鼠须管输入法rime for Mac
-
鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...
- Go语言 1.20 版本正式发布:新版详细介绍
-
Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...
- iOS 10平台SpriteKit新特性之Tile Maps(上)
-
简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...
- 程序员简历例句—范例Java、Python、C++模板
-
个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...
- Telerik UI for iOS Q3 2015正式发布
-
近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...
- ios使用ijkplayer+nginx进行视频直播
-
上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...
- IOS技术分享|iOS快速生成开发文档(一)
-
前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...
- macOS下配置VS Code C++开发环境
-
本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- dockernetworkconnect (63)
- esxi7 (63)
- vue阻止冒泡 (67)
- c#for循环 (63)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- java大写转小写 (63)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)