数字摄影测量实习报告(DOC) - 图文

更新时间:2024-01-19 19:12:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程编号: 课程性质:必修

数字摄影测量实习

学院: 测绘学院 专业: 测绘工程 地点: 校 内 班级: 201116110 组号: 姓名: 学号: 教师: 徐 芳

李 妍 申丽丽

2014年4月10日 至 2014年4月30日

目录

一、 实习目的 .............................................................................................. 错误!未定义书签。 二、 VirtuoZo实习过程 ............................................................................... 错误!未定义书签。

1、 数据准备以及初步处理 ................................................................ 错误!未定义书签。

1) 新建测区 ................................................................................ 错误!未定义书签。 2) 初步处理 ................................................................................ 错误!未定义书签。 3) 进一步处理 .............................................................................................................. 2 4) 产品生成 .................................................................................................................. 2 2、 DEM编辑 ........................................................................................................................... 2 3、 DEM拼接 ........................................................................................................................... 3 4、 图像镶嵌 .......................................................................................................................... 4 5、 IGS数字化测图 ............................................................................................................... 4 6、 空中三角测量 .................................................................................................................. 5

1) 数据准备及预处理................................................................................................... 5 2) 交互式编辑 .............................................................................................................. 6 3) 三角测量 .................................................................................................................. 7 4) DEM拼接和正射影像制作 ........................................................................................ 7

三、 GeoWay实习过程.................................................................................................................. 8

1、 交互式编辑 ...................................................................................................................... 8

1) 新建工程并设置相关参数 ....................................................................................... 8 2) 生成内图廓................................................................................................................8 3) 交互式编辑 .............................................................................................................. 9 2、 空三加密 ........................................................................................................................ 10

1) 数据准备及检查 .................................................................................................... 10 2) 控制网平差 ............................................................................................................ 11 3) 精确匹配并查看匹配结果 ..................................................................................... 11 4) 刺点 ........................................................................................................................ 11 3、 立体测图 ..................................................................................... 1错误!未定义书签。

1) 新建方案和数据准备.......................................................... 1错误!未定义书签。 2) 初步处理 ............................................................................. 1错误!未定义书签。 3) 批处理 .................................................................................................................... 13 4) 地物采集 ................................................................................................................ 13 5) DEM编辑 ................................................................................................................. 13 6) TIN网编辑 ............................................................................................................. 14 7) 质量检查 ................................................................................................................ 15

四、 编程 ...................................................................................................................................... 17

1、 空间后方交会 ................................................................................................................ 17 2、 特征匹配 ........................................................................................................................ 21 3、 同名核线提取 ................................................................................................................ 25 五、 心得体会 .............................................................................................................................. 28

一、 实习目的

通过对数字摄影测量软件的操作,熟悉数字摄影测量系统,掌握数字摄影测量软件的作业流程,加深对数字摄影测量过程的理解。通过编程实习,加深对数字摄影测量学相关方法原理的理解,提高编程动手能力。

二、 VirtuoZo实习过程

1、数据准备以及初步处理

1) 新建测区?设置测区参数,新建模型?设置模型参数,设置相机参数

?设置控制点数据?导入影像数据,至此,准备工作完成;

图1 设置测区参数 图2 设置模型参数

图3 导入控制点 图4 导入相机参数

图5 导入影像

2) 内定向?相对定向?绝对定向,至此影像定向完成;

1

图6 内定向

图7 相对定向

相对定向做完之后系统会自动进行绝对定向,我们可以到主界面查看绝对定向的结果:下图是模型157-156的绝对定向结果图:

图8 157-156绝对定向结果

3) 然后点击处理?核线重采样?影像匹配,做完这些就可以准备生成产

品;

4) 然后点击产品,可以生成需要的产品,如DEM,DOM,等高线等;

2、DEM编辑

由于生成的DEM含有房屋,树木等地物,所以并不是真正意义上的数字高程模型,而应该是DTM(数字表面模型)。如下图:

2

图9 数字表面模型

图中的红色方框所包围的可以很容易看出来是房屋而不是地形。所以需要对上上述DEM进行编辑,生成正真意义上的DEM。点击“高级?DEM编辑”,进入DEM编辑界面。

