据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。
前言:
作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
专栏介绍: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 的网页上。
安装成功显示:
确保我们现在仍然在 Scripts 文件夹内,然后输入 jupyter notebook --notebook-dir='G:/opencvStudy/note'
以指定目录打开 jupyter 网页编辑器,出现类似图下的网页就属于启动成功了(文件列表可能不一样):
Jupyter 有一些常用的快捷方式:
每次使用前,需要导入:
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 这些就不会接收了,而且这些都是功能键,单独接收没有意义。
首先读取的图片类型支持下图中的这些:
from cv2 import cv2
# 默认是按照彩色图片来读取的。
cat = cv2.imread('./cat.jpeg')
# numpy的ndarray。
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')
# numpy的ndarray。
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()