算了半天一直在思考如何快速把矩阵算出来,网上基本都是在说边长为1的正方形的变换方式=。=   不怎么用得上…… 公式推导推半天,计算还麻烦。。。。

++++++++++++++++++++++++++++++

对于透视变换:

其中我们在使用的时候最重要的是算出系数……………………  这里我们按照i=1计算

找了半天找到了这一篇论文:http://www.ixueshu.com/document/027c165d22e18077318947a18e7f9386.html

里面提到我们可以将公式

改写成的模式。

那么根据矩形矫正前后的8个顶点可以得到公式:

那么只要计算中间8x8矩阵的逆,乘上变换后的uv矩阵,就可以求出所有待定系数。其中点的检测需要用到hough算法,点和点之间的对应我做了个交互,不然太麻烦了。。。。

矩阵求逆代码:其中N为8

 #include <iostream>
using namespace std;
#define N 8 //测试矩阵维数定义 //按第一行展开计算|A|
double getA(double arcs[N][N], int n)
{
if (n == )
{
return arcs[][];
}
double ans = ;
double temp[N][N] = { 0.0 };
int i, j, k;
for (i = ; i<n; i++)
{
for (j = ; j<n - ; j++)
{
for (k = ; k<n - ; k++)
{
temp[j][k] = arcs[j + ][(k >= i) ? k + : k]; }
}
double t = getA(temp, n - );
if (i % == )
{
ans += arcs[][i] * t;
}
else
{
ans -= arcs[][i] * t;
}
}
return ans;
} //计算每一行每一列的每个元素所对应的余子式,组成A*
void getAStart(double arcs[N][N], int n, double ans[N][N])
{
if (n == )
{
ans[][] = ;
return;
}
int i, j, k, t;
double temp[N][N];
for (i = ; i<n; i++)
{
for (j = ; j<n; j++)
{
for (k = ; k<n - ; k++)
{
for (t = ; t<n - ; t++)
{
temp[k][t] = arcs[k >= i ? k + : k][t >= j ? t + : t];
}
} ans[j][i] = getA(temp, n - ); //此处顺便进行了转置
if ((i + j) % == )
{
ans[j][i] = -ans[j][i];
}
}
}
} //得到给定矩阵src的逆矩阵保存到des中。
bool GetMatrixInverse(double src[N][N], int n, double des[N][N])
{
double flag = getA(src, n);
double t[N][N];
if ( == flag)
{
cout << "原矩阵行列式为0,无法求逆。请重新运行" << endl;
return false;//如果算出矩阵的行列式为0,则不往下进行
}
else
{
getAStart(src, n, t);
for (int i = ; i<n; i++)
{
for (int j = ; j<n; j++)
{
des[i][j] = t[i][j] / flag;
} }
} return true;
}

主函数内代码:(仅部分)

vector<pair<int, int>> P ,newPoint; //P 变换后标准A4的点  newPoint 变换前的点   计算时候计算变换后变换到变换前

//省略中间数值插入和输出图片构成

P.push_back(make_pair(, ));
P.push_back(make_pair((int)len1, ));
P.push_back(make_pair((int)len1, (int)len2));
P.push_back(make_pair(, (int)len2)); int uv[] = { newPoint[].first, newPoint[].second,
newPoint[].first, newPoint[].second,
newPoint[].first, newPoint[].second,
newPoint[].first, newPoint[].second }; double src[][] =
{ { P[].first, P[].second, , , , , -newPoint[].first*P[].first, -newPoint[].first*P[].second },
{ , , , P[].first, P[].second, , -newPoint[].second*P[].first, -newPoint[].second*P[].second }, { P[].first, P[].second, , , , , -newPoint[].first*P[].first, -newPoint[].first*P[].second },
{ , , , P[].first, P[].second, , -newPoint[].second*P[].first, -newPoint[].second*P[].second }, { P[].first, P[].second, , , , , -newPoint[].first*P[].first, -newPoint[].first*P[].second },
{ , , , P[].first, P[].second, , -newPoint[].second*P[].first, -newPoint[].second*P[].second }, { P[].first, P[].second, , , , , -newPoint[].first*P[].first, -newPoint[].first*P[].second },
{ , , , P[].first, P[].second, , -newPoint[].second*P[].first, -newPoint[].second*P[].second } }; double matrix_after[N][N]{};
bool flag = GetMatrixInverse(src, N, matrix_after);
if (false == flag) {
cout << "求不出系数" << endl;
return;
} cout << "逆矩阵:" << endl; for (int i = ; i<; i++)
{
for (int j = ; j<; j++)
{
cout << matrix_after[i][j] << " ";
//cout << *(*(matrix_after+i)+j)<<" ";
}
cout << endl;
} double xs[];
for (int i = ; i < ; i++) {
double sum = ;
for (int t = ; t < ; t++) {
sum += matrix_after[i][t] * uv[t];
}
xs[i] = sum;
}
//矩形矫正 没有用双线性插值
cimg_forXY(outputimg, x, y) {
double px = xs[] * x + xs[] * y + xs[];
double py = xs[] * x + xs[] * y + xs[];
double p = xs[] * x + xs[] * y + ; int u = px / p;
int v = py / p; outputimg(x, y, ) = paint(u, v, );
outputimg(x, y, ) = paint(u, v, );
outputimg(x, y, ) = paint(u, v, );
}