图10 编辑后的DEM

图中的红色部分就是我们编辑的范围,经过编辑后加载DEM显示立体图,可以看出其中的房屋高度已经贴合地面了。

3、DEM拼接 由于每一个DEM只是两张影像形成的,一测区有多个DEM,因此需要经

过拼接才能形成整个测区的DEM。点击“高级-->DEM拼接”弹出DEM拼接界面,加载需要拼接的DEM,用鼠标划定拼接范围,接下来就可以执行拼接。

图11图12 DEM拼接

3

4、图像镶嵌

生成整个测区的DEM后,我们就可以生成整个测区的正射影像了。依次点击“高级?正射影像制作”弹出制作界面,选定DEM以及相应的影像数据,然后执行,结果如图

图13 拼接后的正射影像

5、IGS数字化测图

点击“测图?IGS数字化测图”进入到数字化测图界面,然后依次“新建VZV矢量文件?装载影像数据”,然后通过红绿眼睛对测区进行矢量化。

4

图14 IGS数字化测图

图15 矢量图形

6、空中三角测量

1) 数据准备和图像预处理

打开VirtuozoAAT,依次“新建测区—设置参数---引入影像”

5

图16 输入影像

注意第二条航带的选项要选上相机旋转。然后进行“内定向?航带间偏移量”

图17 航带间偏移量

在图中选取航带间的同名点,系统会自动计算航带间偏移量设置好航带间偏移量之后,开始提取连接点,最后运行自动挑点程序。 2) 交互式编辑

打开交互式编辑界面,一次在每张图像上选点,保证每个蓝框周围至少有3个点就行。

图18 选点 图19 使用PATB平差

然后加入控制点,只要在测区中加入三个控制点,然后使用PATB进行平差,就可以使用“预测控制点”预测出其余的控制点的位置,然后依次选出控制点坐标。

6

图20 控制点 图21 被挑出的点

可能一次选择的点精度不够会有误差超限的点,显示在如图21中带有星号,然后对带有星号的点从新定位,这样直到没有星号的点。至此,交互式编辑完成。 3) 三角测量

打开VirtuozoNT,打开在AAT中建立的测区,自动创建测区,之就可以使用批处理功能进行自动化处理。至此,三角测量完成。

图22 批处理界面

4) DEM拼接和正射影像制作

按照前面的拼接步骤进行DEM拼接和正射影像的制作,结果如下:

图23 DEM 图24 正射影像

7

三、GeoWay实习流程

1、交互式编辑

1)新建工程,设置相关参数

(PS:对照表添加 [LAYER] [ENDSEC],然后将SYM符号库文件拷贝到C:\\WINDOWS\\GeoSymbol)

图1 参数设置界面

2)生成内图廓线

图2 生成图廓线

8

3)交互式地物编辑

1、加载栅格图层。点击栅格图层,加载tfw数据,加入栅格图层,然后生成内图廓,格网线

图3 加载栅格图层

2、勾选跨层输入编辑,设置激活图层,然后点击相应地物?设为输入地物类。

3、点、单线、双线编辑

4、点、线处理。悬挂点和伪节点处理,工具—检查—悬挂伪节点进行伪节点检测。批处理—消除悬挂点和伪节点能够消除大部分错误,不能消除的部分进行手工编辑。

图4 节点编辑后的图

5、面处理。新建房屋对照表,在拓扑构建时启用房屋对照表,然后

9

拓扑弧段预处理,最后进行拓扑构建。对于拓扑构建中被遗漏的要手工处理后再次构建

图5 拓扑构建后的图

2、GEOWAY空三加密

1)新建工程,数据准备并检查

依次点击“新建工程?选择数据所在的目录初始构网”然后点击“生成成果?生成单色点云”用mashlab打开.ply文件,查看点云和构网结果

图6 点云图 图7 网形图

10

2)控制网平差

“常规处理?光束法平差?删除残差大于域值的点?自由网平差”,重复上述步骤直到最小残差小于阈值60(PS:每次删除的点不能太多,以防删除过多正确的点)

