🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。
前言: 🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~ ?个人主页:点我直达,在这里肯定能找到你想要的~ 👍专栏介绍:OpenCV从入门到放弃 ,一个学习OpenCV的专栏~
安装 OpenCV
博主学习的是通过虚拟环境来学习 OpenCV ,使用 3.4.1.15 这个版本。因为在 3.4.2 版本之后有些算法申请了专利,就用不了。 但 3.4.1.15 这个版本目前最高只支持到 Python3.6 ,博主就另外又安装了 Python3.6.8 作为学习 OpenCV 使用。
在 opencv-python 模块的下载页面查找,可以明显发现其 3.4.1.15 版本只支持 Python2.7 、 Python3.4 、 Python3.5 、 Python3.6 这些版本,我们能挑到的最高版本是 Python3.6.8 。
在官网 Python官网下载 中找到 Python3.6.8 版本。
先创建并进入虚拟环境:先要使用 Python3.6.8 安装 pip install virtualenv ,才能创建虚拟环境,然后进入环境的 Scripts 目录,输入 activate 激活当前环境,出现 (OpenCV) 就代表成功进入当前环境了。 然后安装需要的一些模块:pip install opencv-python==3.4.1.15 opencv--contrib-python==3.4.1.15 jupyter matplotlib -i https://pypi.douban.com/simple 。 其中 opencv-python 是 OpenCV 的核心库,另外的 opencv–contrib-python 是拓展库,前期可以先不安装拓展库,然后 jupyter 是网页编辑器,方便可视化, matplotlib 就是可视化库了,图像处理好后可以使用它可视化到 jupyter 的网页上。 安装成功显示:
安装成功后,pip list 显示的模块。
启动 Jupyter
确保我们现在仍然在 Scripts 文件夹内,然后输入 jupyter notebook --notebook-dir='G:/opencvStudy/note' 以指定目录打开 jupyter 网页编辑器,出现类似图下的网页就属于启动成功了(文件列表可能不一样):
Jupyter 有一些常用的快捷方式:
- 直接 Enter 只会回车。
- Ctrl + Enter 将会执行当前单元格。
- Shift / Alt + Enter 将会执行当前单元格,并在下方新建一个单元格。
- 在函数处按 Shift + Tab 可以显示简易帮助说明,按两下 Tab 可以显示详细帮助。
创建和销毁窗口
每次使用前,需要导入:
import cv2 :可以直接使用,但其 3.4.1.15 版本在 PyCharm 中将不会提示语法:- 但如果使用
from cv2 import cv2 :这种导入方法,在 PyCharm 中是可以显示代码提示的(纯手敲大佬请无视此区别):
具体情况还是得看你使用的是哪款编辑器,以及你是否是大佬~
from cv2 import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
可以看到有三组共六钟参数,被分同一组的是由0和其他数字组成的 flags 。 其中 WINDOW_AUTOSIZE 和 WINDOW_NORMAL 表示是自动调整大小(手动不可调)或是手动调整窗口; WINDOW_FREERATIO 和 WINDOW_KEEPRATIO 表示在调整的时候不考虑图像比例(铺满窗口)或是保持图像比例,ratio 就是比例的意思; WINDOW_GUI_NORMAL 和 WINDOW_GUI_EXPANDED 表示绘制窗口是就方法(没有状态栏和工具栏)或是增强型GUI。(目前我还没看出来新方法哪里增强了)
from cv2 import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 800, 600)
更改窗口大小是先宽后高。
from cv2 import cv2
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 800, 600)
key = cv2.waitKey(0)
if key == ord('q'):
print('销毁窗口')
cv2.destroyAllWindows()
waitKey 接受一个毫秒参数,如果参数为非正整数,就一直等下去,如果指定了正整数(只能接受整数,浮点数会报错),则会等待这么长时间,如果没有等待到按键,则退出等待并返回 -1 。 如果等待到了按键,则会返回按键的 ascii 码值(一个整数值),ord('') 就是返回字符的 ascii 码值: 也只会接受 ascii 码表里的按键,像 Ctrl 、 Shift 、 Alt 这些就不会接收了,而且这些都是功能键,单独接收没有意义。
图片在 OpenCV 中的表现
首先读取的图片类型支持下图中的这些:
from cv2 import cv2
cat = cv2.imread('./cat.jpeg')
print(cat)
读取出来是一个三维数组:
这里正好说明一下 numpy 的数组形状和 cv2 的有什么不同: cv2 的参数都是先给宽,再给高; numpy 的参数都是先给高,再给宽,因为三维数组的格式化打印, 是最外层数组是由多行组成,相当于是图片的高; 中间层数组每个是由多列组成,相当于是图片的宽。 然后颜色 R 、G 、B 都是由 0 - 255 的数组成的,换算成无符号位的二进制是 00000000 - 11111111,所以 opencv 读取出来的彩色图片会被处理成类型是uint8(8位二进制整数)的三维数组。
再来看看 matplotlib 对它的显示效果:
再看看原图:
是不是发现这个猫有明显的颜色变化? 这是因为 opencv 读进来的图片数据的通道不是默认的RGB,而是BGR,完全相反的颜色数组,要想正常显示,可以对数组的最内层施加反向操作:
from cv2 import cv2
import matplotlib.pyplot as plt
cat = cv2.imread('./cat.jpeg')
for row in range(len(cat)):
for col in range(len(cat[row])):
cat[row][col] = cat[row][col][::-1]
plt.imshow(cat)
plt.show()
经过这样处理后的颜色就正常了,可爱的猫咪又出现了~:
|