目录
一、Opencv简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列C++函数和少量C函数构成,同时也提供了Python、Java、MATLAB等语言的接口。OpenCV的设计目标是提供一个简单易用的计算机视觉框架,以便开发者能够快速实现各种视觉处理任务。
主要特点:
跨平台支持:OpenCV可以在Windows、Linux、macOS、Android和iOS等多个操作系统上运行。
丰富的图像处理功能:包括图像的读取、显示、保存、滤波、边缘检测、形态学操作、特征检测与描述、图像分割等。
视频处理:支持视频的读取、显示、保存,以及视频流的实时处理。
机器学习:内置了多种机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等,可以用于分类、回归等任务。
深度学习支持:OpenCV 3.3版本之后,集成了深度学习模块,支持TensorFlow、Caffe、Torch等主流深度学习框架的模型导入和推理。
高性能:OpenCV的许多算法都经过了优化,能够高效地处理大规模图像和视频数据。
开源社区支持:OpenCV拥有庞大的用户和开发者社区,提供了丰富的文档、教程和示例代码,方便用户学习和使用。
应用领域:
OpenCV广泛应用于各种计算机视觉和图像处理任务,包括但不限于:
图像处理:如图像增强、滤波、边缘检测等。
视频分析:如目标跟踪、运动检测、行为识别等。
机器视觉:如工业检测、机器人视觉、自动驾驶等。
医学图像处理:如CT、MRI图像的分析与处理。
增强现实:如虚拟物体叠加、实时特效等。
二、基础操作
1、模块导入
import cv2
2、图片的读取和显示
(1)、读取
- 读取原图
image = cv2.imread('图片名或路径')
- 读取灰度图
在路径后面加上0,代表以灰度图的形式读取图片
image = cv2.imread('图片名或路径',0)
(2)、显示
import cv2
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey() 函数 :用于等待用户的按键事件,它的参数表示等待按键的时间(单位是毫秒)。当参数设置为
0
时,意味着程序会一直处于等待状态,直到用户按下任意一个按键为止;cv2.destroyAllWindows ( )函数 :作用是关闭所有由 OpenCV 创建的图像显示窗口。
3、 图片的保存
import cv2
# 保存图像
cv2.imwrite('output_image.jpg', image)
4、获取图像的基本属性
获取图像的BGR、像素点个数、数据类型。
# 获取图像的宽度和高度
height, width, channels = image.shape
# 获取图像的尺寸
size = image.size
# 获取图像的数据类型
dtype = image.dtype
5、图像转灰度图
假设一张已经读取的非灰度图想转为灰度图,可用此方法
import cv2
gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
6、图像的截取
注:前面的参数截取的是高,后面的是宽。opencv中的图像坐标原点在图像的左上角。
img_cut = image[0:50,0:50]
# 前面的参数截取的是高,后面的是宽。
7、图像的缩放
import cv2
# 缩放图像
resized_image = cv2.resize(image, (new_width, new_height))
8、图像的旋转
import cv2
# 获取图像的中心点
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
# 旋转图像
M = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, M, (w, h))
center:图像的中心点;
angle:旋转的角度,正数为逆时针旋转,负数为顺时针旋转;
scale:图像旋转后的缩放比例;
M:为一个2*3的变换矩阵,会被后续的
cv2.warpAffine
函数用来对图像实际执行旋转(以及缩放,如果有设置缩放比例的话)操作;(w,h):经过旋转等变换后输出的图像 大小;
9、膨胀和腐蚀操作
(1)、膨胀操作
import cv2
import numpy as np
kernel = np.ones(3,3)
# 膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)
(2)、腐蚀操作
import cv2
import numpy as np
kernel = np.ones(3,3)
# 腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)
iterations参数:用于指定腐蚀操作执行的次数
10、图像的轮廓检测
注意:轮廓检测最好使用灰度图或者二值化的图,这样检测会更精准。
(1)、Sobel 算子轮廓检测法
import cv2
# 水平方向检测
sobelx = cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3)
# 对结果取绝对值,以免负数被截取为0
sobelx = cv2.convertScaleAbs(sobelx)
# 垂直方向检测
sobely = cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3)
# 对结果取绝对值,以免负数被截取为0
sobely = cv2.convertScaleAbs(sobely)
# 垂直水平方向根据权重进行相加
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow('',sobelxy)
此种方法最好水平检测与垂直检测分开,然后再求和。如果同时检测效果会不好。
(2)、findContours 边缘检测算法
使用cv2.findContours()算法时图片必须是灰度图或者经过二值化处理过的图
import cv2
# 查找轮廓
contours, hierarchy = cv2.findContours(image_gray, type1, type2)
# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
contours:包含了所有检测到的轮廓信息的列表;
hierarchy:它表示轮廓之间的层次关系信息;
image:表示待检测的图片;
type1(轮廓检测形式)有如下选项:
cv2.RETR_TREE:
表示会检索所有的轮廓,并重构嵌套轮廓的完整层次结构;
cv2.RETR_EXTERNAL:
只检索最外层的轮廓,忽略所有内部的子轮廓;
cv2.RETR_LIST:
检索所有轮廓,但不建立轮廓间的层次关系;type2(轮廓逼近的方法)有如下选项:
cv2.CHAIN_APPROX_SIMPLE:
会压缩水平、垂直和对角方向的线段,仅保留轮廓的端点信息,将轮廓用尽可能少的点来表示,以达到简化轮廓数据的目的;
cv2.CHAIN_APPROX_NONE:
存储轮廓的所有边界点,也就是完整地记录轮廓经过的每一个像素点,不进行任何简化,这样得到的轮廓数据会比较详细、准确,但数据量通常很大。
(3)、Canny轮廓检测
import cv2
result_img = cv2.Canny(gray_img,50,150,apertureSize=3,L2gradient=True)
cv2.imshow('result_img',result_img)
50,150:低阈值和高阈值;
apertureSize:Sobel算子核的大小,一般为奇数3,5,7等;
L2gradient:为True时使用采用更为精确的 L2 范数,为False时采用近似的 L1 范数。