3)精确匹配并查看匹配结果

点击“常规处理?精确匹配”,进一步匹配

图8

图9

4)刺点

常规处理光束法平差?常规处理?绝对定向(GPS)?刺点

11

图10 刺点界面

5)空三结果

图11

3、立体测图(无人机)

1)新建方案和数据准备

影像管理?加载影 模型管理?新建模型 控制点编辑?导入控制点 像点导入?导入像点

外方为元素导入?导入外方位元素 2)初步处理

内定向—相对定向—绝对定向—核线重采样

12

图12 相对定向

3)批处理

图13

4)地物采集

新建加工工程,然后依次进行高程点、道路、房屋、比高点、等高线的采集

图14 地物采集结果

5)DEM编辑

1、点线处理 采集特征线处理—选择特征线处理

2、面处理—自适应内插,量测点内插局部置平、水域处理

13

图15 DEM编辑前 图16 DEM编辑后

6)TIN网处理

图17 编辑前 图18 编辑后

14

图19 编辑后

7)质量检查

1、设置质检方案—制作方案—加入工作方案

图20 检查报告 图21 方案设置

2、新建检查任务,指定目录到数据所在目录。然后自动检查错误并查看错误,然后对矢量图进行修改

15

图22 编辑前 图23 编辑后

图24 编辑前 图25 编辑后

16

四、编程内容

1、单像空间后方交会

#include#include \ #include#include #include #include#include using namespace std;

HFJHDialog::HFJHDialog(QWidget *parent) : QDialog(parent),