以上~

基本实验了一下:

结果:

还可以吧。。。

perspective transform透视矩阵快速求法+矩形矫正的更多相关文章

  1. 【CImg】简单的畸变矩形矫正

    三个角点确定一个平面,畸变的平面可以看成是不同基底下同一图像的表示 ============================我是分割线============================= 1. ...

  2. CSS3打造3D效果——perspective transform的深度剖析

    声明:此篇博文虽是自己手写,但大量资源取自 张鑫旭 的博文.想看更详细 更专业的剖析请看张鑫旭的博文. 昨天对css3的transform做了初步的分析和认识,突然看到perspective属性,调了 ...

  3. hdu3306 Another kind of Fibonacci【矩阵快速幂】

    转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://acm.hdu.edu.cn/showproblem. ...

  4. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  5. HDU 6185 Covering 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6185 题意:用 1 * 2 的小长方形完全覆盖 4 * n的矩形有多少方案. 解法:小范围是一个经典题 ...

  6. hdu4549 M斐波那契数列 矩阵快速幂+快速幂

    M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...

  7. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

  8. BZOJ2476: 战场的数目(矩阵快速幂)

    题意 题目链接 Sol 神仙题Orzzz 考虑两边是否有\(1\) 设\(f[i]\)表示周长为\(2i\)的方案数 第一种情况:左侧或右侧有一个1,那么把这个1删去,对应的方案数为\(f[i - 1 ...

  9. HDU - 6185 Covering(暴搜+递推+矩阵快速幂)

    Covering Bob's school has a big playground, boys and girls always play games here after school. To p ...

随机推荐

  1. TCP UDP socket http webSocket 之间的关系

    ---恢复内容开始--- OSI&TCP/IP模型 要弄清tcp udp socket http websocket之间的关系,首先要知道经典的OSI七层模型,与之对应的是TCP/IP的四层模 ...

  2. SpringBoot从入门到精通十一(SpringBoot文件上传的两种方法)

    前言 在企业级项目开发过程中,上传文件是最常用到的功能.SpringBoot集成了SpringMVC,当然上传文件的方式跟SpringMVC没有什么出入. 本章目标 使用SpringBoot项目完成单 ...

  3. centos7PXE和cobbler自动部署装机

    安装程序启动过程MBR:isolinux/boot.catstage2: isolinux/isolinux.bin配置文件:isolinux/isolinux.cfg 每个对应的菜单选项: 加 ...

  4. 一文秒懂CPU使用率

    目录 CPU:Cores, and Hyper-Threading  超线程(Hyper-Threading ) 多核(multi-cores) CPU使用率计算 CPU使用率测试 如何计算CPU使用 ...

  5. docker search/pull 报错

    docker报错 Get https://registry-1.docker.io/v2/: x509: certificate has expired or is not yet valid 这种错 ...

  6. Django中CBV View的as_view()源码解析

    CBV与FBV路由区别 urlpatterns = [ url(r'^publish/$', views.Publishs.as_view()), # CBV写法 url(r'^publish/$', ...

  7. Programming In Lua 第四章

    1, 2, 3, 4, 5, 6, 7,

  8. TCP/IP 第四、五章

    1, 2, 整个arp请求的过程. 3,arp -a 获取arp高速缓存.一般arp高速缓存存活时间20分钟,不完整的表项设置为3分钟.因为机器的ip地址可能发生改变. 4, 5,arp一般是操作系统 ...

  9. CSS3边框与圆角

    1. CSS3 圆角 border-radius 属性 一个最多可指定四个border -*- radius属性的复合属性,这个属性允许你为元素添加圆角边框!语法:border-radius: 1-4 ...

  10. Spring3 springMVC添加注解式WebSocket

    Spring3添加注解式WebSocket 推荐升级成spring4以后,spring4已经集成WebSocket. 由于种种原因,项目开发处于快结束的阶段了,升级成spring4不想那么麻烦,但是又 ...