上机环境说明 编程语言:python,可安装 Anaconda 进行包及环境管理 编程软件:建议 pycharm 需要的 python 库:opencv,numpy,Matplotlib 等
OpenCV 简介
1、OpenCV 介绍
OpenCV 是一个跨平台开源计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它由一系列 C 函数和 C++ 类构成,同时也提供了 Python 接口,包含了数字图像处理和计算机视觉方面很多通用算法。
2、Python 安装
OpenCV 对于 Linux 和 Windows 操作系统,首先需要安装 NumPy,然后再安 装 OpenCV,可以选择两种不同版本:
仅安装主模块包: pip install opencv-python
安装完整包(包括主模块和附加模块) pip install opencv-contrib-python
为加快安装速度可选取国内源安装,比如采用下面的命令安装:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple/
3、OpenCV 主要模块
OpenCV 可以被划分为不同模块,其主要模块如下:
OpenCV 在视觉算法中的功能非常强大,其中一个原因就是该算法库一直在 与时俱进的更新最新的算法,对于具有专利的算法(如 SURF)以及一些还没有 稳定的算法,OpenCV 会将其置于扩展模块中,这些扩展模块包含在 opencv_contrib 代码库中。对于稳定的算法,会被移到 OpenCV 主仓库代码中, 因此需要谨慎的使用 opencv_contrib,因为不同版本的函数可能存在差异。
4、OpenCV 应用场景
OpenCV 可以应用但不仅限于以下场景:二维和三维特征提取、街景图像拼接、 人脸识别系统、手势识别、人机交互、动作识别、物体识别、自动检查和监视、 分割与识别、医学图像分析、运动跟踪、增强现实、视频/图像搜索与检索、机 器人与无人驾驶汽车导航与控制、驾驶员疲劳驾驶检测等。
5、图像文件类型
下表列示了 OpenCV 支持的文件格式及其关联的文件扩展名:
上机练习 1 图像读写及显示操作
-
上机目的
熟悉 OpenCV 图像读写及显示操作。
-
相关知识
对于 python 而言,在引用 opencv 库的时候可写为 import cv2 as cv。其 中,cv2 是 opencv 的 C++命名空间名称,使用它来表示调用的是 C++开发的 opencv 的接口。
-
上机内容
按照上面相关知识的介绍,学会利用 opencv 进行灰度图像及彩色图像的读、显示及写 操作,并编写相应的测试程序。
1、配置opencv环境:PC原先就安装了pycharm和配置了numpy环境;本人仅需安装opencv的库即可,cmd运行代码如下:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
运行结果为:
2、测试opencv
运行结果为:
3、图像的读写及显示操作:
(1)、读取图像
代码为:
import cv2 as cv
img1=cv.imread('D:/cbDB/opencv/project1/2.png',1)
img2=cv.imread('D:/cbDB/opencv/project1/2.png',0)
img3=cv.imread('D:/cbDB/opencv/project1/2.png',-1)
rows,cols,chn = img1.shape
size = img1.size
print('image shape:', rows, cols, chn)
print('image size:', size)
print('image type:', img1.dtype)
运行结果为:
(2)、显示图像
代码为:
import cv2 as cv
img1=cv.imread('D:/cbDB/opencv/project1/2.png',1)
img2=cv.imread('D:/cbDB/opencv/project1/2.png',0)
img3=cv.imread('D:/cbDB/opencv/project1/2.png',-1)
rows,cols,chn = img1.shape
size = img1.size
print('image shape:', rows, cols, chn)
print('image size:', size)
print('image type:', img1.dtype)
cv.imshow("Image1",img1)
cv.imshow("Image2",img2)
cv.imshow("Image
运行结果为:
(3)、保存图像
代码为:
import cv2 as cv
img1=cv.imread('D:/cbDB/opencv/project1/2.png',1)
img2=cv.imread('D:/cbDB/opencv/project1/2.png',0)
img3=cv.imread('D:/cbDB/opencv/project1/2.png',-1)
rows,cols,chn = img1.shape
size = img1.size
print('image shape:', rows, cols, chn)
print('image size:', size)
print('image type:', img1.dtype)
cv.imshow("Image1",img1)
cv.imshow("Image2",img2)
cv.imshow("Image3",img3)
k = cv.waitKey(0)
if k ==27:
cv.destroyAllWindows()
elif k ==ord('s'):
cv.imwrite("./cat.png", img1, [int(cv.IMWRITE_PNG_COMPRESSION), 0])
cv.imwrite("./cat2.png", img1, [int(cv.IMWRITE_PNG_COMPRESSION), 9])
cv.destroyAllWindows()
运行结果为(按了“s”之后的结果):
检查得到:
(4)、图像像素存储形式
代码为:
import cv2 as cv
img1=cv.imread('D:/cbDB/opencv/project1/2.png',1)
img2=cv.imread('D:/cbDB/opencv/project1/2.png',0)
img3=cv.imread('D:/cbDB/opencv/project1/2.png',-1)
rows,cols,chn = img1.shape
size = img1.size
print('image shape:', rows, cols, chn)
print('image size:', size)
print('image type:', img1.dtype)
cv.imshow("Image1",img1)
cv.imshow("Image2",img2)
cv.imshow("Image3",img3)
k = cv.waitKey(0)
if k ==27:
cv.destroyAllWindows()
#elif k ==ord('s'):
#cv.imwrite("./cat.png", img1, [int(cv.IMWRITE_PNG_COMPRESSION), 0])
#cv.imwrite("./cat2.png", img1, [int(cv.IMWRITE_PNG_COMPRESSION), 9])
#cv.destroyAllWindows()
#像素值获取和设置
pixel = img2[100,100] #[57 63 68],获取(100,100)处的像素值
print(pixel)
#ROI,Range of instrest
roi = img3[100:200,300:400] #截取 100 行到 200 行,列为 300 到 400 列的整块区域
print(roi)
运行结果为:
(5)、 使用 Matplotlib 显示图像
代码为:
import cv2 as cv
from matplotlib import pyplot as plt
img1=cv.imread('D:/cbDB/opencv/project1/2.png',1)
img2=cv.imread('D:/cbDB/opencv/project1/2.png',0)
img3=cv.imread('D:/cbDB/opencv/project1/2.png',-1)
k = cv.waitKey(0)
if k ==27:
cv.destroyAllWindows()
plt.imshow(img1, cmap = 'gray', interpolation ='bicubic')
plt.xticks([]),plt.yticks([]) # 隐藏x 轴和y轴上的刻度值
plt.show()
运行结果为:
-
思考题
(1)总结本次上机相关 opencv 函数的用法,在掌握图像相关操作的基础上,通过查阅 资料尝试编写利用 opencv 函数编写视频读取的程序。
(2)尝试解决彩色图像 cv.show 和 plt.show 显示不一致的问题。