ui(new Ui::HFJHDialog) {

ui->setupUi( char *title= this\空间后方交会); \; QString qtitle = QString::fromLocal8Bit(title); setWindowTitle(qtitle); ui->textBrowser->setText(\); fx=4547.99665; //焦距 单位pixel fy=4547.87373; x0=47.48571; //内方位元素 pixel y0=12.02756; k1=-5.00793e-009; k2=1.83462e-016; //畸变参数

p1=-2.24419e-008; p2=1.76820e-008; Xs0=4300.0; Ys0=-150.0; Zs0=-300.0; //初始值

phi0=0.0; omega0=0.0; kappa0=0.0; ////单位单位mmrad }

HFJHDialog::~HFJHDialog() {

}

delete ui; //读取像点坐标

int{

HFJHDialog::readxy(string path) int index = 1;

ifstream fil; //path =\我的课程\\\\数字摄影测量影像数据\\\\后方交会\\\\像点坐标.txt\ fil.open(path); { if(!fil) char *log = \打开像点文件失败<<<\; ui->textBrowser->append(QString::fromLocal8Bit(log)); }

return -1; xy tmp;

{

while(!fil.eof()) fil>>tmp.index>>tmp.x>>tmp.y; y:%3\ ).arg(index).arg(tmp.x).arg(tmp.y)); ui->textBrowser->append(QString(\ pic.push_back(tmp); index++;

}

fil.close(); }

return 0; //int读取物方点坐标

{

HFJHDialog::readXYZ(string path) int index = 1;

17

x:%2

ifstream fil; fil.open(path); { if(!fil) char *log = \打开控制点文件失败<<<\; ui->textBrowser->append(QString::fromLocal8Bit(log)); }

return -1; XYZ tmp;

string head;

for(int i = 0; i < 4; ++i) {

fil>>head; }

{

while(!fil.eof()) fil>>tmp.index>>tmp.X>>tmp.Y>>tmp.Z; Z:%3\ ui->textBrowser->append(QString(\ index++;

).arg(index).arg(tmp.X).arg(tmp.Y).arg(tmp.Z)); X:%2 obj.push_back(tmp); }

fil.close(); }

return 0; //读取相机参数文件

int{ HFJHDialog::readcamera(string path) int index = 1;

ifstream fil; //path =\我的课程\\\\数字摄影测量影像数据\\\\后方交会\\\\像点坐标.txt\ fil.open(path); { if(!fil) char *log = \打开相机文件失败<<<\; }

returnui->textBrowser->append(QString::fromLocal8Bit(log)); -1; fil.close(); }

return 0; //void空间后方交会算法主体函数 {

HFJHDialog::HFJH() // double结果值

double Xs=Xs0, phi=phi0, Ys=Ys0, Zs=Zs0; omega=omega0, kappa=kappa0; //定义 //定义 double x, y, X, Y, Z; //定义X,Y,Z doubledouble a1,a2,a3,b1,b2,b3,c1,c2,c3; X_,Y_,Z_;

double double a11,a12,a13,a14,a15,a16; double a21,a22,a23,a24,a25,a26; lx,ly;

cv::Mat A, L, dX; double r_r, dx, dy;

//迭代终止阈值

//, A0, L0, A1; double e = 1.0 / 206265; //double单位权中误差 m0;

int //double求取主点坐标 index = 1; W = 5344.0;

x0 = W / 2 + x0; double H = 4008.0; y0 = H / 2 - y0; {

do for (size_t i = 0; i != pic.size(); ++i) {

18

Y:%3

x = pic[i].x; y = pic[i].y; X = 0; Y = 0; Z = 0;

for (size_t j = 0; j < obj.size(); j++) {

if (obj[j].index == pic[i].index) {

X = obj[j].X; Y = obj[j].Y; Z = obj[j].Z; break; } }

if (abs(x) < 1) { char *arg1 = \像点\; char *arg2 = \没有找到对应的控制点\; ui->textBrowser->append(QString(\).arg(QString::fromLocal8Bit(arg1)).arg(pic[i].index).arg(QString::fromLocal8Bit(arg2))); continue; }

//求观测值的改正

r_r = (x - x0)*(x - x0) + (y - y0)*(y - y0);

dx = (x - x0)*(k1*r_r + k2*r_r*r_r) + p1*(r_r + 2 * (x - x0)*(x - x0)) - 2 * p2*(x - x0)*(y - y0);

dy = -(y - y0)*(k1*r_r + k2*r_r*r_r) + p2*(r_r + 2 * (y - y0)*(y - y0)) - 2 * p1*(x - x0)*(y - y0);

//经过畸变改正后的像点坐标观测值 x = (x - x0) - dx; y = -(y - y0) - dy; //求矩阵R各元素的值

a1 = cos(phi)*cos(kappa) - sin(phi)*sin(omega)*sin(kappa); a2 = -cos(phi)*sin(kappa) - sin(phi)*sin(omega)*cos(kappa); a3 = -sin(phi)*cos(omega); b1 = cos(omega)*sin(kappa); b2 = cos(omega)*cos(kappa); b3 = -sin(omega);

c1 = sin(phi)*cos(kappa) + cos(phi)*sin(omega)*sin(kappa); c2 = -sin(phi)*sin(kappa) + cos(phi)*sin(omega)*cos(kappa); c3 = cos(phi)*cos(omega); //求X_,Y_,Z_

X_ = a1*(X - Xs) + b1*(Y - Ys) + c1*(Z - Zs); Y_ = a2*(X - Xs) + b2*(Y - Ys) + c2*(Z - Zs); Z_ = a3*(X - Xs) + b3*(Y - Ys) + c3*(Z - Zs); //求x,y的近似值

double x_ = -fx*X_ / Z_; double y_ = -fy*Y_ / Z_; //求矩阵L各元素的值 lx = x - x_; ly = y - y_;

//求矩阵A各元素的值

a11 = 1 / Z_*(a1*fx + a3*x); a12 = 1 / Z_*(b1*fx + b3*x); a13 = 1 / Z_*(c1*fx + c3*x); a21 = 1 / Z_*(a2*fy + a3*y); a22 = 1 / Z_*(b2*fy + b3*y); a23 = 1 / Z_*(c2*fy + c3*y);

a14 = y*sin(omega) - (x / fx*(x*cos(kappa) - y*sin(kappa)) + fx*cos(kappa))*cos(omega);

a15 = -fx*sin(kappa) - x / fx*(x*sin(kappa) + y*cos(kappa)); a16 = y;

a24 = -x*sin(omega) - (y / fy*(x*cos(kappa) - y*sin(kappa)) - fy*sin(kappa))*cos(omega);

a25 = -fy*cos(kappa) - y / fy*(x*sin(kappa) + y*cos(kappa)); a26 = -x; //合成矩阵

double a[12] = { a11, a12, a13, a14, a15, a16, a21, a22, a23, a24, a25,

19

a26 };

double l[2] = { lx, ly };

cv::Mat Ai(2, 6, CV_64FC1, a); cv::Mat Li(2, 1, CV_64FC1, l); A.push_back(Ai); L.push_back(Li); }

//计算

dX = (A.t() * A).inv() * A.t() * L; Xs+=dX.at(0,0); Ys+=dX.at(1,0); Zs+=dX.at(2,0); phi+=dX.at(3,0); omega+=dX.at(4,0); kappa+=dX.at(5,0); ui->textBrowser->append(QString(\).arg(index).arg(dX.at(0)).arg(dX.at(1)).arg(dX.at(2)).arg(dX.at(3)).arg(dX.at(4)).arg(dX.at(5))); index++; cv::Mat M0 = (A*dX - L).t()*(A*dX - L); m0 = sqrt(M0.at(0) / (2 * pic.size() - 6)); A.release(); L.release();

if (index > 100) break; }

while(fabs(dX.at(0))>0.001||fabs(dX.at(3))>e); ui->textBrowser->append(QString(\)); ui->textBrowser->append(QString(\ Ys:%2 Zs:%3 phi:%4 omega:%5 kappa:%6\).arg(Xs).arg(Ys).arg(Zs).arg(phi).arg(omega).arg(kappa)); char *log = \单位权中误差:\; ui->textBrowser->append(QString(\).arg(QString::fromLocal8Bit(log)).arg(m0)); }

