OpenCV 的AffineTransform(传说中的仿射变换)

为了让数据集能够有旋转不变形,希望在caffe训练处好结果,我对采集的数据集进行了一个仿射变换。

利用opencv可以比较方便的实现这个事情。

我的数据集还有一些点标注。标注需要在图片旋转的同时把关键点也旋转到合适的位置。

Mat affineTransform(Mat src, std::vector<float>& v)

{

Mat rot_mat(2, 3, CV_32FC1);

Mat dst = Mat::zeros(src.rows, src.cols, src.type());

/** Rotating the image after Warp */

/// Compute a rotation matrix with respect to the center of the image

Point center = Point(dst.cols / 2, dst.rows / 2);

double scale = 0.7;

double angle = rand()%720;

/// Get the rotation matrix with the specifications above

rot_mat = getRotationMatrix2D(center, angle, scale);

double a11 = rot_mat.at<double>(0,0);

double a12 = rot_mat.at<double>(0,1);

double a21 = rot_mat.at<double>(1,0);

double a22 = rot_mat.at<double>(1,1);

double b11 = rot_mat.at<double>(0,2);

double b12 = rot_mat.at<double>(1,2);

/// Rotate the warped image

warpAffine(src, dst, rot_mat, dst.size());

int ftx = v[0]*src.cols;;

int fty = v[1]*src.rows;

int bnx = v[2]*src.cols;

int bny = v[3]*src.rows;

//calculation of new label

float cftx = (ftx*a11+fty*a12+b11)/src.cols;

float cfty = (ftx*a21+fty*a22+b12)/src.rows;

float cbnx = (bnx*a11+bny*a12+b11)/src.cols;

float cbny = (bnx*a21+bny*a22+b12)/src.rows;

//write vector

v.erase(v.begin(),v.end());

v.push_back(cftx);v.push_back(cfty);

v.push_back(cbnx);v.push_back(cbny);

return dst;

}

函数传入的vector里面是某些点(我自己做实验的时候需要的一些关键点。。)利用rotationMatrix可以计算出仿射变换之后的点坐标。

时间: 2024-09-30 11:15:54

OpenCV 的AffineTransform(传说中的仿射变换)的相关文章

OpenCV探索之路(八):重映射与仿射变换

重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在OpenCV中,用的是remap函数实现重映射. 基本重映射 #include <iostream> #include <opencv2\opencv.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <opencv2\

图像处理之基础---仿射变换

几种典型的仿射变换: public static AffineTransform getTranslateInstance(doubl 仿射变换-例 e tx, double ty) 平移变换,将每一点移动到(x+tx, y+ty),变换矩阵为: [ 1 0 tx ] [ 0 1 ty ] [ 0 0 1 ] (译注:平移变换是一种“刚体变换”,rigid-body transformation,中学学过的物理,都知道啥叫“刚体”吧,就是不会产生形变的理想物体,平移当然不会改变二维图形的形状.同

图像处理URL

随笔分类 - 图像处理/图像增强等 图像增强: 图像复原: 图像重建: 图像分割: 图像特效: 图像匹配: 图像形态学处理: 图像几何处理: 图像正交变换: 人工智能: 跟踪: 图像处理之增强---图像模糊检测 摘要: 这种检测可以做宽动态的检测,也可应用稳像算法我们实现了拉普拉斯方差算法,该算法提供给我们一个浮点数来代表具体图像的"模糊度".该算法快速,简单且易于使用--用拉普拉斯算子与输入图像做卷积然后计算方差即可.如果方差低于预定义阈值,图像就被标记为"模糊"

仿射映射

在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射(来自拉丁语,affinis,"和...相关")由一个线性变换接上一个平移组成. 目录 1原理 2示例 3相关例子 1原理编辑 在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b.一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1. AffineTransform类描

OpenCV仿射变换+投射变换+单应性矩阵

本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6. warpAffine():对输入图像进行仿射

【OpenCV新手教程之十八】OpenCV仿射变换 &amp;amp; SURF特征点描写叙述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中.我们一起探讨了OpenCV

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

图像的仿射变换与AffineTransform类

在图像匹配研究领域中,仿射变换图像是一个重要的研究对象,因此需要对仿射变换在图像中的操作有基本认识.学习了网上一些博客和教程,简单记录了一下: 图像的仿射变换主要包含以下一系列操作:翻转(Flip).旋转(Rotation).平移(Translation).缩放(Scale)和错切(Shear). AffineTransform类描述了一种二维仿射变换的功能,它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的"平直性"(straightness)即变换后直线依然保持直线,圆弧还是

OpenCV实现仿射变换

什么是仿射变换? ? 一个随意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移). 综上所述, 我们可以用仿射变换来表示: 旋转 (线性变换) 平移 (向量加) 缩放操作 (线性变换) 你如今能够知道, 其实, 仿射变换代表的是两幅图之间的 关系 . #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <ios