目录
1.图像的输入、显示和保存、窗口的创建与关闭
1.1 图像的输入
1.2 图像的显示
1.3 图像的保存
1.4 创建与关闭窗口
2.绘制几何图形
2.1 绘制直线
2.2 绘制圆形
2.3 绘制矩形
2.4 向图像中添加文字
3.图像反转与复制
3.1 翻转图像
3.2 复制图像
4.获取图像的属性
5.获取并修改图像中的像素点
6.图像颜色通道的拆分与合并
6.1 将图片img拆分为三个颜色通道:
6.2 将三个颜色通道合并为一张图片:
7.色彩空间转换
7.1 BGR↔Gray
7.2 BGR↔HSV
8.图像的加法与混合
8.1 图像的相加
8.2 图像的混合
9. 图像的运算
9.1 加、减、乘、除
9.2 均值、均值和方差
9.3 与、或、非、异或 运算
10.图像的缩放,平移与旋转
10.1 缩放 cv2.resize()
10.2 平移 cv2.warpAffine()
10.3 旋转 cv2.getRotationMatrix2D()
11.形态学处理函数
11.1 腐蚀与膨胀
11.2 开操作与闭操作
11.3 顶帽变换、底帽变换与形态学梯度(边界提取)
12.常见滤波器
12.1 方框滤波
12.2 均值滤波
12.3 高斯滤波
12.4 中值滤波
12.5 双边滤波
13.轮廓检测
13.1 找出图片的轮廓值
13.2 画出图片中的轮廓值,也可以用来画轮廓的近似值
轮廓检测与画图步骤:
13.3 计算轮廓的面积
13.4计算轮廓的周长
计算轮廓的周长和面积步骤:
13.5 外接矩形
13.6 外接圆
画出外接矩形和外接圆步骤:
14.图像金字塔(上采样和下采样)
15.边界填充
16.视频捕获类(VideoCapture类)
16.1 读取视频文件--VideoCapture()
16.2 视频参数获取--VideoCapture.get() 与设置--VideoCapture.set()
16.3 判断摄像头是否开启 -- VideoCapture.isOpened()
16.4 关闭文件/摄像头(释放)--VideoCapture.release()
16.5 读取该文件/摄像头的下一帧 -- VideoCapture.read()
17.视频读写类(VideoWriter类)
17.1 cv2.VideoWriter()
17.2 write函数--cv2.VideoWriter.write()
18.视频读写实战:
19.图像直方图
19.1 直方图 -- hist = cv2.calcHist( )
19.2 直方图均衡化
20.模板匹配
21.霍夫变换
21.1 霍夫线检测
21.2 霍夫圆检测
1.图像的输入、显示和保存、窗口的创建与关闭
关键函数:
- 读取:imread()
- 显示:imshow()
- 保存:imwrite()
- 窗口:namedWindow()
1.1 图像的输入
cv.imread()
参数:
-
要读取的图像
-
读取方式的标志
cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。
cv.IMREAD*GRAYSCALE:以灰度模式加载图像
cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式。
(可以使用1、0或者-1来替代上面三个标志)
import cv2 as cv #以灰度图的形式读取图像
img = cv.imread('genggui.jpg',0)
1.2 图像的显示
cv.imshow()
参数:
- 显示图像的窗口名称,以字符串类型表示
- 要加载的图像
注意:在调用显示图像的API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。
cv.imshow('image',img) #opencv中显示
cv.waitKey(0) #等待窗口
运行结果:
1.3 图像的保存
cv.imwrite()
参数:
- 文件名,要保存在哪里
- 要保存的图像
cv.imwrite('genggui.png',img)
案例:
import cv2 as cv
img = cv.imread('genggui.jpg',0) #以灰度图的形式读取图像
cv.imshow('image',img) # opencv中显示
cv.waitKey(0)
cv.imwrite('gengguigray.png',img) #保存所生成的灰度图像
1.4 创建与关闭窗口
创建窗口
cv2.namedWindow(窗口名称, 属性) #创建一个窗口
关闭图像窗口
1.关闭一个由imshow产生的图像窗口
cv2.destroyWindow()
参数:winname,关闭的窗口名字
2.关闭所有由imshow产生的窗口
cv2.destroyAllWindows()
2.绘制几何图形
关键函数:
- 线:line()
- 矩形:rectangle()
- 圆:circle()
- 添加文字:putText()
2.1 绘制直线
cv.line(img,start,end,color,thickness)
参数:
- img:要绘制直线的图像
- Start,end: 直线的起点和终点
- color: 线条的颜色
- Thickness: 线条宽度
2.2 绘制圆形
cv.circle(img,centerpoint, r, color, thickness)
参数:
- img:要绘制圆形的图像
- Centerpoint, r: 圆心和半径
- color: 线条的颜色
- Thickness: 线条宽度,为-1时生成闭合图案并填充颜色
2.3 绘制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness)
参数:
- img:要绘制矩形的图像
- Leftupper, rightdown: 矩形的左上角和右下角坐标
- color: 线条的颜色
- Thickness: 线条宽度
2.4 向图像中添加文字
cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
参数:
- img: 图像
- text:要写入的文本数据
- station:文本的放置位置
- font:字体
- Fontsize :字体大小
3.图像反转与复制
3.1 翻转图像
cv2.flip(img,flipcode) #flipcode控制翻转效果
- flipcode = 0:沿x轴翻转
- flipcode > 0:沿y轴翻转
- flipcode < 0:x,y轴同时翻转
3.2 复制图像
imgcopy = img.copy()
4.获取图像的属性
图像属性包括高、宽和通道数,像素数,图像数据类型等。
img.shape #打印图片的高、宽和通道数
img.size #打印图片的像素数目(图片大小)
img.dtype #打印图片的格式(数据类型)
5.获取并修改图像中的像素点
我们可以通过行和列的坐标值获取该像素点的像素值。对于BGR图像,它返回一个蓝,绿,红值的数组。对于灰度图像,仅返回相应的强度值。使用相同的方法对像素值进行修改。
import cv2 as cv
img = cv.imread('genggui.jpg')
px = img[100,100] #获取某个像素点的值
blue = img[100,100,0] #仅获取蓝色通道的强度值
img[100,100] = [255,255,255] #修改某个位置的像素值
6.图像颜色通道的拆分与合并
有时需要在B,G,R通道图像上单独工作。在这种情况下,需要将BGR图像分割为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。
6.1 将图片img拆分为三个颜色通道:
cv2.split(img)
6.2 将三个颜色通道合并为一张图片:
cv2.merge(img)
7.色彩空间转换
OpenCV中有150多种颜色空间转换方法。最广泛使用的转换方法有两种,BGR↔Gray和BGR↔HSV。
cv.cvtColor(input_image,flag)
参数:
- input_image: 进行颜色空间转换的图像
- flag: 转换类型
- cv.COLOR_BGR2GRAY : BGR↔Gray
- cv.COLOR_BGR2HSV: BGR→HSV
更全的参数:
7.1 BGR↔Gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #BGR转换到GRAY
cv2.imshow("gray", gray)
7.2 BGR↔HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #BGR转换到HSV
cv2.imshow("hsv", hsv)
8.图像的加法与混合
关键函数:
- 相加:add()
- 混合:addWeighted()
8.1 图像的相加
cv2.add(src1, src2) #参数为图片1与图片2
8.2 图像的混合
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:
g(x) = (1−α)f0(x) + αf1(x)
通过修改 α 的值(0 → 1),可以实现非常炫酷的混合,落到函数中为两个权重。
cv2.addWeighted(src1, alpha, src2, beta,gamma,dst)
参数:
- src1:第一张图片
- alpha:第一张图片权重
- src2:第二张图片
- gamma:图1与图2带权相加和后添加的数值(总和大于255为纯白)
- dst:输出图片
例子:第一幅图像的权重是0.7,第二幅图像的权重是0.3,使用cv2.addWeighted()函数进行混合
img1=cv2.imread('1.jpg')
img2=cv2.imread('2.jpg')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
9. 图像的运算
9.1 加、减、乘、除
(加)
cv2.add(src1, src2) #加
(减)
cv2.subtract(src1, src2) #减
(乘)
cv2.multiply(src1, src2) #乘
(除)
cv2.divide(src1, src2)
9.2 均值、均值和方差
均值
cv2.mean(img) #均值
均值和方差
M1, dev1 = cv2.meanStdDev(img) #均值和方差
9.3 与、或、非、异或 运算
与运算
dst = cv2.bitwise_and(src1, src2) #与
cv2.imshow("bitwise_and", dst)
或运算
dst = cv2.bitwise_or(src1, src2) #或
cv2.imshow("bitwise_or", dst)
非运算(非运算就是对图像进行颜色反转)
dst = cv2.bitwise_not(src1, src2) # 非(其实是颜色翻转)
cv2.imshow("bitwise_not", dst)
异或运算
cv2.imshow(“bitwise_not”, dst)
dst = cv2.bitwise_xor(src1, src2)
10.图像的缩放,平移与旋转
10.1 缩放 cv2.resize()
cv2.resize(InputArray src, OutputArray dst, Size dsize,
double fx=0, double fy=0, int interpolation=INTER_LINEAR )
参数:
- src : 输入图像
- dsize: 绝对尺寸,直接指定调整后图像的大小
- fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可
- interpolation:插值方法
插值方法:(默认的插值方法为:双线性插值)
10.2 平移 cv2.warpAffine()
cv2.warpAffine(src,M,dsize)
参数:
- src : 输入图像
- M: 移到矩阵
- dsize: 输出图像
10.3 旋转 cv2.getRotationMatrix2D()
cv2.getRotationMatrix2D(center, angle, scale)
参数:
- center:旋转中心
- angle:旋转角度
- scale:缩放比例
返回:M:旋转矩阵
11.形态学处理函数
11.1 腐蚀与膨胀
1.腐蚀
#腐蚀
dst = cv2.erode( src, kernel, anchor, iterations, borderType, borderValue )
参数:
-
dst:腐蚀后所输出图像,该图像和原始图像具有同样的类型和大小。
-
src:输入图像,图像的通道数可以是任意的。但是要求图像的类型必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
-
kernel:腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5, 5)) #矩形结构 kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5, 5)) #椭圆结构 kernel = cv.getStructuringElement(cv.MORPH_CROSS,(5, 5)) # 十字形结构
-
anchor代表element结构中锚点的位置。该值默认为(-1, -1),在核的中心位置。
-
terations是腐蚀操作迭代的次数,该值默认为1,即只进行一次腐蚀操作。
-
borderType代表边界样式,一般采用其默认值BORDER_CONSTANT。
2.膨胀
#膨胀
dst = cv2.dilate( src, kernel, anchor, iterations, borderType, borderValue)
-
参数:kernel、anchor、iterations、borderType、borderValue与函数cv2.erode()内相应参数的含义一致。
11.2 开操作与闭操作
先腐蚀再膨胀的操作称为开运算。先膨胀再腐蚀的操作称为闭运算。
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) #开操作
cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) #闭操作
11.3 顶帽变换、底帽变换与形态学梯度(边界提取)
1.图像减去开运算结果称为顶帽变换(Top-hat)。
cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) #顶帽运算
2.图像减去闭运算结果称为底帽变换(Bottom-hat)。
cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) #底帽运算
3.膨胀结果减去腐蚀结果,可以得到图像中物体的边界,是一种提取目标物体边缘的算法。
cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel) #形态学梯度
12.常见滤波器
12.1 方框滤波
cv2.boxFilter( src, dst,ddepth, ksize, Point anchor = Point(-1,-1),
bool normalize = true,borderType = BORDER_DEFAULT )
参数:
-
src:输入图像
-
dst:输出图像
-
ddepth:输出图像的深度,-1 代表使用原图深度
-
ksize: 滤波内核的大小。一般这样写Size(w, h)来表示内核的大小,Size(10, 10)就表示 10x10 的核大小
-
anchor = Point(-1,-1) :表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1) 如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
-
normalize = true:默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了
-
borderType = BORDER_DEFAULT:用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
12.2 均值滤波
cv2.blur(src, dst, ksize, Point anchor = Point(-1,-1),borderType = BORDER_DEFAULT)
-
src:输入图像 。
-
dst:输出图像 。
-
ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。
-
anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。
-
boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT
12.3 高斯滤波
cv2.GaussianBlur( src, dst, ksize,sigmaX, sigmaY = 0, borderType = BORDER_DEFAULT )
-
src:输入图像 。
-
dst:输出图像 。
-
ksize:ksize.width 和 ksize.height 可以不同,但他们都必须为正数和奇数,或者为0,可由 sigma 计算而来
-
sigmaX:高斯核函数在 X 方向的的标准差
-
sigmaY:高斯核函数在 Y 方向的的标准差
若 sigmaY 为零,就将它设为 sigmaX;若 sigmaX 和 sigmaY 都是0,那么就由 ksize.width 和 ksize.height 计算出来.
12.4 中值滤波
medianBlur(InputArray src,OutputArray dst,int ksize)
-
src:输入图像 。
-
dst:输出图像 。
-
ksize:孔径的线性尺寸,这个参数必须是大于1 的奇数
12.5 双边滤波
bilateralFilter(src, dst, d, double sigmaColor,double sigmaSpace,
borderType=BORDER_DEFAULT)
-
src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
-
dst: 输出图像,和原图像有相同的尺寸和类型。
-
d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
-
sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
-
sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
-
borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
展示图像:
13.轮廓检测
13.1 找出图片的轮廓值
cv2.findContours(img,mode, method) # 找出图中的轮廓值,得到的轮廓值都是嵌套格式的
参数:
- img:输入的图片
- mode:轮廓检索模式(通常都使用RETR_TREE找出所有的轮廓值)
RETR_EXTERNAL:只检索最外面的轮廓。
RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中。
RETR_CCOMP:检索所有的轮廓,并肩他们组织为两层:顶层为各部分外部边界,第二层是空洞的边界。
RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
- method:轮廓逼近方法
CHAIN_APPROX_NONE : 以Freeman链码的方式输出轮廓,所有其它方法输出多边形。
CHAIN_APPROX_SIMPLE : 压缩水平的、垂直的和斜着的部分,也就是函数只保留他们终点部分。
13.2 画出图片中的轮廓值,也可以用来画轮廓的近似值
cv2.drawCountours(img, contours, -1, (0, 0, 255), 2) # 画出图片中的轮廓值,也可以用来画轮廓的近似值
参数:
- img:输入的图片
- contours:轮廓值(-1表示轮廓的索引,(0, 0, 255)表示颜色, 2表示线条粗细)
轮廓检测与画图步骤:
第一步:载入图片
第二步:使用cv2.cvtcolor() 将图片转换为灰度图
第三步: 使用cv2.threshold将图片做二值化转换
第四步: 使用cv2.findContours 找出图片的轮廓值
第五步:使用cv2.drawContours在图片上画上轮廓
第六步: 使用cv2.imshow 完成画图操作
13.3 计算轮廓的面积
cv2.contourArea(cnt, True) # 计算轮廓的面积
参数说明:cnt为输入的单个轮廓值
13.4计算轮廓的周长
cv2.arcLength(cnt, True) # 计算轮廓的周长
参数说明:cnt为输入的单个轮廓值
计算轮廓的周长和面积步骤:
使用cv2.findCountor获得的轮廓contours是一个嵌套的类型,即我们可以通过cnt = contours获得第一个物体的轮廓值
第一步:载入图片,做灰度值和二值化处理,并使用cv2.findCountor找出轮廓值,使用cv2.drawCountors画出第一个图像的轮廓
第二步:通过索引取出第一个轮廓值cnt,使用cv2.ContourArea()计算轮廓的面积
第三步:使用cv2.arcLength 获得轮廓的周长
13.5 外接矩形
使用cv2.boudingrect(cnt)获得轮廓的外接矩形,接着使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓。
1.获得外接矩形位置信息:
x, y, w, h = cv2.boudingrect(cnt) # 获得外接矩形
参数说明:x,y, w, h 分别表示外接矩形的x轴和y轴的坐标,以及矩形的宽和高, cnt表示输入的轮廓值。
2.根据坐标在图像上画出矩阵的轮廓
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 根据坐标在图像上画出矩形
参数说明: img表示传入的图片, (x, y)表示左上角的位置, (x+w, y+h)表示加上右下角的位置,(0, 255, 0)表示颜色,2表示线条的粗细
13.6 外接圆
1.获得外接圆的位置信息
(x, y), radius = cv2.minEnclosingCircle(cnt) # 获得外接圆的位置信息
参数说明: (x, y)表示外接圆的圆心,radius表示外接圆的半径, cnt表示输入的轮廓
2. 根据坐标在图上画出圆
cv2.Cricle(img, center, radius, (0, 255, 0), 2) # 根据坐标在图上画出圆
参数说明:img表示需要画的图片,center表示圆的中心点,radius表示圆的半径, (0, 255, 0)表示颜色, 2表示线条的粗细
画出外接矩形和外接圆步骤:
外接矩形: 使用cv2.boudingrect(cnt)获得轮廓的外接矩形,使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓
外接圆: 使用cv2.minEnclosingCircle(cnt)获得轮廓的外接圆,使用cv2.circle(ret, centers, radius, (0, 0, 255), 2)画出圆的轮廓
第一步:载入图片,灰度化,二值化,使用cv2.findCountors找出图像的轮廓,使用轮廓索引获得第一个轮廓cnt
第二步:使用cv2.boundingrect(cnt) ,获得轮廓的x,y,w, h (x, y)表示左上角的坐标,w为宽,h为长
第三步: 使用cv2.rectangle 绘制外接的轮廓
第四步: 使用cv2.minEnclosingCircle(cnt), 获得center和radius,即圆心点的坐标和圆的半径
第五步: 使用cv2.circle(img, center, radius, (0, 0, 255), 2) 绘制圆心的外接轮廓
14.图像金字塔(上采样和下采样)
1. 下采样:图像缩小(先高斯模糊,再降采样,需要一次次重复,不能一次到底)
cv.pyrUP(img) #对图像进行上采样
2. 上采样图像扩大(先扩大,再卷积或者使用拉普拉斯金字塔)
cv.pyrDown(img)#对图像进行下采样
15.边界填充
cv2.copyMakeBorder(img,top, bottom, left, right ,borderType)
参数:
-
img
:需要填充的图像; -
top
:图像上边界需要填充的像素点; -
bottom
:图像下边界需要填充的像素点; -
left
:图像左边界需要填充的像素点; -
right
:图像右边界需要填充的像素点; -
borderType
:图像填充的方法。
填充方法:
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法 abcdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充,需要在设置一个value值,已显示填充的颜色。
16.视频捕获类(VideoCapture类)
(可以从视频文件、图像序列和摄像头捕获视频。 OpenCV提供了cv2.VideoCapture类来处理视频。VideoCapture类处理视频的方式非常简单、快捷,而且它既能处理视频文件,又能处理摄像头信息。)
16.1 读取视频文件--VideoCapture()
cv2.VideoCapture (const String &filename, int apiPreference=CAP_ANY)
参数: (一般仅填入一个,即文件名。如果填入整数,则打开对应的捕获设备ID。若为0,则打开默认摄像头。)
filename : 打开的视频文件名。
const String 包括: 视频名 (eg: video.avi)
图像序列 (eg: img_%02d.jpg)
URL视频流 (eg: protocol://host:port/script_name?script_params|auth)
apiPreference : 当多种capture方式都可以使用时,指定一种方式(CAP_FFMPEG or CAP_IMAGES )
例子: cv2.VideoCapture capture("C:/Users/DADA/DATA/gogo.avi"); // 从视频文件读取
16.2 视频参数获取--VideoCapture.get() 与设置--VideoCapture.set()
cv2.VideoCapture.get()
先读取视频文件:(然后后面可以直接写 video.get() or video.set() )
import cv2
# 读取视频文件
video = cv2.VideoCapture('./genggui.mp4')
1.获取视频参数:
# 获取视频参数
param = video.get(CV_CAP_PROP_FRAME_COUNT) # 也可使用以下数字表示参数
'''
cv2.VideoCapture.get(0) CV_CAP_PROP_POS_MSEC 视频文件的当前位置,以毫秒为单位
cv2.VideoCapture.get(1) CV_CAP_PROP_POS_FRAMES 基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2) CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3) CV_CAP_PROP_FRAME_WIDTH 在视频流的帧的宽度
cv2.VideoCapture.get(4) CV_CAP_PROP_FRAME_HEIGHT 在视频流的帧的高度
cv2.VideoCapture.get(5) CV_CAP_PROP_FPS 帧速率
cv2.VideoCapture.get(6) CV_CAP_PROP_FOURCC 编解码器/fourcc
cv2.VideoCapture.get(7) CV_CAP_PROP_FRAME_COUNT 帧数
cv2.VideoCapture.get(8) CV_CAP_PROP_FORMAT 返回对象的格式
cv2.VideoCapture.get(9) CV_CAP_PROP_MODE 返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10) CV_CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11) CV_CAP_PROP_CONTRAST 图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12) CV_CAP_PROP_SATURATION 图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13) CV_CAP_PROP_HUE 色调图像(仅适用于照相机)
cv2.VideoCapture.get(14) CV_CAP_PROP_GAIN 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15) CV_CAP_PROP_EXPOSURE 曝光(仅适用于照相机)
cv2.VideoCapture.get(16) CV_CAP_PROP_CONVERT_RGB 指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17) CV_CAP_PROP_WHITE_BALANCE 白平衡,暂时不支持
cv2.VideoCapture.get(18) CV_CAP_PROP_RECTIFICATION 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
'''
2.设置视频参数:
# 设置视频参数
video.set(CV_CAP_PROP_FPS, 30) # 第一个参数为设置的参数名,第二个参数为设定的值
'''
可设置的参数与上述可获取的参数大体一致
'''
# 释放
video.release()
参数与上面大体一致:
16.3 判断摄像头是否开启 -- VideoCapture.isOpened()
1.先读取视频
import cv2
# 读取视频文件
video = cv2.VideoCapture('./test.mp4') # 参数为视频文件地址,若是数字表示摄像头编号。
'''
参数为字符串,表示输入的视频文件的地址及文件名
参数为数字,表示摄像头编号,默认为-1.即随机选取一个摄像头
'''
2.判断摄像头是否开启
# 判断视频是否是打开状态
video.isOpened():
参数:无
作用:判断设备/文件是否读取成功,若成功,返回True
16.4 关闭文件/摄像头(释放)--VideoCapture.release()
cv2.VideoCapture.release()
参数:无
作用:关闭文件/摄像头
16.5 读取该文件/摄像头的下一帧 -- VideoCapture.read()
如果正确读取了帧,它将为 True 。因此,你可以通过检 查此返回值来检查视频的结尾。
cv2.VideoCapture.read()
参数:无
返回值:bool,numpy.array
作用:读取该文件/摄像头的下一帧,成功与否由bool返回值决定,返回的帧矩阵为第二个参数
17.视频读写类(VideoWriter类)
17.1 cv2.VideoWriter()
OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。该函数的完整定义如下:
cv2.VideoWriter(filename,fourcc,fps,frameSize[,isColor])
参数:
filename:需要输出保存的视频文件名。如果文件名存在,覆盖原文件。
fourcc:视频的编码类型。在OpenCV中,cv2.VideoWriter_fourcc()函数用来指定视频的编码格式。该函数的参数有4个,这4个字符构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。常用标记如下图:
fps:帧速率,比如录制视频每秒30帧,或者60帧等。
frameSize:帧的长宽
isColor:是否为彩色图像
17.2 write函数--cv2.VideoWriter.write()
cv2.VideoWriter类中还提供了cv2.VideoWriter.write()函数用于写入下一帧视频。其完整定义如下:
cv2.VideoWriter.write(image)
image参数是需要写入的视频帧
18.视频读写实战:
import cv2
# 读取视频文件
video = cv2.VideoCapture('./test.mp4') # 参数为视频文件地址,若是数字表示摄像头编号。
'''
参数为字符串,表示输入的视频文件的地址及文件名
参数为数字,表示摄像头编号,默认为-1.即随机选取一个摄像头
'''
# 创建写视频器
video_writer = cv2.VideoWriter(filename='./output.mp4', # 保存路径文件名
apiPreference=cv2.CAP_FFMPEG, # 后端
fourcc=cv2.VideoWriter_fourcc(*'mp4v'), # 视频编解码器
fps=25, # 视频帧率
frameSize=(1920,1080) # 视频帧尺寸(W, H)
isColor=True # 彩色图像或黑白图像
)
'''
apiPreference:cv2.CAP_FFMPEG 或者 cv2.CAP_GSTREAMER,此参数是3.x版本的opencv才有的
fourcc:cv2.VideoWriter_fourcc('M', 'P', '4', 'V') 或 fourcc=cv2.VideoWriter_fourcc(*'mp4v')
支持类型:MP4V / X264 / I420 / PIMI / XVID / THEO / FLV1
'''
# 判断视频是否是打开状态
while video.isOpened():
# 读取一帧
ret, frame = video.read() # ret是bool类型,表示是否读取成功;frame为获取的帧图像
if ret:
# 写入一帧
video_writer.write(frame)
# 播放视频
cv2.imshow('frame', frame)
cv2.waitKey(1) # 通过设置等待时间改变播放速度
else:
break
# 释放
video.release()
video_writer.release() # 不释放会无法完成写视频,类似文件写完后的close()
19.图像直方图
19.1 直方图 -- hist = cv2.calcHist( )
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
- hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。
- images:原始图像,该图像需要使用“[ ]”括起来.
- channels:指定通道编号。通道编号需要用“[ ]”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。
- mask:掩模图像。当统计整幅图像的直方图时,将这个值设为 None。当使用掩模图像获取直方图时,仅获取掩模参数 mask 指定区域的直方图。
- histSize:BINS 的值,该值需要用“[ ]”括起来。例如,BINS 的值是 256,需要使用“[256]”作为此参数值。
- ranges:即像素值范围。例如,8 位灰度图像的像素值范围是[0, 255]。
- accumulate:累计(累积、叠加)标识,默认值为 False。如果被设置为 True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数允许从多个对象中计算单个直方图,或者实时更新直方图。该参数是可选的,一般情况下不需要设置。
19.2 直方图均衡化
(统计出来的像素点的值之间的差距比较大,我们需要缩小像各个像素点之间的值得差距,这就叫均衡化。)
dst = cv2.equalizeHist( src )
参数:src 是 8 位单通道原始图像,dst 是直方图均衡化处理的结果。
20.模板匹配
result=cv2.matchTemplate( img,template,method)
参数:
- image:原始图像S
- template :模板图像T,一般是源图像S中的一小块
- method: 实现模板匹配的算法,主要有:
1.平方差匹配(CV_TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
2.相关匹配(CV_TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
3.利用相关系数匹配(CV_TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。
21.霍夫变换
21.1 霍夫线检测
霍夫变换常用来提取图像中的直线和圆等几何图形,霍夫空间中的一条线对应笛卡尔坐标系中一个点,笛卡尔坐标系中两个点,对应霍夫空间一条直线。
cv2.HoughLines(img,rho,theta,threshold)
参数:
- img:检测的图像,要求是二值化的图像,所以在调用霍夫变换之前首先要迸行二值化,或者迸行Canny边缘检测
- rho、theta: 两个角度的精确度
- threshold:阈值,只有累加器中的值高于该阈值时才被认为是直线
21.2 霍夫圆检测
OpenCV采用霍夫梯度法将霍夫圆检测范围两个阶段,第一阶段检测圆心,第二阶段利用圆心推导出圆圆心检测的原理:圆心是圆周法线的交汇处,设置-一个阈值,在某点的相交的直线的条数大于这个阈值就认为该交汇点为圆心。
圆半径确定原理:圆心到圆周上的距离(半径)是相同的,确定- 个阈值,只要相同距离的数量大
于该阈值,就认为该距离是该圆心的半径。
circles=cv.HoughCircles(image,method,dp,minDist,param1=100,param2=100,minRadius=0,maxRadius=0)
参数:
- method: 使用霍夫变换圆检测的算法,它的参数是CV_ HOUGH_ GRADIENT
- dp:霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致, dp=2时霍夫空间是输入图像空间的一半,以此类推。
- minDist 圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心。
- param1: 边缘检测时使用Canny算子的高阈值,低阈值是高阈值的一半。
- param2: 检测圆心和确定半径时所共有的阈值。
- minRadius和maxRadius为所检测到的圆半径的最小值和最大值。
这篇课程的学习和总结到这里就结束啦,如果有什么问题可以在评论区留言呀~
如果帮助到大家,可以一键三连+关注支持下~