void HFJHDialog::on_pushButton_clicked() { QString qpath = QFileDialog::getOpenFileName(this); string path = qpath.toLocal8Bit(); if(readxy(path) == -1) { char *log =\读取像点坐标错误XXXXXX\; ui->textBrowser->append(QString::fromLocal8Bit(log)); return; } char *log = \读取像点坐标结束OOOOOO\; ui->textBrowser->append(QString::fromLocal8Bit(log)); ui->lineEdit->setText(qpath); }

void HFJHDialog::on_pushButton_2_clicked() { QString qpath = QFileDialog::getOpenFileName(this); string path = qpath.toLocal8Bit(); if(readXYZ(path) == -1) { char *log = \读取控制点坐标错误XXXXXX\; ui->textBrowser->append(QString::fromLocal8Bit(log)); return; } char *log = \读取控制点坐标结束OOOOOO\; ui->textBrowser->append(QString::fromLocal8Bit(log)); ui->lineEdit_2->setText(qpath); }

void HFJHDialog::on_pushButton_4_clicked() { HFJH(); }

void HFJHDialog::on_pushButton_5_clicked() { HFJHDialog::close();

20

}

图1 控件后方交会

2、特征匹配

#include \ #include #include #include using namespace std; using namespace cv; //构造函数

Mmatch::Mmatch(int length, int flag) { Mlength = length; Mflag = flag; match(); }

//构建子窗体

void Mmatch::findsubwin(Mat &src, Mat &dst, int i, int j, int length) { dst = Mat::zeros(length, length, CV_8UC1); int xl = i - length / 2; int yl = j - length / 2; int xr = i + length / 2; int yr = j + length / 2; int xdl = 0; int ydl = 0; int xdr = length - 1; int ydr = length - 1; if (xl<0) { xdl = 0 - xl; xl = 0; } if (yl < 0) { ydl = 0 - yl; yl = 0; } if (xr >= src.cols) {

21

xdr = (dst.cols -1)- (xr - (src.cols-1)); xr = src.cols - 1; } if (yr >= src.rows) { ydr = (dst.rows-1) - (yr - (src.rows-1)); yr = src.rows - 1; } Mat sROI = src(Range(yl+1, yr+1), Range(xl+1, xr+1)); sROI.copyTo(dst(Range(ydl+1, ydr+1), Range(xdl+1, xdr+1))); }

