OpenCV 之 cv2.getAffineTransform + warpAffine

getAffineTransform函数

函数作用:

主要用于生成仿射变换矩阵

一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移).

综上所述, 我们能够用仿射变换来表示:

旋转 (线性变换)
平移 (向量加)
缩放操作 (线性变换)
你现在可以知道, 事实上, 仿射变换代表的是两幅图之间的 关系 .

我们通常使用  矩阵来表示仿射变换.

 

考虑到我们要使用矩阵  和  对二维向量  做变换, 所以也能表示为下列形式:

  或  

 

 

怎样才能求得一个仿射变换?
好问题. 我们在上文有提到过仿射变换基本表示的就是两幅图片之间的 联系 . 关于这种联系的信息大致可从以下两种场景获得:

我们已知  和 T 而且我们知道他们是有联系的. 接下来我们的工作就是求出矩阵 
我们已知  and . 要想求得 . 我们只要应用算式  即可. 对于这种联系的信息可以用矩阵  清晰的表达 (即给出明确的2×3矩阵) 或者也可以用两幅图片点之间几何关系来表达.
让我们形象地说明一下. 因为矩阵  联系着两幅图片, 我们以其表示两图中各三点直接的联系为例. 见下图:

 

 


点1, 2 和 3 (在图一中形成一个三角形) 与图二中三个点一一映射, 仍然形成三角形, 但形状已经大大改变. 如果我们能通过这样两组三点求出仿射变换 (你能选择自己喜欢的点), 接下来我们就能把仿射变换应用到图像中所有的点.


函数的调用形式:

Mat getAffineTransform(InputArray src, InputArray dst)

 

 

参数详解:

InputArray src:表示输入的三个点

InputArray dstL:表示输出的三个点

获取变换矩阵

 

cv2.warpAffine

opencv中的仿射变换在python中的应用并未发现有细致的讲解,函数cv2.warpAffine的参数也模糊不清,今天和大家分享一下参数的功能和具体效果,如下:

官方给出的参数为:

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

 

其中:

src - 输入图像。
M - 变换矩阵。
dsize - 输出图像的大小。
flags - 插值方法的组合(int 类型!)
borderMode - 边界像素模式(int 类型!)
borderValue - (重点!)边界填充值; 默认情况下,它为0。

上述参数中:M作为仿射变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3的变换矩阵。

flages表示插值方式,默认为 flags=cv2.INTER_LINEAR,表示线性插值,此外还有:cv2.INTER_NEAREST(最近邻插值)   cv2.INTER_AREA (区域插值)  cv2.INTER_CUBIC(三次样条插值)    cv2.INTER_LANCZOS4(Lanczos插值)

日常进行仿射变换时,在只设置前三个参数的情况下,如 cv2.warpAffine(img,M,(rows,cols))可以实现基本的仿射变换效果,但可以出现“黑边”现象;

这对后续的处理往往造成很大的困扰,第六个参数可以选择填充的颜色,默认为黑色。

 

在python中设置warpAffine的参数与c++中有所不同,具体如下:

c++中:

warpAffine(src,img,M,Size(a,b),1,0,Scalar(255,255,255));

 

python中:

cv2.warpAffine(img,M,(rows,cols),flags=cv2.INTER_,borderMode=cv2.BORDER_REFLECT,borderValue=(255,255,255))

 

在python 中有一个好处是不必按顺序设置,直接指明所设置的参数即可,如将上述图片边界区域填充为白色:

cv2.warpAffine(img,M,(lengh,lengh),borderValue=(255,255,255)) 

 

更高级的应用:

参考人脸提取框架MTCNN的相关代码:mtcnn_pytorch/src/align_trans.py

 

参考:

 

getAffineTransform https://blog.csdn.net/qq_18343569/article/details/47953505

warp https://blog.csdn.net/qq878594585/article/details/81838260

posted @ 2020-07-16 14:42  戒骄戒躁-沉淀积蓄  阅读(6512)  评论(0编辑  收藏  举报