算了半天一直在思考如何快速把矩阵算出来,网上基本都是在说边长为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. 新手怎么学JS?JavaScript基础入门

    新手应该怎么学习JS?JavaScript入门 - 01 准备工作 在正式的学习JavaScript之前,我们先来学习一些小工具,帮助我们更好的学习和理解后面的内容. js代码位置 首先是如何编写Ja ...

  2. 【python3两小时根本不够】入门笔记04:线程+Lock安全同步

    有了简单爬虫,但是效率实在是太慢,于是决定启用线程进行爬取数据 但是对于临界资源的定义不好把握,思路如下: 1.定义队列(Queue的数据结构,List也可,安全性待考究) demo:https:// ...

  3. MySql Lock wait timeout exceeded该如何处理? (转载)

    转载 https://ningyu1.github.io/site/post/75-mysql-lock-wait-timeout-exceeded/ 这个问题我相信大家对它并不陌生,但是有很多人对它 ...

  4. SpringMVC_Two

    SpringMVC_Two 响应数据和结果视图 创建工厂 导坐标: </load-on-startup> </servlet> <servlet-mapping> ...

  5. 5分钟快速部署ownCloud私有云盘存储系统

    ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可以像 Dropbox 那样实现文件跨平台同步.共享.版本控制.团队协作等等.o ...

  6. java-IO各个区别

    BIO:JDK1.4以前用的都是BIO,阻塞IO. 阻塞到我们的读写方法.BIO,如果有一台服务器,能承受简单的客户端请求,那么使用io和net中的同步.阻塞式API应该是可以实现了.但是为了一个用户 ...

  7. 设计模式-工厂方法模式(FactoryMethod)

    工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...

  8. 玲珑OJ 1082:XJT Loves Boggle(爆搜)

    http://www.ifrog.cc/acm/problem/1082 题意:给出的单词要在3*3矩阵里面相邻连续(相邻包括对角),如果不行就输出0,如果可行就输出对应长度的分数. 思路:爆搜,但是 ...

  9. 产品经理人的持续交付和DevOps实践

    如果你正处于下列情形中 ,那这篇文章是为你准备的: 你目前身处技术行业,你是产品经理,并且,你明白特性分支是什么,CD代表什么,DevOps文化是什么样子的. 或者,你已经在实施敏捷,团队每周都会与您 ...

  10. [原创]Greenplum数据库集群实践

    GreenPlum实践 ============================================== 目录: 一.安装环境准备 二.GP数据库安装 三.集群添加standby节点 四. ...