//匹配算法主体函数 int Mmatch::match() { string path1 = \我的课程\\\\数字摄影测量影像数据\\\\匹配\\\\1BAK.bmp\; string path2 = \我的课程\\\\数字摄影测量影像数据\\\\匹配\\\\2BAK.bmp\; string path = \我的课程\\\\数字摄影测量影像数据\\\\匹配\\\\1BAK_points.txt\; ifstream fil; vector pointssrc; fil.open(path); if (!fil) { cout << \ << endl; return -1; } int index; point pt; while (!fil.eof()) { fil >> index >> pt.x >> pt.y; pointssrc.push_back(pt); } Mat src1 = imread(path1,CV_LOAD_IMAGE_GRAYSCALE); Mat src2 = imread(path2,CV_LOAD_IMAGE_GRAYSCALE); if (src1.empty() || src2.empty()) { cout << \ << endl; return -1; } vector pointsdst; Mat subwinsrc, subwindst; for (int i = 0; i

22

} imshow(\, dst1); imshow(\, dst2); waitKey(); return 0; }

//寻找同名点函数

void Mmatch::findsamename(Mat &src, Mat &subwin, point &dst) { Mat subwind; int length = subwin.cols; int helf_length = length / 2; int flag = Mflag; float relate = 0; for (int i = 0; i < src.cols; ++i) { for (int j = 0; j < src.rows; ++j) { findsubwin(src, subwind, i, j, length); if (i == helf_length && j == helf_length) { relate = compare(subwin, subwind, flag); dst.x = i; dst.y = j; } float tmp = compare(subwin, subwind, flag); if (tmp > relate) { relate = tmp; dst.x = i; dst.y = j; } } } }

//特征向量比较函数

float Mmatch::compare(Mat &subwin, Mat &subwind,int flag) { float sum = 0.0; float avg1 = 0.0, avg2 = 0.0; float sdv1 = 0.0, sdv2 = 0.0; int nr = subwin.rows; int nc = subwin.cols; if(subwin.isContinuous()&&subwind.isContinuous()) { nc = nc*nr; nr = 1; } switch (flag) { case 1: //相关函数法 for (int i = 0; i < nr; ++i) { uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for (int j = 0; j < nc; j++) { sum += (float)(*(subwin_ptr+j)* (*(subwind_ptr+j))); } } return sum; case 2://协方差函数法 for (int i = 0; i < nr; ++i) { uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for (int j = 0; j < nc; j++) { avg1 += *(subwin_ptr+j);

23

} avg2 += *(subwind_ptr+j); } avg1 = avg1 / (subwin.rows*subwin.cols); avg2 = avg2 / (subwind.rows*subwind.cols); for (int i = 0; i < nr; ++i) { uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for{ (int j = 0; j < nc; j++) sum += (*(subwin_ptr+j)-avg1)*(*(subwind_ptr+j) - avg2); } } casereturn 3:for// (相关系数法 sum; int i = 0; i < nr; ++i) { uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for { (int j = 0; j < nc; j++) avg1 += *(subwin_ptr+j); } } avg2 += *(subwind_ptr+j); avg1 = avg1 / (subwin.rows*subwin.cols); avg2 = avg2 / (subwind.rows*subwind.cols); for (int i = 0; i < nr; ++i) { uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for (int j = 0; j < nc; j++) { sum += (*(subwin_ptr+j)-avg1)*(*(subwind_ptr+j) - avg2); } } for (int i = 0; i < nr; ++i) { uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for (int { j = 0; j < nc; j++) sdv1 += (*(subwin_ptr+j)-avg1)*(*(subwin_ptr+j) - avg1); } } sdv2 += (*(subwind_ptr+j)-avg2)*(*(subwind_ptr+j) - avg2); sum = sum / sqrtf(sdv1*sdv2); casereturn 4://差平方和法 sum; for ( { int i = 0; i < nr; ++i) uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for{ (int j = 0; j < nc; j++) ( sum float )(*(subwin_ptr+j)-*(subwind_ptr+j))*(*(subwin_ptr+j)-*(subwind_ptr+j)); } } casereturn 5://差绝对值和法 -sum; for (int i = 0; i < nr; ++i) { uchar *subwin_ptr = subwin.ptr(i); uchar *subwind_ptr= subwind.ptr(i); for{ (int j = 0; j < nc; j++) sum += (float)abs(*(subwin_ptr+j) - *(subwind_ptr+j));

