百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

OpenCV-Python从入门到实战,学完变大神!

nanshan 2024-10-08 05:31 25 浏览 0 评论


目录(关注博主,持续分享编程干货!)

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()

相关推荐

实战派 | Java项目中玩转Redis6.0客户端缓存

铺垫首先介绍一下今天要使用到的工具Lettuce,它是一个可伸缩线程安全的redis客户端。多个线程可以共享同一个RedisConnection,利用nio框架Netty来高效地管理多个连接。放眼望向...

轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)

1、缓存穿透所谓缓存穿透就是非法传输了一个在数据库中不存在的条件,导致查询redis和数据库中都没有,并且有大量的请求进来,就会导致对数据库产生压力,解决这一问题的方法如下:1、使用空缓存解决对查询到...

Redis与本地缓存联手:多级缓存架构的奥秘

多级缓存(如Redis+本地缓存)是一种在系统架构中广泛应用的提高系统性能和响应速度的技术手段,它综合利用了不同类型缓存的优势,以下为你详细介绍:基本概念本地缓存:指的是在应用程序所在的服务器内...

腾讯云国际站:腾讯云服务器如何配置Redis缓存?

本文由【云老大】TG@yunlaoda360撰写一、安装Redis使用包管理器安装(推荐)在CentOS系统中,可以通过yum包管理器安装Redis:sudoyumupdate-...

Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?

你是否在开发互联网大厂后端项目时,遇到过系统响应速度慢的问题?当高并发请求涌入,数据库压力剧增,响应时间拉长,用户体验直线下降。相信不少后端开发同行都被这个问题困扰过。其实,通过在SpringBo...

【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案

在我们使用redis时,也会存在一些问题,导致请求直接打到数据库上,导致数据库挂掉。下面我们来说说这些问题及解决方案。1、缓存穿透1.1场景一个请求进来后,先去redis进行查找,redis存在,则...

Spring boot 整合Redis缓存你了解多少

在前一篇里面讲到了Redis缓存击穿、缓存穿透、缓存雪崩这三者区别,接下来我们讲解Springboot整合Redis中的一些知识点:之前遇到过,有的了四五年,甚至更长时间的后端Java开发,并且...

揭秘!Redis 缓存与数据库一致性问题的终极解决方案

在现代软件开发中,Redis作为一款高性能的缓存数据库,被广泛应用于提升系统的响应速度和吞吐量。然而,缓存与数据库之间的数据一致性问题,一直是开发者们面临的一大挑战。本文将深入探讨Redis缓存...

高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局

一、什么是缓存穿透?缓存穿透是指查询一个根本不存在的数据,导致请求直接穿透缓存层到达数据库,可能压垮数据库的现象。在高并发场景下,这尤其危险。典型场景:恶意攻击:故意查询不存在的ID(如负数或超大数值...

Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决

缓存穿透菜小弟:我先问问什么是缓存穿透?我听说是缓存查不到,直接去查数据库了。表哥:没错。缓存穿透是指查询一个缓存中不存在且数据库中也不存在的数据,导致每次请求都直接访问数据库的行为。这种行为会让缓存...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

Redis客户端缓存的几种实现方式

前言:Redis作为当今最流行的内存数据库和缓存系统,被广泛应用于各类应用场景。然而,即使Redis本身性能卓越,在高并发场景下,应用于Redis服务器之间的网络通信仍可能成为性能瓶颈。所以客户端缓存...

Nginx合集-常用功能指导

1)启动、重启以及停止nginx进入sbin目录之后,输入以下命令#启动nginx./nginx#指定配置文件启动nginx./nginx-c/usr/local/nginx/conf/n...

腾讯云国际站:腾讯云怎么提升服务器速度?

本文由【云老大】TG@yunlaoda360撰写升级服务器规格选择更高性能的CPU、内存和带宽,以提供更好的处理能力和网络性能。优化网络配置调整网络接口卡(NIC)驱动,优化TCP/IP参数...

雷霆一击服务器管理员教程

本文转载莱卡云游戏服务器雷霆一击管理员教程(搜索莱卡云面版可搜到)首先你需要给服务器设置管理员密码,默认是空的管理员密码在启动页面进行设置设置完成后你需要重启服务器才可生效加入游戏后,点击键盘左上角E...

取消回复欢迎 发表评论: