OpenCV 视觉编程
Chapter0 注意事项
opencv的图像是 先宽度 再高度,这点是与numpy不同的
- img.shape[0:2] # 0可省略,返回图像的宽和高(长和宽)
- img.shape[0:3] # 包括通道数一起返回,要3个参数接收
imread 的图像路径如果包含中文会有bug(可能是win特供, 在ubuntu下可以),因此可以使用imdecode 来代替
resize 要慎用,因为插值的方法不一定能保证图片前后像素的一致性(除非等倍放缩)
图像裁剪「👷♀️中」https://blog.csdn.net/hfutdog/article/details/82351549
Chapter1 基本图像操作
1.1 图像的基本I/O操作
- 注意waitKey() 有返回值,其值是16位int形式的ASCII码
1 |
|
1.2 视频I/O
1.2.1视频(调用摄像头来输入)
1 |
|
1.2.2将鼠标引入
1 |
|
1.3 C++中的Mat在python接口处的转化
Mat是OpenCV C++中的数据结构,**在python中被转化为 numpy的ndarray**
- Mat 由header + data构成,header中记录图片的维数、大小、数据类型等
- 利用numpy提供的深浅拷贝方法,可以实现Mat的拷贝
- img.view() # 浅拷贝
- img.copy() # 深拷贝
- 访问ndarray的属性,就相当于访问Mat图像的属性
- 包括.shape, .size, .dtype(注意uint这个格式) 等
1.4 图像通道的分类与合并
- spilt(mat) 分割通道, merge((ch1, ch2, ch3)) 融合通道
1 |
|
1.5图像绘制
line(img, pt1, pt2, color, thickness, lineType, shift) 画直线
- img: 在哪个图像上画线
- pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置
- color: 颜色
- thickness: 线宽
- lineType: 线型.线型为-1, 4, 8, 16, 默认为8
- shift: 坐标缩放比例.
rectangle() 参数同上 画矩形
circle(img, center, radius, color[, thickness[, lineType[, shift]]]) 中括号内参数表示可选参数. 画圆
ellipse(img, 中心点, 长宽的一半, 角度, 从哪个角度开始, 从哪个角度结束,…)
polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) 画多边形
fillPoly 填充多边形
putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) 绘制文本
- text 要绘制的文本
- org 文本在图片中的左下角坐标
- fontFace 字体类型即字体
- fontScale 字体大小
1 |
|
- 结合鼠标callback的方法,我们就可以使用opencv来绘图了
Chapter2 图像的基本处理
2.1 图像基本变换
2.1.1 放大/缩小
resize(src, dsize[, dst[, fx [, fy[, interpolation]]]])
src: 要缩放的图片
dsize: 缩放之后的图片大小, 元组和列表表示均可.
dst: 可选参数, 缩放之后的输出图片
fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比.
interpolation: 插值算法, 主要有以下几种:
- INTER_NEAREST, 邻近插值, 速度快, 效果差.
- INTER_LINEAR, 双线性插值, 使用原图中的4个点进行插值. 默认.
- INTER_CUBIC, 三次插值, 原图中的16个点.
- INTER_AREA, 区域插值, 效果最好, 计算时间最长.
1 |
|
2.1.2 旋转/翻转
flip(src, flipCode) # 翻转
flipCode = 0 表示上下翻转
flipCode > 0 表示左右翻转
flipCode < 0 上下 + 左右
rotate(img, rotateCode=___) # 旋转
- ROTATE_90_CLOCKWISE 90度顺时针
- ROTATE_180 180度
- ROTATE_90_COUNTERCLOCKWISE 90度逆时针
2.2 图像的仿射变换
仿射变换:图像旋转、缩放、平移都可以用仿射变换来描述。其本质是 变换矩阵和图片矩阵的矩阵运算。
- warpAffine(src, M, dsize, flags, mode, value)
- M:变换矩阵
- dsize: 输出图片大小
- flag: 与resize中的插值算法一致
- mode: 边界外推法标志
- value: 填充边界值
2.2.1 平移矩阵
- 矩阵中的每个像素由(x,y)组成,(x, y)表示这个像素的坐标. 假设沿x轴平移$t_x$, 沿y轴平移$t_y$, 那么最后得到的坐标为$(\hat x, \hat y) = (x + t_x, y + t_y)$, 用矩阵表示就是:
- $ \left(\begin{matrix}\hat x \\hat y \1\end{matrix}\right) = \left(\begin{matrix}1 & 0 & t_x\0 & 1 & t_y\0 & 0 & 1\end{matrix}\right)\left(\begin{matrix}x \y \1\end{matrix}\right) $
1 |
|
2.2.2 获取变换矩阵W (通过这个API获取你想要进行的变换的 变换矩阵W,然后调用warpAffine)
- getRotationMatrix2D(center, angle, scale)
center 中心点 , 以图片的哪个点作为旋转时的中心点.
angle 角度: 旋转的角度, 按照逆时针旋转.
scale 缩放比例: 想把图片进行什么样的缩放.
1 |
|
- 按照病例来划分训练和测试集,不使用比例划分的方式,修改训练代码,不使用轮次batch喂模型
- 优化多边形和方形裁剪的方式,不用边缘回归了,直接图像中心裁剪后padding为224**输入模型