24

+= }

} } return -sum; default: break; }

return sum;

图2 相关函数 图3 协方差

图4 相关系数 图5 差平方和

图6 差绝对值

3、同名核线提取

#include \

#include #include #include #include #include #include using namespace std; //构造函数

HXDialog::HXDialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); }

HXDialog::~HXDialog() { }

void HXDialog::on_pushButton_clicked() { path1 = QFileDialog::getOpenFileName(this);

25

ui->lineEdit->setText(path1); }

void HXDialog::on_pushButton_2_clicked() { path2= QFileDialog::getOpenFileName(this); ui->lineEdit_2->setText(path2); }

void HXDialog::on_pushButton_3_clicked() { tpath1= QFileDialog::getOpenFileName(this); ui->lineEdit_3->setText(tpath1); }

void HXDialog::on_pushButton_4_clicked() { tpath2= QFileDialog::getOpenFileName(this); ui->lineEdit_4->setText(tpath2); }

//读取同名点数据

int HXDialog::readxy(string p1,string p2) { int index = 1; ifstream fil; xy tmp; int head; //读取图像1的像点坐标 fil.open(p1); if (!fil) { cout << \ << endl; return -1; } fil >> head; while (!fil.eof()) { fil >> tmp.index >> tmp.x >> tmp.y; cout << \ << index << \ << tmp.index << \ << tmp.x << \ << tmp.y << endl; index++; pic1.push_back(tmp); } fil.clear(); fil.close(); //读取图像2的像点坐标 index = 1; fil.open(p2); if (!fil) { cout << \ << endl; return -1; } fil >> head; while (!fil.eof()) { fil >> tmp.index >> tmp.x >> tmp.y; cout << \ << index << \ << tmp.index << \ << tmp.x << \ << tmp.y << endl; index++; pic2.push_back(tmp); } cout << \ << endl; fil.close(); cout << \ << endl; return 0; }

class findxy {

public: findxy(int index){ ind = index; } int ind;

26

bool operator () (HXDialog::xy &pt){ return ind == pt.index; } };

//同名核线算法主函数 void HXDialog::HX() { string p1 = tpath1.toLocal8Bit(); string p2 = tpath2.toLocal8Bit(); //读取同名点坐标 readxy(p1,p2); //初始值 p1 = path1.toLocal8Bit(); p2 = path2.toLocal8Bit(); cv::Mat img1 = cv::imread(p1); cv::Mat img2 = cv::imread(p2); cv::Mat B; cv::Mat L; if (img1.empty() || img2.empty()) { cout << \ << endl; return; } for (int i = 0; i < pic1.size(); ++i) { double x = pic1[i].x; double y = pic1[i].y; double x_ = pic2[i].x; double y_ = pic2[i].y; cv::Mat tmpB(cv::Size(8, 1), CV_64FC1); tmpB.at(0) = 1.0; tmpB.at(1) = x; tmpB.at(2) = y; tmpB.at(3) = x_; tmpB.at(4) = x_*x; tmpB.at(5) = x*y_; tmpB.at(6) = y*x_; tmpB.at(7) = y*y_; cout << tmpB.at(0) << \\ << tmpB.at(1) << \\ << tmpB.at(2) << \ << tmpB.at(3) << \ << tmpB.at(4) << \ << tmpB.at(5) << \ << tmpB.at(6) << \ << tmpB.at(7) << endl; B.push_back(tmpB); L.push_back(y - y_); } cv::Mat X = (B.t()*B).inv() * B.t() *L; double L1 = X.at(0); double L2 = X.at(1); double L3 = X.at(2); double L4 = X.at(3); double L5 = X.at(4); double L6 = X.at(5); double L7 = X.at(6); double L8 = X.at(7); vector::iterator itr1 = find_if(pic1.begin(), pic1.end(), findxy(4507)); vector::iterator itr2 = find_if(pic2.begin(), pic2.end(), findxy(4507)); double x = (*itr1).x; double y = (*itr1).y; double x0 = 0; double x1 = img1.cols; double x_0 = 0; double x_1 = img2.cols; double y_0 = ((1 - L3)*y - L1 - L2*x - L4*x_0 - L5*x*x_0 - L7*y*x_0) / (1 + L6 * x + L8*y); double y_1 = ((1 - L3)*y - L1 - L2*x - L4*x_1 - L5*x*x_1 - L7*y*x_1) / (1 + L6 * x + L8*y); double y0 = (y_0 + L1 + L2*x0 + L4*x_0 + L5*x1*x_0 + L6*x*y_0) / (1 - L3 - L7*x_0 - L8*y_0); double y1 = (y_0 + L1 + L2*x1 + L4*x_0 + L5*x1*x_0 + L6*x*y_0) / (1 - L3 - L7*x_0

27

- L8*y_0); cv::line(img1, cv::Point(x0, y0), cv::Point(x1, y1), CV_RGB(255,0,0), 5); cv::line(img2, cv::Point(x_0, y_0), cv::Point(x_1, y_1), CV_RGB(255, 0, 0), 5); cv::circle(img1, cv::Point(x, y), 10, CV_RGB(0, 255, 0), 5); cv::circle(img2, cv::Point((*itr2).x, (*itr2).y), 10, CV_RGB(0, 255, 0), 5); cv::resize(img1, dst1, cv::Size(1000, 1000 * img1.rows / img1.cols)); cv::resize(img2, dst2, cv::Size(1000, 1000 * img2.rows / img2.cols)); }

void HXDialog::on_okButton_clicked() { HX(); emit signelHX(dst1,dst2); }

void HXDialog::on_cancelButton_clicked() { }

图7 左核线 图8 右核线

五、心得体会

通过这次的实习,我学习了数字摄影测量系统VirtuoZo和GeoWay的操作方法,了解了通过这两套系统生成4D产品的生产流程。在操作过程中,结合老师的讲解,对于以前课堂上学过的有关知识也进行了回顾。同时我体会到了VirtuoZo和GeoWay这两款数字摄影测量系统的强大功能,操作的步骤也比较复杂,但是只要熟练掌握,就能够快速生成产品。

这次的数字摄影测量系统操作过程中也遇到了这样那样的问题,比如说内定向失败、相对定向失败等,最后通过问老师同学都得到了解决。大部分的问题归结起来都是由于没有严格按照流程来做,比如说漏掉哪个步骤或者哪个参数没有设置等等。通过老师的讲解,也学到了很多在实际生产中有用的方法。

通过这次的编程实习,我回顾了学过的相关摄影测量原理,并把他们通过程序实现了。在这过程中提高了自己的编程能力以及加深对于相关原理的理解。同时也认识到了一些实际的问题。比如说在做匹配的时候,五种方法得到的结果区别十分大,相关函数法基本不能够成功匹配。

28

这次实习我感受到,即使是在计算机技术如此发达的时代,即使有如此完整的数字摄影测量系统,但是整个生产过程也离不开人的干预。而且人的干预直接影响了得到的结果。所以我们学习数字摄影测量具有十分重要的意义,一方面我们只有理解了相关的原理,才能写出相应的算法,以推动数字摄影测量系统的发展,另一方面,我们只有了解了相关知识,才能在操作中准确的进行干预,得到最好的结果。

29

这次实习我感受到,即使是在计算机技术如此发达的时代,即使有如此完整的数字摄影测量系统,但是整个生产过程也离不开人的干预。而且人的干预直接影响了得到的结果。所以我们学习数字摄影测量具有十分重要的意义,一方面我们只有理解了相关的原理,才能写出相应的算法,以推动数字摄影测量系统的发展,另一方面,我们只有了解了相关知识,才能在操作中准确的进行干预,得到最好的结果。

29

本文来源:https://www.bwwdw.com/article/a9wo.html

Top