Compare commits
95 Commits
add-licens
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
481c2dc02f | ||
|
|
df3116796d | ||
|
|
307a9b698f | ||
|
|
71c25250b8 | ||
|
|
4d1dfad8e8 | ||
|
|
a69674c4e9 | ||
|
|
2040310be4 | ||
|
|
20da68dd06 | ||
|
|
39c4d1fecc | ||
|
|
6d18991161 | ||
|
|
2e3d784592 | ||
|
|
a0da866521 | ||
|
|
869159d1bd | ||
|
|
89e784e170 | ||
|
|
c1d6a45d5c | ||
|
|
66ad3f48a3 | ||
|
|
202d2431a3 | ||
|
|
8df95b72e5 | ||
|
|
636a0b82b7 | ||
|
|
f5cdd8d00a | ||
|
|
ec73fb13b0 | ||
|
|
d55c8aa732 | ||
|
|
ffc14d20af | ||
|
|
fd8b7e5dd2 | ||
|
|
e1c81855ab | ||
|
|
0e36e98dfa | ||
|
|
41a21c706e | ||
|
|
5a12c3595a | ||
|
|
7eadf91b39 | ||
|
|
fc606e44ab | ||
|
|
31a4864120 | ||
|
|
876855cb72 | ||
|
|
5faaa21681 | ||
|
|
da33b22f03 | ||
|
|
e27ed0b91e | ||
|
|
d249a0e2c9 | ||
|
|
ac9c729f67 | ||
|
|
8f108185b4 | ||
|
|
0ef94cb8de | ||
|
|
872ae3e32e | ||
|
|
1e63d727e3 | ||
|
|
c2892b3096 | ||
|
|
82611d66ce | ||
|
|
d04debaabc | ||
|
|
e27c2ca610 | ||
|
|
d11d8010fa | ||
|
|
1759eae042 | ||
|
|
65ca22facd | ||
|
|
a9d3692ffa | ||
|
|
6b8a394ed8 | ||
|
|
b5a85d3a57 | ||
|
|
fca752b2d8 | ||
|
|
92e8b436df | ||
|
|
2dc03b398f | ||
|
|
17c3394f67 | ||
|
|
b584bada6d | ||
|
|
c2b74bf002 | ||
|
|
e17d542eac | ||
|
|
217b2ab771 | ||
|
|
edd34d188f | ||
|
|
875b53ad6f | ||
|
|
3e48fc09af | ||
|
|
de7a9e9dcf | ||
|
|
f76aad20c1 | ||
|
|
235dd6aaf3 | ||
|
|
ccec968f0f | ||
|
|
71fdb98232 | ||
|
|
49ca58d0e6 | ||
|
|
7e2e8ea68e | ||
|
|
2f5e90d86c | ||
|
|
2a6e210e10 | ||
|
|
a9fd8eea7c | ||
|
|
ab03e7f911 | ||
|
|
5a48e4ceaa | ||
|
|
7ec1d8495d | ||
|
|
601a0a3598 | ||
|
|
72243b1d5d | ||
|
|
db133123df | ||
|
|
a0caac5e8e | ||
|
|
05742f1b36 | ||
|
|
6d76d9c5e5 | ||
|
|
6e7d27947c | ||
|
|
8e24776867 | ||
|
|
0bea55c67d | ||
|
|
5faeff5be1 | ||
|
|
5c923ee2d4 | ||
|
|
dab2be5de2 | ||
|
|
bde3ce178e | ||
|
|
3a212d0b8e | ||
|
|
b060ed5f2b | ||
|
|
ba4ca7903d | ||
|
|
c0e7dedf77 | ||
|
|
830e5c5140 | ||
|
|
1b1d2308bc | ||
|
|
22ad0727c4 |
147
.gitignore
vendored
@@ -1,7 +1,10 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
@@ -10,6 +13,9 @@
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
@@ -17,42 +23,62 @@
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# DNX
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
@@ -62,6 +88,7 @@ artifacts/
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
@@ -90,6 +117,9 @@ ipch/
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
@@ -101,15 +131,23 @@ _ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*[.json, .xml, .info]
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
@@ -141,9 +179,9 @@ publish/
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
#*.pubxml
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
@@ -153,13 +191,15 @@ PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignoreable files
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
@@ -176,12 +216,15 @@ AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
@@ -192,9 +235,12 @@ ClientBin/
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
node_modules/
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
@@ -209,15 +255,22 @@ _UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
@@ -227,6 +280,7 @@ FakesAssemblies/
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
@@ -234,6 +288,9 @@ FakesAssemblies/
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
@@ -249,13 +306,59 @@ paket-files/
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush
|
||||
.cr/
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# 忽略指定文件夹
|
||||
.vs/
|
||||
Lib/
|
||||
21
Classes/AboutDialog.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "AboutDialog.h"
|
||||
#include <QtWidgets/QDialog>
|
||||
#include <QtWidgets/QtWidgets>
|
||||
|
||||
AboutDialog::AboutDialog(QWidget *parent)
|
||||
: QDialog(parent), ui(new Ui::AboutDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
ui->textEdit->setReadOnly(true);
|
||||
auto w = ui->label->width();
|
||||
auto h = ui->label->height();
|
||||
ui->label->setPixmap(QPixmap(":/Reconstruction/image/common/logo.png").scaled(w, h, Qt::KeepAspectRatio));
|
||||
}
|
||||
|
||||
AboutDialog::~AboutDialog()
|
||||
{
|
||||
}
|
||||
|
||||
void AboutDialog::on_pushButton_clicked() {
|
||||
QDialog::accept();
|
||||
}
|
||||
23
Classes/AboutDialog.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#pragma once
|
||||
|
||||
#include "ui_aboutdialog.h"
|
||||
#include <QtWidgets/QDialog>
|
||||
|
||||
namespace Ui {
|
||||
class AboutDialog;
|
||||
}
|
||||
|
||||
class AboutDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AboutDialog(QWidget *parent = Q_NULLPTR);
|
||||
~AboutDialog();
|
||||
|
||||
public slots:
|
||||
void on_pushButton_clicked();
|
||||
|
||||
private:
|
||||
Ui::AboutDialog *ui;
|
||||
};
|
||||
@@ -16,11 +16,11 @@ Calibrator::~Calibrator()
|
||||
|
||||
}
|
||||
|
||||
void Calibrator::addFrameSequence(std::vector<cv::Mat> &frameSeq)
|
||||
void Calibrator::addFrameSequence(std::vector<Mat> &frameSeq)
|
||||
{
|
||||
int n = frameSeqs.size();
|
||||
frameSeqs.resize(n+1);
|
||||
std::vector<cv::Mat> &frame = frameSeqs[n];
|
||||
std::vector<Mat> &frame = frameSeqs[n];
|
||||
for(int i = 0; i < frameSeq.size(); i++)
|
||||
{
|
||||
frame.push_back(frameSeq[i]);
|
||||
@@ -38,17 +38,17 @@ void Calibrator::reset()
|
||||
|
||||
void Calibrator::setBoardRows(int rows) {
|
||||
board_rows = rows;
|
||||
board_size = cv::Size(board_rows, board_cols);
|
||||
board_size = Size(board_rows, board_cols);
|
||||
}
|
||||
|
||||
void Calibrator::setBoardCols(int cols) {
|
||||
board_cols = cols;
|
||||
board_size = cv::Size(board_rows, board_cols);
|
||||
board_size = Size(board_rows, board_cols);
|
||||
}
|
||||
|
||||
void Calibrator::setCornerSize(double cornerSize) {
|
||||
dot_dis = cornerSize;
|
||||
corner_size = cv::Size2f(cornerSize, cornerSize);
|
||||
corner_size = Size2f(cornerSize, cornerSize);
|
||||
}
|
||||
|
||||
void Calibrator::setDotDiameter(double dotDiameter) {
|
||||
@@ -66,7 +66,7 @@ CalibrationData* Calibrator::calibrate()
|
||||
// detect corners ////////////////////////////////////
|
||||
for(int i = 0; i < frameSeqs.size(); i++)
|
||||
{
|
||||
std::vector<cv::Point2f> corners = extract_board_corners( frameSeqs[i][0] );
|
||||
std::vector<Point2f> corners = extract_board_corners( frameSeqs[i][0] );
|
||||
board_corners.push_back(corners);
|
||||
// std::cout<<i<<" corners: "<<corners.size()<<std::endl;
|
||||
// for(int j = 0; j < corners.size(); j++) {
|
||||
@@ -75,12 +75,12 @@ CalibrationData* Calibrator::calibrate()
|
||||
}
|
||||
|
||||
// collect projector correspondences
|
||||
std::vector<cv::Point2f> pcorners;
|
||||
std::vector<Point2f> pcorners;
|
||||
for(int i = 0; i < frameSeqs.size(); i++)
|
||||
{
|
||||
std::vector<cv::Point2f> const& corners = board_corners[i];
|
||||
cv::Mat pattern_image;
|
||||
cv::Mat min_max_image;
|
||||
std::vector<Point2f> const& corners = board_corners[i];
|
||||
Mat pattern_image;
|
||||
Mat min_max_image;
|
||||
if(corners.size()==0)
|
||||
{
|
||||
projector_corners.push_back(pcorners);
|
||||
@@ -95,25 +95,25 @@ CalibrationData* Calibrator::calibrate()
|
||||
}
|
||||
|
||||
pattern_list.push_back(pattern_image);
|
||||
for (std::vector<cv::Point2f>::const_iterator iter=corners.begin(); iter!=corners.end(); iter++)
|
||||
for (std::vector<Point2f>::const_iterator iter=corners.begin(); iter!=corners.end(); iter++)
|
||||
{
|
||||
const cv::Point2f & p = *iter;
|
||||
cv::Point2f q;
|
||||
const Point2f & p = *iter;
|
||||
Point2f q;
|
||||
//find an homography around p
|
||||
unsigned WINDOW_SIZE = 30;
|
||||
std::vector<cv::Point2f> img_points , proj_points;
|
||||
std::vector<Point2f> img_points , proj_points;
|
||||
if (p.x>WINDOW_SIZE && p.y>WINDOW_SIZE && p.x+WINDOW_SIZE<pattern_image.cols && p.y+WINDOW_SIZE<pattern_image.rows)
|
||||
{
|
||||
for (unsigned h=p.y-WINDOW_SIZE; h<p.y+WINDOW_SIZE; h++)
|
||||
{
|
||||
register const cv::Vec2f * row = pattern_image.ptr<cv::Vec2f>(h);
|
||||
register const cv::Vec2b * min_max_row = min_max_image.ptr<cv::Vec2b>(h);
|
||||
//cv::Vec2f * out_row = out_pattern_image.ptr<cv::Vec2f>(h);
|
||||
register const Vec2f * row = pattern_image.ptr<Vec2f>(h);
|
||||
register const Vec2b * min_max_row = min_max_image.ptr<Vec2b>(h);
|
||||
//Vec2f * out_row = out_pattern_image.ptr<Vec2f>(h);
|
||||
for (unsigned w=p.x-WINDOW_SIZE; w<p.x+WINDOW_SIZE; w++)
|
||||
{
|
||||
const cv::Vec2f & pattern = row[w];
|
||||
const cv::Vec2b & min_max = min_max_row[w];
|
||||
//cv::Vec2f & out_pattern = out_row[w];
|
||||
const Vec2f & pattern = row[w];
|
||||
const Vec2b & min_max = min_max_row[w];
|
||||
//Vec2f & out_pattern = out_row[w];
|
||||
if (std::isnan(pattern[0])>0 || std::isnan(pattern[1])>0)
|
||||
{
|
||||
continue;
|
||||
@@ -123,16 +123,16 @@ CalibrationData* Calibrator::calibrate()
|
||||
continue;
|
||||
}
|
||||
|
||||
img_points.push_back(cv::Point2f(w, h));
|
||||
proj_points.push_back(cv::Point2f(pattern));
|
||||
img_points.push_back(Point2f(w, h));
|
||||
proj_points.push_back(Point2f(pattern));
|
||||
|
||||
//out_pattern = pattern;
|
||||
}
|
||||
}
|
||||
cv::Mat H = cv::findHomography(img_points , proj_points, cv::RANSAC);
|
||||
Mat H = findHomography(img_points , proj_points, RANSAC);
|
||||
// std::cout << " H:\n" << H << std::endl;
|
||||
cv::Point3d Q = cv::Point3d(cv::Mat(H*cv::Mat(cv::Point3d(p.x , p.y , 1.0))));
|
||||
q = cv::Point2f(Q.x/Q.z ,Q.y/Q.z);
|
||||
Point3d Q = Point3d(Mat(H*Mat(Point3d(p.x , p.y , 1.0))));
|
||||
q = Point2f(Q.x/Q.z ,Q.y/Q.z);
|
||||
// jiuzheng
|
||||
// q.y += 118;
|
||||
pcorners.push_back(q);
|
||||
@@ -159,15 +159,15 @@ CalibrationData* Calibrator::calibrate()
|
||||
count++;
|
||||
}
|
||||
}
|
||||
std::vector<cv::Point3f> world_corners;
|
||||
std::vector<Point3f> world_corners;
|
||||
for (int h=0; h<board_size.height; h++)
|
||||
{
|
||||
for (int w=0; w<board_size.width; w++)
|
||||
{
|
||||
world_corners.push_back(cv::Point3f(corner_size.width * w, corner_size.height * h , 0.f));
|
||||
world_corners.push_back(Point3f(corner_size.width * w, corner_size.height * h , 0.f));
|
||||
}
|
||||
}
|
||||
std::vector<std::vector<cv::Point3f> > objectPoints;
|
||||
std::vector<std::vector<Point3f> > objectPoints;
|
||||
objectPoints.reserve(count);
|
||||
for (unsigned i=0; i<count; i++)
|
||||
{
|
||||
@@ -175,16 +175,16 @@ CalibrationData* Calibrator::calibrate()
|
||||
}
|
||||
|
||||
//generate world object coordinates
|
||||
std::vector<cv::Point3f> world_corners_p;
|
||||
std::vector<Point3f> world_corners_p;
|
||||
for (int h=0; h<board_size.height; h++)
|
||||
{
|
||||
for (int w=0; w<board_size.width; w++)
|
||||
{
|
||||
world_corners_p.push_back(cv::Point3f(corner_size.width * w , corner_size.height * h ,0.f));
|
||||
world_corners_p.push_back(Point3f(corner_size.width * w , corner_size.height * h ,0.f));
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::vector<cv::Point3f> > objectPoints_p;
|
||||
std::vector<std::vector<Point3f> > objectPoints_p;
|
||||
objectPoints_p.reserve(count);
|
||||
for (unsigned i=0; i<count; i++)
|
||||
{
|
||||
@@ -196,48 +196,48 @@ CalibrationData* Calibrator::calibrate()
|
||||
pattern_list.resize(count);
|
||||
|
||||
int cal_flags = 0
|
||||
//+ cv::CALIB_FIX_K1
|
||||
//+ cv::CALIB_FIX_K2
|
||||
//+ cv::CALIB_ZERO_TANGENT_DIST
|
||||
+ cv::CALIB_FIX_K3
|
||||
//+ CALIB_FIX_K1
|
||||
//+ CALIB_FIX_K2
|
||||
//+ CALIB_ZERO_TANGENT_DIST
|
||||
+ CALIB_FIX_K3
|
||||
;
|
||||
//calibrate the camera ////////////////////////////////////
|
||||
std::vector<cv::Mat> cam_rvecs , cam_tvecs;
|
||||
std::vector<Mat> cam_rvecs , cam_tvecs;
|
||||
int cam_flags = cal_flags;
|
||||
cv::Size imageSize = frameSeqs[0][0].size();
|
||||
res->cam_error = cv::calibrateCamera(objectPoints , board_corners , imageSize , res->Kc , res->kc ,cam_rvecs , cam_tvecs);
|
||||
Size imageSize = frameSeqs[0][0].size();
|
||||
res->cam_error = calibrateCamera(objectPoints , board_corners , imageSize , res->Kc , res->kc ,cam_rvecs , cam_tvecs);
|
||||
std::cout<<"calibrate the camera !"<<std::endl;
|
||||
|
||||
//calibrate the projector ////////////////////////////////////
|
||||
std::vector<cv::Mat> proj_rvecs , proj_tvecs;
|
||||
std::vector<Mat> proj_rvecs , proj_tvecs;
|
||||
int proj_flags = cal_flags;
|
||||
cv::Size projector_size(912, 1140);
|
||||
res->proj_error = cv::calibrateCamera(objectPoints_p , projector_corners, projector_size , res->Kp , res->kp , proj_rvecs , proj_tvecs);
|
||||
Size projector_size(912, 1140);
|
||||
res->proj_error = calibrateCamera(objectPoints_p , projector_corners, projector_size , res->Kp , res->kp , proj_rvecs , proj_tvecs);
|
||||
|
||||
std::cout<<"calibrate the projector !"<<std::endl;
|
||||
//stereo calibration
|
||||
cv::Mat E, F;
|
||||
res->stereo_error = cv::stereoCalibrate(objectPoints , board_corners , projector_corners ,
|
||||
Mat E, F;
|
||||
res->stereo_error = stereoCalibrate(objectPoints , board_corners , projector_corners ,
|
||||
res->Kc , res->kc , res->Kp ,res->kp ,imageSize /*ignored*/ ,
|
||||
res->Rp , res->Tp , E , F );
|
||||
// res->stereo_error = cv::stereoCalibrate(objectPoints , board_corners , projector_corners , res->Kc , res->kc , res->Kp ,res->kp ,imageSize /*ignored*/ , res->Rp , res->Tp , E , F ,
|
||||
// cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS ,50 ,DBL_EPSILON) ,
|
||||
// cv::CALIB_FIX_INTRINSIC /*cv::CALIB_USE_INTRINSIC_GUESS + cal_flags*/);
|
||||
// res->stereo_error = stereoCalibrate(objectPoints , board_corners , projector_corners , res->Kc , res->kc , res->Kp ,res->kp ,imageSize /*ignored*/ , res->Rp , res->Tp , E , F ,
|
||||
// TermCriteria(TermCriteria::COUNT + TermCriteria::EPS ,50 ,DBL_EPSILON) ,
|
||||
// CALIB_FIX_INTRINSIC /*CALIB_USE_INTRINSIC_GUESS + cal_flags*/);
|
||||
std::cout<<"stereo calibration !"<<std::endl;
|
||||
|
||||
|
||||
cv::FileStorage fsc("rtc.xml", cv::FileStorage::WRITE);
|
||||
cv::FileStorage fsp("rtp.xml", cv::FileStorage::WRITE);
|
||||
FileStorage fsc("rtc.xml", FileStorage::WRITE);
|
||||
FileStorage fsp("rtp.xml", FileStorage::WRITE);
|
||||
|
||||
// objectPoints projector_corners board_corners
|
||||
std::ofstream opout("objectPoints.txt");
|
||||
std::ofstream pcout("projector_corners.txt");
|
||||
std::ofstream ccout("board_corners.txt");
|
||||
for (int i = 0; i < objectPoints.size(); i++) {
|
||||
fsc << "R" + std::to_string(i) << cv::Mat(cam_rvecs[i]);
|
||||
fsc << "T" + std::to_string(i) << cv::Mat(cam_tvecs[i]);
|
||||
fsp << "R" + std::to_string(i) << cv::Mat(proj_rvecs[i]);
|
||||
fsp << "T" + std::to_string(i) << cv::Mat(proj_tvecs[i]);
|
||||
fsc << "R" + std::to_string(i) << Mat(cam_rvecs[i]);
|
||||
fsc << "T" + std::to_string(i) << Mat(cam_tvecs[i]);
|
||||
fsp << "R" + std::to_string(i) << Mat(proj_rvecs[i]);
|
||||
fsp << "T" + std::to_string(i) << Mat(proj_tvecs[i]);
|
||||
for (int j = 0; j < objectPoints[i].size(); j++) {
|
||||
opout << objectPoints[i][j] << std::endl;
|
||||
pcout << projector_corners[i][j] << std::endl;
|
||||
@@ -254,24 +254,24 @@ CalibrationData* Calibrator::calibrate()
|
||||
|
||||
}
|
||||
|
||||
std::vector<cv::Point2f> Calibrator::extract_board_corners(cv::Mat &gray_image)
|
||||
std::vector<Point2f> Calibrator::extract_board_corners(Mat &gray_image)
|
||||
{
|
||||
std::vector<cv::Point2f> corners;
|
||||
std::vector<Point2f> corners;
|
||||
int image_scale = 1;
|
||||
if (gray_image.rows<1)
|
||||
{
|
||||
return corners;
|
||||
}
|
||||
cv::Size imageSize = gray_image.size();
|
||||
Size imageSize = gray_image.size();
|
||||
if (imageSize.width>1024)
|
||||
{
|
||||
image_scale = imageSize.width/1024;
|
||||
}
|
||||
|
||||
cv::Mat small_img;
|
||||
Mat small_img;
|
||||
if (image_scale>1)
|
||||
{
|
||||
cv::resize(gray_image , small_img , cv::Size(gray_image.cols/image_scale , gray_image.rows/image_scale));
|
||||
resize(gray_image , small_img , Size(gray_image.cols/image_scale , gray_image.rows/image_scale));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -279,27 +279,27 @@ std::vector<cv::Point2f> Calibrator::extract_board_corners(cv::Mat &gray_image)
|
||||
}
|
||||
|
||||
if(board_type == Chessboard) {
|
||||
cv::findChessboardCorners(small_img, board_size, corners);
|
||||
findChessboardCorners(small_img, board_size, corners);
|
||||
}
|
||||
else if(board_type == Circular) {
|
||||
cv::findCirclesGrid(small_img, board_size, corners);
|
||||
findCirclesGrid(small_img, board_size, corners);
|
||||
}
|
||||
|
||||
if (corners.size())
|
||||
{
|
||||
for (std::vector<cv::Point2f>::iterator iter=corners.begin(); iter!=corners.end(); iter++)
|
||||
for (std::vector<Point2f>::iterator iter=corners.begin(); iter!=corners.end(); iter++)
|
||||
{
|
||||
*iter = image_scale*(*iter);
|
||||
}
|
||||
cv::cornerSubPix(gray_image , corners , cv::Size(11 , 11) , cv::Size(-1 , -1) ,
|
||||
cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30 , 0.1));
|
||||
cornerSubPix(gray_image , corners , Size(11 , 11) , Size(-1 , -1) ,
|
||||
TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 30 , 0.1));
|
||||
}
|
||||
|
||||
return corners;
|
||||
}
|
||||
|
||||
|
||||
bool Calibrator::decode_gray_set(int ind , cv::Mat & pattern_image, cv::Mat & min_max_image)
|
||||
bool Calibrator::decode_gray_set(int ind , Mat & pattern_image, Mat & min_max_image)
|
||||
{
|
||||
if (ind >= frameSeqs.size())
|
||||
{ //out of bounds
|
||||
@@ -308,7 +308,7 @@ bool Calibrator::decode_gray_set(int ind , cv::Mat & pattern_image, cv::Mat & m
|
||||
|
||||
//estimate direct component
|
||||
//b = config.value("robust_estimation/b" DEFAULT_B).toFloat();
|
||||
std::vector<cv::Mat> images;
|
||||
std::vector<Mat> images;
|
||||
// QList<unsigned> direct_component_images(QList<unsigned>() << 15 << 16 << 17 << 18 << 35 << 36 << 37 << 38);
|
||||
int total_images = frameSeqs[ind].size();
|
||||
int total_patterns = total_images/2 - 1;
|
||||
@@ -326,12 +326,12 @@ bool Calibrator::decode_gray_set(int ind , cv::Mat & pattern_image, cv::Mat & m
|
||||
{
|
||||
images.push_back(frameSeqs[ind][i]);
|
||||
}
|
||||
cv::Mat direct_light = sl::estimate_direct_light(images, b);
|
||||
Mat direct_light = sl::estimate_direct_light(images, b);
|
||||
|
||||
//m = config.value("robust_estimation/m" DEFAULT_M).toUInt();
|
||||
// return sl::decode_pattern(frameSeqs[ind] , pattern_image , min_max_image , sl::RobustDecode|sl::GrayPatternDecode , direct_light, m);
|
||||
|
||||
cv::Size projector_size(912, 1140);
|
||||
Size projector_size(912, 1140);
|
||||
bool rv = sl::decode_pattern(frameSeqs[ind], pattern_image, min_max_image, projector_size, sl::RobustDecode|sl::GrayPatternDecode, direct_light, m);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -510,3 +510,8 @@ void CoreAlgorithm::saveCoordinate()
|
||||
}
|
||||
destFile.close();
|
||||
}
|
||||
|
||||
vector<Mat> CoreAlgorithm::getCoordinates()
|
||||
{
|
||||
return coordinate;
|
||||
}
|
||||
|
||||
@@ -53,4 +53,6 @@ public:
|
||||
void run();
|
||||
|
||||
void saveCoordinate();
|
||||
|
||||
vector<Mat> getCoordinates();
|
||||
};
|
||||
|
||||
@@ -4,6 +4,7 @@ Help::Help(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
this->setWindowIcon(QIcon(":/icon/image/common/icon.png"));
|
||||
QPixmap *pixmap = new QPixmap(":/Reconstruction/image/reconstruction/help.png");
|
||||
pixmap->scaled(ui.label->size(), Qt::KeepAspectRatio);
|
||||
ui.label->setScaledContents(true);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <QWidget>
|
||||
#include "ui_Help.h"
|
||||
#include <QTextCodec>
|
||||
#include <QIcon>
|
||||
|
||||
class Help : public QWidget
|
||||
{
|
||||
|
||||
53
Classes/HisThread.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
#include "HisThread.h"
|
||||
|
||||
HisThread::HisThread(PointCloud<PointXYZRGB>* cloudArg, PolygonMesh* meshArg)
|
||||
{
|
||||
mesh = meshArg;
|
||||
cloud = cloudArg;
|
||||
}
|
||||
|
||||
void HisThread::run()
|
||||
{
|
||||
PointCloud<PointXYZRGB>::Ptr finalCloud = cloud->makeShared();
|
||||
NormalEstimation<PointXYZRGB, Normal> n;//法线估计对象
|
||||
PointCloud<Normal>::Ptr normals(new PointCloud<Normal>);//存储估计的法线的指针
|
||||
search::KdTree<PointXYZRGB>::Ptr tree(new search::KdTree<PointXYZRGB>);
|
||||
tree->setInputCloud(finalCloud);
|
||||
n.setInputCloud(finalCloud);
|
||||
n.setSearchMethod(tree);
|
||||
n.setKSearch(20);
|
||||
n.compute(*normals); //计算法线,结果存储在normals中
|
||||
|
||||
//将点云和法线放到一起
|
||||
PointCloud<PointXYZRGBNormal>::Ptr cloud_with_normals(new PointCloud<PointXYZRGBNormal>);
|
||||
concatenateFields(*finalCloud, *normals, *cloud_with_normals);
|
||||
|
||||
//创建搜索树
|
||||
search::KdTree<PointXYZRGBNormal>::Ptr tree2(new search::KdTree<PointXYZRGBNormal>);
|
||||
tree2->setInputCloud(cloud_with_normals);
|
||||
//创建Poisson对象,并设置参数
|
||||
Poisson<PointXYZRGBNormal> pn;
|
||||
pn.setConfidence(true); //是否使用法向量的大小作为置信信息。如果false,所有法向量均归一化。
|
||||
pn.setDegree(2); //设置参数degree[1,5],值越大越精细,耗时越久。
|
||||
pn.setDepth(8); //树的最大深度,求解2^d x 2^d x 2^d立方体元。由于八叉树自适应采样密度,指定值仅为最大深度。
|
||||
pn.setIsoDivide(8); //用于提取ISO等值面的算法的深度
|
||||
pn.setManifold(true); //是否添加多边形的重心,当多边形三角化时。 设置流行标志,如果设置为true,则对多边形进行细分三角话时添加重心,设置false则不添加
|
||||
pn.setManifold(false);
|
||||
pn.setOutputPolygons(false); //是否输出多边形网格(而不是三角化移动立方体的结果)
|
||||
//pn.setSamplesPerNode(3.0); //设置落入一个八叉树结点中的样本点的最小数量。无噪声,[1.0-5.0],有噪声[15.-20.]平滑
|
||||
pn.setSamplesPerNode(18); //设置落入一个八叉树结点中的样本点的最小数量。无噪声,[1.0-5.0],有噪声[15.-20.]平滑
|
||||
pn.setScale(1.25); //设置用于重构的立方体直径和样本边界立方体直径的比率。
|
||||
pn.setSolverDivide(8); //设置求解线性方程组的Gauss-Seidel迭代方法的深度
|
||||
//pn.setIndices();
|
||||
|
||||
//设置搜索方法和输入点云
|
||||
pn.setSearchMethod(tree2);
|
||||
pn.setInputCloud(cloud_with_normals);
|
||||
|
||||
//执行重构
|
||||
pn.performReconstruction(*mesh);
|
||||
// auto pclData = PointCloudData::getInstance(cloud);
|
||||
// pclData->getViewer()->removeAllPointClouds();
|
||||
// pclData->getViewer()->addPolygonMesh(mesh, "my");
|
||||
|
||||
}
|
||||
32
Classes/HisThread.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include <qthread.h>
|
||||
#include <pcl/point_types.h>
|
||||
#include <pcl/io/vtk_lib_io.h>
|
||||
#include <pcl/kdtree/kdtree_flann.h>
|
||||
#include <pcl/features/normal_3d_omp.h>
|
||||
#include <pcl/features/normal_3d.h>
|
||||
#include <pcl/surface/gp3.h>
|
||||
#include <pcl/surface/poisson.h>
|
||||
#include <pcl/PolygonMesh.h>
|
||||
#include <pcl/features/normal_3d.h>
|
||||
#include <pcl/features/normal_3d_omp.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace pcl;
|
||||
|
||||
class HisThread :
|
||||
public QThread
|
||||
{
|
||||
public:
|
||||
HisThread(PointCloud<PointXYZRGB>* cloud,PolygonMesh* meshArg);
|
||||
~HisThread(){};
|
||||
|
||||
|
||||
private:
|
||||
PolygonMesh* mesh;// 多变形网格,用于存储结果
|
||||
PointCloud<PointXYZRGB>* cloud;
|
||||
|
||||
protected:
|
||||
void run();
|
||||
};
|
||||
@@ -5,6 +5,7 @@ Loading::Loading(QWidget *parent)
|
||||
{
|
||||
|
||||
setStyle();
|
||||
this->setWindowIcon(QIcon(":/icon/image/common/icon.png"));
|
||||
setWindowFlags(Qt::FramelessWindowHint);
|
||||
ui.label_2->hide();
|
||||
// ui.progressBar->setValue(0);
|
||||
|
||||
@@ -10,23 +10,28 @@ void MyThread::run()
|
||||
if(!pcd.empty())
|
||||
{
|
||||
PointCloud<PointXYZRGB>::Ptr cloudPtr(new PointCloud<PointXYZRGB>);
|
||||
io::loadPCDFile(pcd, *cloudPtr);
|
||||
if (QString::fromStdString(pcd).endsWith(".pcd", Qt::CaseInsensitive))
|
||||
io::loadPCDFile(pcd, *cloudPtr);
|
||||
else if (QString::fromStdString(pcd).endsWith(".ply", Qt::CaseInsensitive))
|
||||
io::loadPLYFile(pcd, *cloudPtr);
|
||||
cloud = *cloudPtr;
|
||||
cout << "hhhhhhhhhhhhhh," << cloud.size() << "\n";
|
||||
}
|
||||
|
||||
auto pclData = PointCloudData::getInstance(cloud);
|
||||
pclData->setCloud(cloud);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void MyThread::setPcd(QString str)
|
||||
{
|
||||
pcd = str.toStdString();
|
||||
QTextCodec* code = QTextCodec::codecForName("GB2312");//½â¾öÖÐÎÄ·¾¶ÎÊÌâ
|
||||
pcd = code->fromUnicode(str).data();
|
||||
// pcd = str.toStdString();
|
||||
}
|
||||
|
||||
PointCloud<PointXYZRGB> MyThread::getCloud()
|
||||
{
|
||||
return cloud;
|
||||
}
|
||||
|
||||
MyThread::~MyThread()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <qthread.h>
|
||||
#include <pcl/point_types.h>
|
||||
#include <pcl/io/vtk_lib_io.h>
|
||||
#include "PointCloudData.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace pcl;
|
||||
@@ -12,7 +13,7 @@ class MyThread :
|
||||
{
|
||||
public:
|
||||
MyThread();
|
||||
~MyThread();
|
||||
~MyThread(){};
|
||||
void setPcd(QString str);
|
||||
PointCloud<PointXYZRGB> getCloud();
|
||||
|
||||
|
||||
96
Classes/PointCloudData.cpp
Normal file
@@ -0,0 +1,96 @@
|
||||
#include "PointCloudData.h"
|
||||
|
||||
PointCloudData* PointCloudData::instance = nullptr;
|
||||
|
||||
PointCloudData::PointCloudData(PointCloud<PointXYZRGB> cloudArg)
|
||||
{
|
||||
cloud = cloudArg;
|
||||
num = 0;
|
||||
}
|
||||
|
||||
PointCloudData* PointCloudData::getInstance(PointCloud<PointXYZRGB> cloudArg)
|
||||
{
|
||||
if (instance == nullptr) instance = new PointCloudData(cloudArg);
|
||||
return instance;
|
||||
}
|
||||
|
||||
PointCloudData* PointCloudData::getInstance()
|
||||
{
|
||||
return instance;
|
||||
}
|
||||
|
||||
PointCloud<PointXYZRGB> PointCloudData::getCloud() const{
|
||||
return cloud;
|
||||
}
|
||||
|
||||
void PointCloudData::setCloud(PointCloud<PointXYZRGB> cloudArg){
|
||||
cloud= cloudArg;
|
||||
}
|
||||
|
||||
boost::shared_ptr<visualization::PCLVisualizer> PointCloudData::getViewer()
|
||||
{
|
||||
return viewer;
|
||||
}
|
||||
|
||||
|
||||
void PointCloudData::setViewer(boost::shared_ptr<visualization::PCLVisualizer> viewerArg)
|
||||
{
|
||||
viewer = viewerArg;
|
||||
}
|
||||
|
||||
std::vector<int> PointCloudData::getIndices()
|
||||
{
|
||||
return indices;
|
||||
}
|
||||
|
||||
void PointCloudData::setIndices(std::vector<int> indicesArg)
|
||||
{
|
||||
indices = indicesArg;
|
||||
}
|
||||
|
||||
Ui::ReconstructionClass PointCloudData::getUI()
|
||||
{
|
||||
return ui;
|
||||
}
|
||||
|
||||
void PointCloudData::setUI(Ui::ReconstructionClass uiArg)
|
||||
{
|
||||
ui = uiArg;
|
||||
}
|
||||
|
||||
int PointCloudData::getNum()
|
||||
{
|
||||
return num;
|
||||
}
|
||||
|
||||
void PointCloudData::setNum()
|
||||
{
|
||||
num++;
|
||||
}
|
||||
|
||||
QColor PointCloudData::getColor()
|
||||
{
|
||||
return color;
|
||||
}
|
||||
|
||||
void PointCloudData::setColor(QColor colorArg)
|
||||
{
|
||||
color = colorArg;
|
||||
}
|
||||
|
||||
float PointCloudData::getXAxis()
|
||||
{
|
||||
return xAxis;
|
||||
}
|
||||
|
||||
float PointCloudData::getZAxis()
|
||||
{
|
||||
return zAxis;
|
||||
}
|
||||
|
||||
void PointCloudData::setAxises(float xArg,float zArg)
|
||||
{
|
||||
xAxis = xArg;
|
||||
zAxis = zArg;
|
||||
}
|
||||
|
||||
43
Classes/PointCloudData.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#pragma once
|
||||
#include <pcl/point_types.h>
|
||||
#include <pcl/io/pcd_io.h>
|
||||
#include <pcl/visualization/pcl_visualizer.h>
|
||||
#include <pcl/io/vtk_lib_io.h>
|
||||
#include <QtWidgets/QMainWindow>
|
||||
#include "Reconstruction.h"
|
||||
|
||||
using namespace pcl;
|
||||
|
||||
class PointCloudData
|
||||
{
|
||||
private:
|
||||
PointCloudData(PointCloud<PointXYZRGB> cloudArg);
|
||||
~PointCloudData(){};
|
||||
PointCloud<PointXYZRGB> cloud;
|
||||
boost::shared_ptr<visualization::PCLVisualizer> viewer;
|
||||
std::vector<int> indices;
|
||||
Ui::ReconstructionClass ui;
|
||||
int num;// 用于框选删除点云的名称
|
||||
QColor color = Qt::yellow;
|
||||
float xAxis, zAxis;
|
||||
|
||||
public:
|
||||
static PointCloudData* getInstance();
|
||||
static PointCloudData* getInstance(PointCloud<PointXYZRGB> cloudArg);
|
||||
static PointCloudData* instance ;
|
||||
PointCloud<PointXYZRGB> getCloud() const;
|
||||
void setCloud(PointCloud<PointXYZRGB> cloudArg);
|
||||
boost::shared_ptr<visualization::PCLVisualizer> getViewer();
|
||||
void setViewer(boost::shared_ptr<visualization::PCLVisualizer> viewerArg);
|
||||
std::vector<int> getIndices();
|
||||
void setIndices(std::vector<int> indicesArg);
|
||||
Ui::ReconstructionClass getUI();
|
||||
void setUI(Ui::ReconstructionClass uiArg);
|
||||
int getNum();
|
||||
void setNum();
|
||||
QColor getColor();
|
||||
void setColor(QColor colorArg);
|
||||
float getXAxis();
|
||||
float getZAxis();
|
||||
void setAxises(float xArg,float zArg);
|
||||
};
|
||||
@@ -1,14 +1,129 @@
|
||||
#include "Reconstruction.h"
|
||||
#include "MyThread.h"
|
||||
#include "YourThread.h"
|
||||
|
||||
# pragma region 点云回调
|
||||
// 点云框选回调函数
|
||||
void pp_callback(const visualization::AreaPickingEvent& event, void* args)
|
||||
{
|
||||
auto pclData = PointCloudData::getInstance();
|
||||
PointCloud<PointXYZRGB>::Ptr cloudPtr(new PointCloud<PointXYZRGB>);
|
||||
cloudPtr = pclData->getCloud().makeShared();
|
||||
auto num = pclData->getNum();
|
||||
std::vector<int> indices;
|
||||
|
||||
if (event.getPointsIndices(indices) == -1)
|
||||
return;
|
||||
// cout << indices.size() << "\n";
|
||||
PointCloud<PointXYZRGB>::Ptr clicked_points_3d(new PointCloud<PointXYZRGB>);
|
||||
if (indices.size() > 0)
|
||||
{
|
||||
for (auto i = 0; i < indices.size(); ++i)
|
||||
{
|
||||
clicked_points_3d->points.push_back(cloudPtr->points.at(indices[i]));
|
||||
}
|
||||
|
||||
visualization::PointCloudColorHandlerCustom<PointXYZRGB> red(clicked_points_3d, 255, 0, 0);
|
||||
std::stringstream ss;
|
||||
std::string cloudName;
|
||||
pclData->setNum();
|
||||
ss << num++;
|
||||
ss >> cloudName;
|
||||
cloudName += "_cloudName";
|
||||
|
||||
pclData->getViewer()->addPointCloud(clicked_points_3d, red, cloudName);
|
||||
pclData->getViewer()->
|
||||
setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, cloudName);
|
||||
// pclData->getViewer()->updatePointCloud(clicked_points_3d,"cloudName");
|
||||
pclData->setIndices(indices);
|
||||
pclData->getUI().qvtkWidget->SetRenderWindow(pclData->getViewer()->getRenderWindow());
|
||||
pclData->getUI().qvtkWidget->update();
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the rotation matrix around a vector placed at a point , rotate by angle t
|
||||
Eigen::Matrix4f rot_mat(const Eigen::Vector3f& point, const Eigen::Vector3f& vector, const float t)
|
||||
{
|
||||
float u = vector(0);
|
||||
float v = vector(1);
|
||||
float w = vector(2);
|
||||
float a = point(0);
|
||||
float b = point(1);
|
||||
float c = point(2);
|
||||
|
||||
Eigen::Matrix4f matrix;
|
||||
matrix << u * u + (v * v + w * w) * cos(t), u * v * (1 - cos(t)) - w * sin(t), u * w * (1 - cos(t)) + v * sin(t), (a
|
||||
* (v * v + w * w) - u * (b * v + c * w)) * (1 - cos(t)) + (b * w - c * v) * sin(t),
|
||||
u * v * (1 - cos(t)) + w * sin(t), v * v + (u * u + w * w) * cos(t), v * w * (1 - cos(t)) - u * sin(t), (b * (u
|
||||
* u + w * w) - v * (a * u + c * w)) * (1 - cos(t)) + (c * u - a * w) * sin(t),
|
||||
u * w * (1 - cos(t)) - v * sin(t), v * w * (1 - cos(t)) + u * sin(t), w * w + (u * u + v * v) * cos(t), (c * (u
|
||||
* u + v * v) - w * (a * u + b * v)) * (1 - cos(t)) + (a * v - b * u) * sin(t),
|
||||
0, 0, 0, 1;
|
||||
return matrix;
|
||||
}
|
||||
|
||||
void keyboardEventOccurred(const visualization::KeyboardEvent& event, void* nothing)
|
||||
{
|
||||
PointCloud<PointXYZRGB>::Ptr transformed_cloud(new PointCloud<PointXYZRGB>());
|
||||
|
||||
auto pclData = PointCloudData::getInstance();
|
||||
PointCloud<PointXYZRGB>::Ptr cloudPtr(new PointCloud<PointXYZRGB>);
|
||||
cloudPtr = pclData->getCloud().makeShared();
|
||||
|
||||
Eigen::Vector3f point(pclData->getXAxis(), 0, pclData->getZAxis());
|
||||
Eigen::Vector3f vector(0, 1, 0);
|
||||
Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
|
||||
if ((event.getKeySym() == "Right" || event.getKeySym() == "Left") && event.keyDown())
|
||||
{
|
||||
if (event.getKeySym() == "Right")
|
||||
{
|
||||
float theta = -M_PI / 36; // 弧度角
|
||||
// Z 轴上旋转 theta 弧度
|
||||
transform = rot_mat(point, vector, theta);
|
||||
}
|
||||
else if (event.getKeySym() == "Left")
|
||||
{
|
||||
float theta = M_PI / 36; // 弧度角
|
||||
// Z 轴上旋转 theta 弧度
|
||||
transform = rot_mat(point, vector, theta);
|
||||
}
|
||||
|
||||
transformPointCloud(*cloudPtr, *transformed_cloud, transform);
|
||||
|
||||
auto color = pclData->getColor();
|
||||
auto x = int(color.redF() * 255);
|
||||
auto y = int(color.greenF() * 255);
|
||||
auto z = int(color.blueF() * 255);
|
||||
double size = 1;
|
||||
pclData->getViewer()->getPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, size,
|
||||
"cloud");
|
||||
pclData->getViewer()->removeAllPointClouds();
|
||||
visualization::PointCloudColorHandlerCustom<PointXYZRGB> cloud_color(transformed_cloud, x, y, z); // 统一处理点云颜色
|
||||
pclData->getViewer()->addPointCloud(transformed_cloud, cloud_color, "cloud");
|
||||
pclData->getViewer()->
|
||||
setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, size, "cloud");
|
||||
pclData->getUI().qvtkWidget->SetRenderWindow(pclData->getViewer()->getRenderWindow());
|
||||
pclData->getUI().qvtkWidget->update();
|
||||
pclData->setCloud(*transformed_cloud);
|
||||
}
|
||||
}
|
||||
|
||||
# pragma endregion
|
||||
|
||||
Reconstruction::Reconstruction(QWidget* parent)
|
||||
: QMainWindow(parent)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
this->setWindowIcon(QIcon(":/icon/image/common/icon.png"));
|
||||
calibData = new CalibrationData();
|
||||
calibrator = new Calibrator();
|
||||
dirModel = new TreeModel(this);
|
||||
td = new YourThread(&cloud);
|
||||
t = new MyThread;
|
||||
htd = new HisThread(&cloud, &mesh);
|
||||
connect(td, SIGNAL(finished()), this, SLOT(setCloud()));
|
||||
connect(t, SIGNAL(finished()), this, SLOT(setCloud()));
|
||||
connect(htd, SIGNAL(finished()), this, SLOT(setCloud()));
|
||||
device = Device::getInstance();
|
||||
setStyle();
|
||||
}
|
||||
@@ -16,6 +131,12 @@ Reconstruction::Reconstruction(QWidget* parent)
|
||||
#pragma region Style
|
||||
void Reconstruction::setStyle()
|
||||
{
|
||||
QAction* aboutAction = ui.menuBar->addAction(tr("About"), this, SLOT(about()));
|
||||
aboutAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_A));
|
||||
|
||||
QAction* quitAction = ui.menuBar->addAction(tr("Exit"), this, SLOT(close()));
|
||||
quitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
|
||||
|
||||
this->setContentsMargins(0, 0, 0, 0);
|
||||
// this->setFixedSize(1240, 680);
|
||||
// ui.centralWidget->setGeometry(0, 40, 1240, 680);
|
||||
@@ -63,6 +184,9 @@ void Reconstruction::setPicStyle()
|
||||
ui.pushButton_6->setEnabled(false);
|
||||
ui.pushButton_7->setEnabled(false);
|
||||
ui.pushButton_8->setEnabled(false);
|
||||
ui.pushButton_9->setEnabled(false);
|
||||
ui.pushButton_10->setEnabled(false);
|
||||
ui.pushButton_19->setEnabled(false);
|
||||
}
|
||||
|
||||
ui.label_21->setPixmap(QPixmap(":/icon/image/projection/novideo.jpg"));
|
||||
@@ -89,12 +213,17 @@ void Reconstruction::setButtonStyle()
|
||||
|
||||
// 图案投影界面
|
||||
ui.pushButton_4->setIcon(QIcon(":/icon/image/projection/file.png"));
|
||||
ui.pushButton_19->setIcon(QIcon(":/icon/image/projection/projector.png"));
|
||||
ui.pushButton_9->setIcon(QIcon(":/icon/image/projection/image.png"));
|
||||
ui.pushButton_10->setIcon(QIcon(":/icon/image/projection/save.png"));
|
||||
ui.pushButton_17->setIcon(QIcon(":/icon/image/projection/three_d.png"));
|
||||
|
||||
// 三维重建界面
|
||||
ui.pushButton_13->setIcon(QIcon(":/icon/image/reconstruction/import.png"));
|
||||
ui.pushButton_14->setIcon(QIcon(":/icon/image/reconstruction/export.png"));
|
||||
ui.pushButton_15->setIcon(QIcon(":/icon/image/reconstruction/save2.png"));
|
||||
ui.pushButton_15->setIcon(QIcon(":/icon/image/reconstruction/surface.png"));
|
||||
ui.pushButton_16->setIcon(QIcon(":/icon/image/reconstruction/color.png"));
|
||||
ui.pushButton_18->setIcon(QIcon(":/icon/image/reconstruction/help2.png"));
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
@@ -111,6 +240,10 @@ void Reconstruction::on_pushButton_clicked()
|
||||
|
||||
void Reconstruction::on_pushButton_2_clicked()
|
||||
{
|
||||
if (device->getHasCamera())
|
||||
{
|
||||
liveViewTimer = startTimer(100);
|
||||
}
|
||||
ui.stackedWidget->setCurrentIndex(1);
|
||||
}
|
||||
|
||||
@@ -118,7 +251,7 @@ void Reconstruction::on_pushButton_3_clicked()
|
||||
{
|
||||
ui.stackedWidget->setCurrentIndex(2);
|
||||
updateQVTK(cloud, color);
|
||||
if (loadingStatus)
|
||||
if (loadingStatus || reconstructStatus)
|
||||
{
|
||||
ui.label_9->setVisible(true);
|
||||
}
|
||||
@@ -133,29 +266,103 @@ void Reconstruction::on_pushButton_3_clicked()
|
||||
void Reconstruction::setCloud()
|
||||
{
|
||||
ui.label_9->setVisible(false);
|
||||
loadingStatus = false;
|
||||
cloud = t->getCloud();
|
||||
updateQVTK(cloud, color);
|
||||
|
||||
if (possionStatus)
|
||||
{
|
||||
auto pclData = PointCloudData::getInstance(cloud);
|
||||
pclData->getViewer()->removeAllPointClouds();
|
||||
pclData->getViewer()->addPolygonMesh(mesh, "my");
|
||||
possionStatus = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (loadingStatus)
|
||||
{
|
||||
cloud = t->getCloud();
|
||||
auto pclData = PointCloudData::getInstance(cloud);
|
||||
PointXYZRGB minPt, maxPt;
|
||||
getMinMax3D(cloud, minPt, maxPt);
|
||||
pclData->setAxises((minPt.x + maxPt.x) / 2, (minPt.z + maxPt.z) / 2);
|
||||
loadingStatus = false;
|
||||
}
|
||||
|
||||
if (reconstructStatus)
|
||||
{
|
||||
reconstructStatus = false;
|
||||
auto pclData = PointCloudData::getInstance(cloud);
|
||||
PointXYZRGB minPt, maxPt;
|
||||
getMinMax3D(cloud, minPt, maxPt);
|
||||
pclData->setAxises((minPt.x + maxPt.x) / 2, (minPt.z + maxPt.z) / 2);
|
||||
}
|
||||
cout << cloud[0].r;
|
||||
|
||||
updateQVTK(cloud, color);
|
||||
}
|
||||
}
|
||||
|
||||
void Reconstruction::updateQVTK(PointCloud<PointXYZRGB> cloud, QColor color)
|
||||
{
|
||||
boost::shared_ptr<visualization::PCLVisualizer> viewer(new visualization::PCLVisualizer("3D Viewer"));
|
||||
viewer->setBackgroundColor(0.458, 0.529, 0.844);
|
||||
viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
|
||||
boost::shared_ptr<visualization::PCLVisualizer> viewer;
|
||||
visualization::Camera camera;
|
||||
double size = 1;
|
||||
if (PointCloudData::getInstance() != nullptr)
|
||||
{
|
||||
auto pclData = PointCloudData::getInstance();
|
||||
pclData->setCloud(cloud);
|
||||
// disable the window appear outside
|
||||
viewer.reset(new visualization::PCLVisualizer("3D Viewer", false));
|
||||
viewer->setBackgroundColor(0.458, 0.529, 0.844);
|
||||
if (cloud.size() != 0)
|
||||
{
|
||||
pclData->getViewer()->getInteractorStyle()->getCameraParameters(camera);
|
||||
if (location)
|
||||
{
|
||||
viewer->setCameraParameters(camera);
|
||||
pclData->getViewer()->getPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, size,
|
||||
"cloud");
|
||||
}
|
||||
else
|
||||
{
|
||||
location = true;
|
||||
}
|
||||
}
|
||||
viewer->registerAreaPickingCallback(pp_callback, (void*)&cloud);
|
||||
viewer->registerKeyboardCallback(&keyboardEventOccurred, (void*)NULL);
|
||||
|
||||
pclData->setViewer(viewer);
|
||||
}
|
||||
else
|
||||
{
|
||||
viewer.reset(new visualization::PCLVisualizer("3D Viewer", false));
|
||||
viewer->setBackgroundColor(0.458, 0.529, 0.844);
|
||||
viewer->initCameraParameters();
|
||||
viewer->registerAreaPickingCallback(pp_callback, (void*)&cloud);
|
||||
viewer->registerKeyboardCallback(&keyboardEventOccurred, (void*)NULL);
|
||||
|
||||
auto pclData = PointCloudData::getInstance(cloud);
|
||||
pclData->setViewer(viewer);
|
||||
pclData->setUI(ui);
|
||||
}
|
||||
|
||||
viewer->removeAllPointClouds();
|
||||
if (cloud.size() != 0)
|
||||
{
|
||||
PointCloud<PointXYZRGB>::Ptr cloudPtr(new PointCloud<PointXYZRGB>);
|
||||
cloudPtr = cloud.makeShared();
|
||||
|
||||
int x = int(color.redF() * 255);
|
||||
int y = int(color.greenF() * 255);
|
||||
int z = int(color.blueF() * 255);
|
||||
visualization::PointCloudColorHandlerCustom<PointXYZRGB> cloud_color(cloudPtr, x, y, z);// 统一处理点云颜色
|
||||
auto x = int(color.redF() * 255);
|
||||
auto y = int(color.greenF() * 255);
|
||||
auto z = int(color.blueF() * 255);
|
||||
visualization::PointCloudColorHandlerCustom<PointXYZRGB> cloud_color(cloudPtr, x, y, z); // 统一处理点云颜色
|
||||
viewer->addPointCloud(cloudPtr, cloud_color, "cloud");
|
||||
viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
|
||||
viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, size, "cloud");
|
||||
}
|
||||
|
||||
ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
|
||||
|
||||
// add control
|
||||
viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());
|
||||
viewer->getInteractorStyle()->setKeyboardModifier(visualization::INTERACTOR_KB_MOD_SHIFT);
|
||||
|
||||
ui.qvtkWidget->update();
|
||||
}
|
||||
#pragma endregion
|
||||
@@ -175,10 +382,7 @@ void Reconstruction::on_pushButton_5_clicked()
|
||||
mesg.warning(this, "WARNING", "Failed to open picture");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
calPath = fileName;
|
||||
}
|
||||
calPath = fileName;
|
||||
}
|
||||
|
||||
// 相机拍摄
|
||||
@@ -195,19 +399,19 @@ void Reconstruction::on_pushButton_6_clicked()
|
||||
fstools::mkDir(tr("./config/calib"), tr(path));
|
||||
|
||||
device->getProjector()->displayPattern(0);
|
||||
//QTest::qSleep(500);
|
||||
Sleep(500);
|
||||
for (unsigned int i = 0; i < 44; i++)
|
||||
{
|
||||
// Project pattern
|
||||
device->getProjector()->displayPattern(i);
|
||||
//QTest::qSleep(200);
|
||||
Sleep(200);
|
||||
// Effectuate sleep (necessary with some camera implementations)
|
||||
QApplication::processEvents();
|
||||
|
||||
// Aquire frame
|
||||
auto frame = device->getCamera()->getFrame();
|
||||
auto frameCV = cvtools::camFrame2Mat(frame);
|
||||
cvtColor(frameCV, frameCV, cv::COLOR_BGR2GRAY);
|
||||
cvtColor(frameCV, frameCV, COLOR_BGR2GRAY);
|
||||
//parameter
|
||||
std::cout << cv::format("./config/calib/calib%.2d/%.2d.bmp", imgCount, i) << std::endl;
|
||||
imwrite(cv::format("./config/calib/calib%.2d/%.2d.bmp", imgCount, i), frameCV);
|
||||
@@ -338,9 +542,13 @@ void Reconstruction::timerEvent(QTimerEvent* event)
|
||||
// correct size only if label has no borders/frame!
|
||||
auto w = ui.label_11->width();
|
||||
auto h = ui.label_11->height();
|
||||
|
||||
auto pixmap = QPixmap::fromImage(qimage);
|
||||
ui.label_11->setPixmap(pixmap.scaled(w, h, Qt::KeepAspectRatio));
|
||||
|
||||
w = ui.label_21->width();
|
||||
h = ui.label_21->height();
|
||||
pixmap = QPixmap::fromImage(qimage);
|
||||
ui.label_21->setPixmap(pixmap.scaled(w, h, Qt::KeepAspectRatio));
|
||||
}
|
||||
|
||||
void Reconstruction::setDirModel(const QString& dirname)
|
||||
@@ -377,7 +585,7 @@ void Reconstruction::setDirModel(const QString& dirname)
|
||||
continue;
|
||||
}
|
||||
|
||||
// add the childrens
|
||||
// add the childrens
|
||||
auto parent = dirModel->index(row, 0);
|
||||
dirModel->setData(parent, item, Qt::DisplayRole);
|
||||
|
||||
@@ -482,20 +690,47 @@ void Reconstruction::on_pushButton_4_clicked()
|
||||
return;
|
||||
}
|
||||
|
||||
QTextCodec* code = QTextCodec::codecForName("GB2312"); //解决中文路径问题
|
||||
auto name = code->fromUnicode(fileName).data();
|
||||
ui.lineEdit->setText(fileName);
|
||||
|
||||
|
||||
td->setPath(name);
|
||||
auto w = ui.label_21->width();
|
||||
auto h = ui.label_21->height();
|
||||
ui.label_21->setPixmap(QPixmap(fileName).scaled(w, h, Qt::KeepAspectRatio));
|
||||
// 投影结构光图案
|
||||
// device->getProjector()->displayPattern(44);
|
||||
// todo 接着进行投影操作
|
||||
}
|
||||
|
||||
// 投影图案
|
||||
void Reconstruction::on_pushButton_19_clicked()
|
||||
{
|
||||
device->getProjector()->displayPattern(44);
|
||||
}
|
||||
|
||||
// 相机拍照
|
||||
void Reconstruction::on_pushButton_9_clicked()
|
||||
{
|
||||
// todo 相机拍照
|
||||
picPath = "Resources/image/test.png"; // 该行仅做测试使用
|
||||
DisplayPic* picDlg = new DisplayPic();
|
||||
picDlg->setPicPath(picPath);
|
||||
connect(picDlg, SIGNAL(getPicAction(QString)), this, SLOT(setPicAction(QString)));
|
||||
picDlg->show();
|
||||
killTimer(liveViewTimer);
|
||||
auto frame = device->getCamera()->getFrame();
|
||||
auto frameCV = cvtools::camFrame2Mat(frame);
|
||||
// cvtColor(frameCV, frameCV, cv::COLOR_BGR2GRAY);
|
||||
if (frameCV.rows == 0 || frameCV.cols == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
frameCV = frameCV.clone();
|
||||
auto qimage = cvtools::cvMat2qImage(frameCV);
|
||||
|
||||
// correct size only if label has no borders/frame!
|
||||
auto w = ui.label_21->width();
|
||||
auto h = ui.label_21->height();
|
||||
|
||||
auto pixmap = QPixmap::fromImage(qimage);
|
||||
ui.label_21->setPixmap(pixmap.scaled(w, h, Qt::KeepAspectRatio));
|
||||
}
|
||||
|
||||
void Reconstruction::setPicAction(QString action)
|
||||
@@ -515,7 +750,6 @@ void Reconstruction::setPicAction(QString action)
|
||||
// 保存照片
|
||||
void Reconstruction::on_pushButton_10_clicked()
|
||||
{
|
||||
// todo 保存照片
|
||||
if (confirmPic)
|
||||
{
|
||||
QString fileName = QFileDialog::getSaveFileName(this,
|
||||
@@ -525,18 +759,8 @@ void Reconstruction::on_pushButton_10_clicked()
|
||||
|
||||
if (!fileName.isNull())
|
||||
{
|
||||
QImage iim(picPath); //创建一个图片对象,存储源图片
|
||||
QPainter painter(&iim); //设置绘画设备
|
||||
QFile file(fileName); //创建一个文件对象,存储用户选择的文件
|
||||
if (!file.open(QIODevice::ReadWrite))
|
||||
{
|
||||
return;
|
||||
}
|
||||
QByteArray ba;
|
||||
QBuffer buffer(&ba);
|
||||
buffer.open(QIODevice::WriteOnly);
|
||||
iim.save(&buffer, "JPG"); //把图片以流方式写入文件缓存流中
|
||||
file.write(ba); //将流中的图片写入文件对象当中
|
||||
QScreen* screen = QGuiApplication::primaryScreen();
|
||||
screen->grabWindow(ui.label_21->winId()).save(fileName);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -549,50 +773,21 @@ void Reconstruction::on_pushButton_10_clicked()
|
||||
// 开始重建
|
||||
void Reconstruction::on_pushButton_17_clicked()
|
||||
{
|
||||
// todo 开始重建
|
||||
// auto cArg = CameraArguments::getInstance();
|
||||
Mat r(3, 3, CV_32F);
|
||||
double m0[3][3] = {
|
||||
{9.7004457782050868e-001, 1.3447278830863673e-002, 2.4255450466457243e-001},
|
||||
{-8.7082927494022376e-003, 9.9974988338843274e-001, -2.0599424802792338e-002},
|
||||
{-2.4277084396282392e-001, 1.7870124701864658e-002, 9.6991905639837694e-001}
|
||||
};
|
||||
for (auto i = 0; i < r.rows; i++)
|
||||
for (auto j = 0; j < r.cols; j++)
|
||||
r.at<float>(i, j) = m0[i][j];
|
||||
|
||||
Mat t(1, 3, CV_32F);
|
||||
double m1[1][3] = {
|
||||
{-1.9511179496234658e+002, 1.2627509817628756e+001, -5.9345885017522171e+001}
|
||||
};
|
||||
|
||||
for (auto i = 0; i < t.rows; i++)
|
||||
for (auto j = 0; j < t.cols; j++)
|
||||
t.at<float>(i, j) = m1[i][j];
|
||||
|
||||
Mat kc(3, 3, CV_32F);
|
||||
double m2[3][3] = {
|
||||
{2.1536653255083029e+003, 0., 6.1886776197116581e+002},
|
||||
{0., 2.1484363899666910e+003, 5.0694898820460787e+002},
|
||||
{0., 0., 1.}
|
||||
};
|
||||
for (auto i = 0; i < kc.rows; i++)
|
||||
for (auto j = 0; j < kc.cols; j++)
|
||||
kc.at<float>(i, j) = m2[i][j];
|
||||
|
||||
Mat kp(3, 3, CV_32F);
|
||||
double m3[3][3] = {
|
||||
{1.7235093158297350e+003, 0., 4.4128195628736904e+002},
|
||||
{0., 3.4533404000869359e+003, 5.7316457428558715e+002},
|
||||
{0., 0., 1.}
|
||||
};
|
||||
for (auto i = 0; i < kp.rows; i++)
|
||||
for (auto j = 0; j < kp.cols; j++)
|
||||
kp.at<float>(i, j) = m3[i][j];
|
||||
|
||||
auto cArg = CameraArguments::getInstance(r, t, kc, kp);
|
||||
CoreAlgorithm testCase = CoreAlgorithm("./Data/image/reconstruction/tq.png", cArg);
|
||||
testCase.run();
|
||||
auto isNull = ui.lineEdit->text();
|
||||
if (isNull.isEmpty())
|
||||
{
|
||||
QMessageBox mesg;
|
||||
mesg.warning(this, "WARNING", "Please select a picture!");
|
||||
return;
|
||||
}
|
||||
|
||||
cloud.clear();
|
||||
location = false;
|
||||
reconstructStatus = true;
|
||||
on_pushButton_3_clicked();
|
||||
ui.label_9->setVisible(true);
|
||||
QCoreApplication::processEvents();
|
||||
td->start();
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
@@ -602,28 +797,41 @@ void Reconstruction::on_pushButton_17_clicked()
|
||||
// 异常点选择
|
||||
void Reconstruction::on_pushButton_11_clicked()
|
||||
{
|
||||
// todo 异常点选择
|
||||
QMessageBox::information(this, tr("Tip"),
|
||||
"Please press the 'X' in the keyboard to choose the outlier points!");
|
||||
}
|
||||
|
||||
// 异常点剔除
|
||||
void Reconstruction::on_pushButton_12_clicked()
|
||||
{
|
||||
// todo 异常点剔除
|
||||
auto pclData = PointCloudData::getInstance();
|
||||
auto indices = pclData->getIndices();
|
||||
cloud = pclData->getCloud();
|
||||
for (auto i = 0; i < indices.size(); ++i)
|
||||
{
|
||||
auto index = cloud.begin() + (indices[i] - i);
|
||||
if (indices[i] - i >= cloud.size())break;
|
||||
cloud.erase(index);
|
||||
}
|
||||
indices.clear();
|
||||
pclData->setIndices(indices);
|
||||
pclData->setCloud(cloud);
|
||||
updateQVTK(cloud, color);
|
||||
}
|
||||
|
||||
// 导入点云
|
||||
void Reconstruction::on_pushButton_13_clicked()
|
||||
{
|
||||
if (loadingStatus)
|
||||
if (loadingStatus || reconstructStatus)
|
||||
{
|
||||
QMessageBox mesg;
|
||||
mesg.warning(this, "WARNING", "正在加载… ");
|
||||
mesg.warning(this, "WARNING", "There is a Point Cloud Loading.");
|
||||
return;
|
||||
}
|
||||
|
||||
QString fileName = QFileDialog::getOpenFileName(
|
||||
this, tr("open multiple image file"),
|
||||
"./", tr("PCD files(*.pcd);;All files (*.*)")); // todo 文件类型待确认
|
||||
"./", tr("PCD files(*.pcd);;PLY files(*.ply);;All files (*.*)")); // todo 文件类型待确认
|
||||
|
||||
if (fileName.isEmpty())
|
||||
{
|
||||
@@ -632,44 +840,51 @@ void Reconstruction::on_pushButton_13_clicked()
|
||||
return;
|
||||
}
|
||||
|
||||
cloud.clear();
|
||||
location = false;
|
||||
ui.label_9->setVisible(true);
|
||||
QCoreApplication::processEvents();
|
||||
t->setPcd(fileName);
|
||||
t->start();
|
||||
loadingStatus = true;
|
||||
|
||||
// todo 存储文件或文件路径
|
||||
}
|
||||
|
||||
// 导出结果
|
||||
void Reconstruction::on_pushButton_14_clicked()
|
||||
{
|
||||
// todo 导出结果
|
||||
}
|
||||
|
||||
// 保存截图
|
||||
void Reconstruction::on_pushButton_15_clicked()
|
||||
{
|
||||
QString fileName = QFileDialog::getSaveFileName(this,
|
||||
tr("save screen shot"),
|
||||
"",
|
||||
tr("*.png;; *.jpg;; *.bmp;; All files(*.*)"));
|
||||
QString fileName = QFileDialog::getSaveFileName(this, tr("Save to file"),
|
||||
"./", tr("PCD files(*.pcd);;PLY files(*.ply);;All files (*.*)"));
|
||||
|
||||
if (!fileName.isNull())
|
||||
{
|
||||
// 截图所选的控件暂时用 label_17 替代
|
||||
QPixmap pix = QPixmap::grabWidget(ui.qvtkWidget);
|
||||
pix.save(fileName);
|
||||
QTextCodec* code = QTextCodec::codecForName("GB2312"); //解决中文路径问题
|
||||
auto name = code->fromUnicode(fileName).data();
|
||||
if (QString::fromStdString(name).endsWith(".pcd", Qt::CaseInsensitive))
|
||||
io::savePCDFileBinary(name, cloud);
|
||||
else if (QString::fromStdString(name).endsWith(".ply", Qt::CaseInsensitive))
|
||||
io::savePLYFileBinary(name, cloud);
|
||||
}
|
||||
}
|
||||
|
||||
// 泊松曲面重建
|
||||
void Reconstruction::on_pushButton_15_clicked()
|
||||
{
|
||||
ui.label_9->setVisible(true);
|
||||
QCoreApplication::processEvents();
|
||||
htd->start();
|
||||
possionStatus = true;
|
||||
}
|
||||
|
||||
// 颜色选取
|
||||
void Reconstruction::on_pushButton_16_clicked()
|
||||
{
|
||||
QColor colortmp = QColorDialog::getColor(Qt::black);
|
||||
if (colortmp.isValid()) {
|
||||
if (colortmp.isValid())
|
||||
{
|
||||
color = colortmp;
|
||||
updateQVTK(cloud, color);
|
||||
auto pclData = PointCloudData::getInstance();
|
||||
pclData->setColor(color);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -679,4 +894,15 @@ void Reconstruction::on_pushButton_18_clicked()
|
||||
Help* help = new Help();
|
||||
help->show();
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
void Reconstruction::about()
|
||||
{
|
||||
AboutDialog* aboutDialog;
|
||||
aboutDialog = new AboutDialog(this);
|
||||
aboutDialog->setWindowFlags(Qt::Window);
|
||||
aboutDialog->setWindowModality(Qt::ApplicationModal);
|
||||
aboutDialog->setWindowTitle(QString::fromLocal8Bit("关于"));
|
||||
aboutDialog->show();
|
||||
}
|
||||
|
||||
@@ -7,13 +7,26 @@
|
||||
#include <QBuffer>
|
||||
#include <QTextStream>
|
||||
#include <QStyleFactory>
|
||||
#include <QScreen>
|
||||
#include <QtTest/QtTest>
|
||||
#include <QTextCodec>
|
||||
#include "DisplayPic.h"
|
||||
#include "ui_Reconstruction.h"
|
||||
#include <pcl/point_types.h>
|
||||
#include <pcl/io/pcd_io.h>
|
||||
#include <pcl/io/ply_io.h>
|
||||
#include <pcl/io/png_io.h>
|
||||
#include <pcl/visualization/pcl_visualizer.h>
|
||||
#include <pcl/io/vtk_lib_io.h>
|
||||
#include <vtkOutputwindow.h>
|
||||
#include <pcl\filters\statistical_outlier_removal.h>
|
||||
#include <pcl/filters/voxel_grid.h>
|
||||
#include <pcl/common/transforms.h>
|
||||
#include <vector>
|
||||
#include <pcl/io/obj_io.h>
|
||||
#include <pcl/PolygonMesh.h>
|
||||
#include <pcl/features/normal_3d.h>
|
||||
#include <pcl/features/normal_3d_omp.h>
|
||||
#include <vtkRenderWindow.h>
|
||||
#include <QProgressDialog>
|
||||
#include "Camera.h"
|
||||
@@ -23,15 +36,29 @@
|
||||
#include "Calibrator.h"
|
||||
#include "CalibrationData.h"
|
||||
#include "Device.h"
|
||||
#include "HisThread.h"
|
||||
#include "CoreAlgorithm.h"
|
||||
#include "MyThread.h"
|
||||
#include "QVTKWidget.h"
|
||||
#include "vtkRenderWindow.h"
|
||||
#include "Help.h"
|
||||
#include "AboutDialog.h"
|
||||
#include <iostream>
|
||||
#include<vtkAutoInit.h>
|
||||
|
||||
VTK_MODULE_INIT(vtkRenderingOpenGL2)
|
||||
|
||||
VTK_MODULE_INIT(vtkInteractionStyle);
|
||||
|
||||
VTK_MODULE_INIT(vtkRenderingFreeType);
|
||||
|
||||
using namespace pcl;
|
||||
using namespace std;
|
||||
|
||||
enum Role { ImageFilenameRole = Qt::UserRole, GrayImageRole, ColorImageRole };
|
||||
|
||||
class MyThread;
|
||||
class YourThread;
|
||||
|
||||
class Reconstruction : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -50,17 +77,26 @@ private:
|
||||
QString picPath = "Result/result.png"; // 三维重建:拍摄照片的存储路径
|
||||
PointCloud<PointXYZRGB> cloud;
|
||||
bool confirmPic = false; // 三维重建:确定是否用所拍照片进行重建
|
||||
QColor color = Qt::black; // 点云渲染:颜色
|
||||
QColor color = Qt::yellow; // 点云渲染:颜色
|
||||
|
||||
// 标定相关变量
|
||||
int liveViewTimer;
|
||||
TreeModel* dirModel;
|
||||
CalibrationData* calibData;
|
||||
Calibrator* calibrator;
|
||||
int imgCount;
|
||||
|
||||
// 多线程
|
||||
MyThread* t;
|
||||
// 重建多线程
|
||||
YourThread *td;
|
||||
bool reconstructStatus = false; // 点云渲染
|
||||
|
||||
// 点云多线程
|
||||
MyThread *t;
|
||||
HisThread* htd;
|
||||
PolygonMesh mesh;
|
||||
bool loadingStatus = false; // 点云渲染
|
||||
bool possionStatus = false;
|
||||
bool location = false; // indicate the first time to load point cloud to optimize location
|
||||
void setStyle();
|
||||
void setPicStyle();
|
||||
void setButtonStyle();
|
||||
@@ -85,6 +121,8 @@ private slots:
|
||||
void on_pushButton_16_clicked();
|
||||
void on_pushButton_17_clicked();
|
||||
void on_pushButton_18_clicked();
|
||||
void on_pushButton_19_clicked();
|
||||
void setPicAction(QString action);
|
||||
void setCloud();
|
||||
void about();
|
||||
};
|
||||
75
Classes/YourThread.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
#include "YourThread.h"
|
||||
|
||||
YourThread::YourThread(PointCloud<PointXYZRGB> *cloudRef)
|
||||
{
|
||||
cloud = cloudRef;
|
||||
}
|
||||
|
||||
void YourThread::run()
|
||||
{
|
||||
// auto cArg = CameraArguments::getInstance();
|
||||
Mat r(3, 3, CV_32F);
|
||||
double m0[3][3] = {
|
||||
{9.7004457782050868e-001, 1.3447278830863673e-002, 2.4255450466457243e-001},
|
||||
{-8.7082927494022376e-003, 9.9974988338843274e-001, -2.0599424802792338e-002},
|
||||
{-2.4277084396282392e-001, 1.7870124701864658e-002, 9.6991905639837694e-001}
|
||||
};
|
||||
for (auto i = 0; i < r.rows; i++)
|
||||
for (auto j = 0; j < r.cols; j++)
|
||||
r.at<float>(i, j) = m0[i][j];
|
||||
|
||||
Mat t(1, 3, CV_32F);
|
||||
double m1[1][3] = {
|
||||
{-1.9511179496234658e+002, 1.2627509817628756e+001, -5.9345885017522171e+001}
|
||||
};
|
||||
|
||||
for (auto i = 0; i < t.rows; i++)
|
||||
for (auto j = 0; j < t.cols; j++)
|
||||
t.at<float>(i, j) = m1[i][j];
|
||||
|
||||
Mat kc(3, 3, CV_32F);
|
||||
double m2[3][3] = {
|
||||
{2.1536653255083029e+003, 0., 6.1886776197116581e+002},
|
||||
{0., 2.1484363899666910e+003, 5.0694898820460787e+002},
|
||||
{0., 0., 1.}
|
||||
};
|
||||
for (auto i = 0; i < kc.rows; i++)
|
||||
for (auto j = 0; j < kc.cols; j++)
|
||||
kc.at<float>(i, j) = m2[i][j];
|
||||
|
||||
Mat kp(3, 3, CV_32F);
|
||||
double m3[3][3] = {
|
||||
{1.7235093158297350e+003, 0., 4.4128195628736904e+002},
|
||||
{0., 3.4533404000869359e+003, 5.7316457428558715e+002},
|
||||
{0., 0., 1.}
|
||||
};
|
||||
for (auto i = 0; i < kp.rows; i++)
|
||||
for (auto j = 0; j < kp.cols; j++)
|
||||
kp.at<float>(i, j) = m3[i][j];
|
||||
|
||||
auto cArg = CameraArguments::getInstance(r, t, kc, kp);
|
||||
CoreAlgorithm testCase = CoreAlgorithm(path, cArg);
|
||||
testCase.run();
|
||||
vector<Mat> coordinates=testCase.getCoordinates();
|
||||
cloud->width = coordinates.size();
|
||||
cloud->height = 1;
|
||||
cloud->is_dense = false;
|
||||
cloud->points.resize(cloud->width * cloud->height);
|
||||
auto index = 0;
|
||||
for (size_t i = 0; i < cloud->points.size(); ++i)
|
||||
{
|
||||
cloud->points[i].x = coordinates[index].at<float>(0, 0);
|
||||
cloud->points[i].y = coordinates[index].at<float>(0, 1);
|
||||
cloud->points[i].z = coordinates[index].at<float>(0, 2);
|
||||
index++;
|
||||
}
|
||||
|
||||
auto pclData = PointCloudData::getInstance(*cloud);
|
||||
pclData->setCloud(*cloud);
|
||||
// cout << "over" << "\n";
|
||||
}
|
||||
|
||||
void YourThread::setPath(string pathArg)
|
||||
{
|
||||
path = pathArg;
|
||||
}
|
||||
25
Classes/YourThread.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include <qthread.h>
|
||||
#include <pcl/point_types.h>
|
||||
#include <pcl/io/vtk_lib_io.h>
|
||||
#include "PointCloudData.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace pcl;
|
||||
|
||||
class YourThread :
|
||||
public QThread
|
||||
{
|
||||
public:
|
||||
YourThread(PointCloud<PointXYZRGB> *cloud);
|
||||
~YourThread(){}
|
||||
void setPath(string pathArg);
|
||||
|
||||
|
||||
private:
|
||||
PointCloud<PointXYZRGB> *cloud;
|
||||
string path;
|
||||
protected:
|
||||
void run();
|
||||
};
|
||||
@@ -5,8 +5,8 @@
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
AllocConsole();//分配控制台
|
||||
freopen("CONOUT$", "w+t", stdout);//向控制台输出
|
||||
AllocConsole();// 分配控制台
|
||||
freopen("CONOUT$", "w+t", stdout);// 向控制台输出
|
||||
QApplication a(argc, argv);
|
||||
Loading l;
|
||||
l.show();
|
||||
|
||||
3071
Data/result/1.pcd
Normal file
176786
Data/result/ball.pcd
Normal file
35958
Data/result/bunny.pcd
Normal file
BIN
Data/result/pcloud-dense.ply
Normal file
BIN
Data/result/pcloud.ply
Normal file
BIN
Data/result/rail-dense.ply
Normal file
100011
Data/result/rail.pcd
Normal file
BIN
Data/result/rail.ply
Normal file
BIN
Data/result/result.ply
Normal file
BIN
Data/result/result_ball.ply
Normal file
BIN
Data/result/result_generate.pcd
Normal file
BIN
Data/result/table_scene_lms400.pcd
Normal file
100011
Data/result/wheel.pcd
Normal file
BIN
Doc/poster.pdf
Normal file
BIN
Doc/基于编码结构光的高铁轮轨姿态三维重建.pdf
Normal file
BIN
Doc/结构光三维重建软件用户手册.pdf
Normal file
BIN
Doc/结构光三维重建软件设计模式分析.pdf
Normal file
BIN
Exe/Reconstruction.exe
Executable file
BIN
Exe/Reconstruction.msi
Executable file
BIN
Exe/setup.exe
Executable file
201
LICENSE
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
BIN
Latex/design pattern/0.jpg
Normal file
|
After Width: | Height: | Size: 268 KiB |
27
Latex/design pattern/bjtu-thesis-master/.gitignore
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
*.log
|
||||
*.aux
|
||||
*.synctex.gz
|
||||
*.out
|
||||
*.toc
|
||||
BIN
Latex/design pattern/bjtu-thesis-master/0.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/1.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/10.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/11.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/12.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/13.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/14.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/15.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/16.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/17.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/18.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/19.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/2.png
Normal file
|
After Width: | Height: | Size: 212 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/20.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/21.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/22.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/3.png
Normal file
|
After Width: | Height: | Size: 422 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/4.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/5.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/6.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/7.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/8.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/9.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
460
Latex/design pattern/bjtu-thesis-master/BJTU-thesis.cls
Normal file
@@ -0,0 +1,460 @@
|
||||
%===================================================
|
||||
|
||||
%===================================================
|
||||
|
||||
%导入需要的宏包
|
||||
\RequirePackage{amsmath,amsthm,amsfonts,amssymb,bm,mathrsfs,upgreek}
|
||||
\RequirePackage{fancyhdr}
|
||||
\RequirePackage{lastpage}
|
||||
|
||||
|
||||
|
||||
%依赖的Latex版本
|
||||
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
|
||||
%声明本文档为模板类
|
||||
\ProvidesClass{BJTU-thesis}[2018/4/27]
|
||||
|
||||
|
||||
%根据用户选项LoadClass
|
||||
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ctexbook}}
|
||||
\newif\if@isEnMaster\@isEnMasterfalse
|
||||
\newif\if@isAcMaster\@isAcMasterfalse
|
||||
\newif\if@isDoctor\@isDoctorfalse
|
||||
\newif\if@isTwoSide\@isTwoSidefalse
|
||||
%专硕
|
||||
\DeclareOption{EnMaster}{\@isEnMastertrue}
|
||||
%学硕
|
||||
\DeclareOption{AcMaster}{\@isAcMastertrue}
|
||||
%博士
|
||||
\DeclareOption{Doctor}{\@isDoctortrue}
|
||||
\DeclareOption{twoside}{\@isTwoSidetrue}
|
||||
\ProcessOptions\relax
|
||||
\if@isTwoSide
|
||||
\LoadClass[zihao=-4,a4paper,twoside,openright,UTF8,space=auto]{ctexbook}
|
||||
\else
|
||||
\LoadClass[zihao=-4,a4paper,oneside,openright,UTF8,space=auto]{ctexbook}
|
||||
\fi
|
||||
|
||||
|
||||
|
||||
%定义使用者需要填写的标签
|
||||
\def\BJTU@label@schoolNumber{学校代码:~}
|
||||
\def\BJTU@label@classification{密级:~}
|
||||
\def\BJTU@label@author{作者姓名:~}
|
||||
\def\BJTU@label@studentNumber{学~~~~~~号:~}
|
||||
\def\BJTU@label@advisor{导师姓名:~}
|
||||
\def\BJTU@label@advisorTitle{职~~~~~~称:~}
|
||||
\def\BJTU@label@engineeringMasterField{工程硕士专业领域:~}
|
||||
\def\BJTU@label@degreeLevel{学位级别:~}
|
||||
\def\BJTU@label@degreeType{学位类别:~}
|
||||
\def\BJTU@label@major{学科专业:~}
|
||||
\def\BJTU@label@researchArea{研究方向:~}
|
||||
\def\BJTU@label@comment{\dag~同等贡献}
|
||||
|
||||
%定义上述标签的默认值
|
||||
\def\BJTU@value@schoolNumber{10004}
|
||||
\def\BJTU@value@classification{公开}
|
||||
\def\BJTU@value@authora{XXXX}
|
||||
\def\BJTU@value@authorb{XXXX}
|
||||
\def\BJTU@value@authorc{XXXX}
|
||||
\def\BJTU@value@authord{XXXX}
|
||||
\def\BJTU@value@authorf{XXXX}
|
||||
\def\BJTU@value@studentNumber{XXXX}
|
||||
\def\BJTU@value@advisor{XXXX}
|
||||
\def\BJTU@value@advisorTitle{XXXX}
|
||||
\def\BJTU@value@engineeringMasterField{XXXX}
|
||||
\if@isDoctor
|
||||
\def\BJTU@value@degreeLevel{博士}
|
||||
\else
|
||||
\def\BJTU@value@degreeLevel{硕士}
|
||||
\fi
|
||||
\def\BJTU@value@degreeType{XXXX}
|
||||
\def\BJTU@value@major{XXXX}
|
||||
\def\BJTU@value@researchArea{XXXX}
|
||||
\def\BJTU@value@title{中文题目}
|
||||
\def\BJTU@value@englishtitle{英文题目}
|
||||
\def\BJTU@value@comment{\dag~同等贡献}
|
||||
|
||||
%定义用户填写上述标签对应值的命令,需要用户在主文档自行调用
|
||||
\newcommand\schooNumber[1]{\def\BJTU@value@schoolNumber{#1}}
|
||||
\newcommand\classification[1]{\def\BJTU@value@classification{#1}}
|
||||
\newcommand\authora[1]{\def\BJTU@value@authora{#1}}
|
||||
\newcommand\authorb[1]{\def\BJTU@value@authorb{#1}}
|
||||
\newcommand\authorc[1]{\def\BJTU@value@authorc{#1}}
|
||||
\newcommand\authord[1]{\def\BJTU@value@authord{#1}}
|
||||
\newcommand\authorf[1]{\def\BJTU@value@authorf{#1}}
|
||||
\newcommand\studentNumber[1]{\def\BJTU@value@studentNumber{#1}}
|
||||
\newcommand\advisor[1]{\def\BJTU@value@advisor{#1}}
|
||||
\newcommand\advisorTitle[1]{\def\BJTU@value@advisorTitle{#1}}
|
||||
\newcommand\engineeringMasterField[1]{\def\BJTU@value@engineeringMasterField{#1}}
|
||||
\newcommand\degreeType[1]{\def\BJTU@value@degreeType{#1}}
|
||||
\newcommand\major[1]{\def\BJTU@value@major{#1}}
|
||||
\newcommand\researchArea[1]{\def\BJTU@value@researchArea{#1}}
|
||||
\newcommand\englishtitle[1]{\def\BJTU@value@englishtitle{#1}}
|
||||
\renewcommand\title[1]{\def\BJTU@value@title{#1}}
|
||||
\newcommand\comment[1]{\def\BJTU@value@comment{#1}}
|
||||
|
||||
|
||||
%版权授权书
|
||||
\newcommand{\makeAuthorization}{
|
||||
\chapter*{学位论文版权使用授权书}
|
||||
\thispagestyle{empty}
|
||||
本学位论文作者完全了解北京交通大学有关保留、使用学位论文的规定。特授权北京交通大学可以将学位论文的全部或部分内容编入有关数据库进行检索,提供阅览服务,并采用影印、缩印或扫描等复制手段保存、汇编以供查阅和借阅。同意学校向国家有关部门或机构送交论文的复印件和磁盘。学校可以为存在馆际合作关系的兄弟高校用户提供文献传递服务和交换服务。
|
||||
|
||||
(保密的学位论文在解密后适用本授权说明)
|
||||
|
||||
\vspace{72pt}
|
||||
学位论文作者签名:~~~~~~~~~~~~~~~~~~~~~~~导师签名:
|
||||
|
||||
\vspace{12pt}
|
||||
签字日期:~~~~~~年~~~月~~~日~~~~~~~~~~~~~~签字日期:~~~~~年~~~月~~~日
|
||||
}
|
||||
|
||||
|
||||
%制作内封
|
||||
\newcommand{\makeInfo}{
|
||||
\newpage
|
||||
\pagenumbering{roman}
|
||||
\thispagestyle{plain}
|
||||
{\songti\zihao{5}\noindent\BJTU@label@schoolNumber\BJTU@value@schoolNumber}
|
||||
\hfill
|
||||
{\songti\zihao{5}\BJTU@label@classification\BJTU@value@classification}
|
||||
%这里控制上下间距
|
||||
\vspace{31.5pt}
|
||||
\begin{center}
|
||||
{\kaishu\zihao{0}北~京~交~通~大~学\\}
|
||||
%这里控制上下间距
|
||||
%\if@isDoctor
|
||||
%{\songti\zihao{2}软件构思综合训练\\}
|
||||
%\else
|
||||
%{\songti\zihao{2}软件构思综合训练\\}
|
||||
%\fi
|
||||
%这里控制上下间距
|
||||
\vspace{44pt}
|
||||
{\songti\zihao{-3}\BJTU@value@title\\}
|
||||
%这里控制上下间距
|
||||
\vspace{15pt}
|
||||
{\songti\zihao{-3}\BJTU@value@englishtitle\\}
|
||||
\end{center}
|
||||
%这里控制上下间距
|
||||
\vspace{48pt}
|
||||
{\songti\zihao{4}
|
||||
\begin{tabular}{lp{30mm}l}
|
||||
\BJTU@label@author \BJTU@value@author& &\BJTU@label@studentNumber \BJTU@value@studentNumber \\
|
||||
\\
|
||||
\BJTU@label@advisor \BJTU@value@advisor& &\BJTU@label@advisorTitle \BJTU@value@advisorTitle \\
|
||||
\\
|
||||
\if@isEnMaster
|
||||
\BJTU@label@engineeringMasterField \BJTU@value@engineeringMasterField& &\BJTU@label@degreeLevel \BJTU@value@degreeLevel \\
|
||||
\else
|
||||
\BJTU@label@degreeType \BJTU@value@degreeType& &\BJTU@label@degreeLevel \BJTU@value@degreeLevel \\
|
||||
\\
|
||||
\BJTU@label@major \BJTU@value@major& &\BJTU@label@researchArea \BJTU@value@researchArea \\
|
||||
\fi
|
||||
\end{tabular}
|
||||
}
|
||||
\vfill
|
||||
\begin{center}
|
||||
{\songti\zihao{4}\textbf{北京交通大学}软件学院\\ \vspace{10pt}2018年4月}
|
||||
\end{center}
|
||||
}
|
||||
|
||||
|
||||
%重新定义致谢环境
|
||||
\renewenvironment{thanks}{
|
||||
\chapter*{致谢}\thispagestyle{plain}
|
||||
}{}
|
||||
|
||||
|
||||
|
||||
%定义中文摘要环境
|
||||
%%页眉部分加章标题的问题尚未解决
|
||||
\newenvironment{abstract}{
|
||||
\chapter*{摘要}
|
||||
\markboth{摘要}{摘要}
|
||||
\addcontentsline{toc}{chapter}{摘要}
|
||||
}{}
|
||||
|
||||
%定义英文摘要环境
|
||||
\newenvironment{englishabstract}{
|
||||
\chapter*{ABSTRACT}
|
||||
\markboth{ABSTRACT}{ABSTRACT}
|
||||
\addcontentsline{toc}{chapter}{ABSTRACT}
|
||||
}{}
|
||||
|
||||
%定义中英文关键词命令
|
||||
\newcommand{\keywords}[1]{\textbf{关键词:}#1}
|
||||
\newcommand{\englishkeywords}[1]{\textbf{KEYWORDS:~}#1}
|
||||
|
||||
|
||||
|
||||
%%定义正文的页眉页脚格式
|
||||
\def\BJTU@chapter{}
|
||||
\fancypagestyle{BJTU@heading}{
|
||||
\fancyhf{}
|
||||
\fancyhead[L]{
|
||||
\if@isDoctor
|
||||
结构光三维重建软件设计模式分析
|
||||
\else
|
||||
结构光三维重建软件设计模式分析
|
||||
\fi
|
||||
}
|
||||
\fancyhead[R]{\leftmark}
|
||||
\fancyfoot[C]{\thepage}
|
||||
}
|
||||
|
||||
|
||||
|
||||
%%设置页边距和装订线
|
||||
\usepackage[
|
||||
top=3.5cm,
|
||||
bottom=2.5cm,
|
||||
left=1.5cm,
|
||||
right=2.5cm,
|
||||
bindingoffset=1cm,
|
||||
headheight=15pt
|
||||
]{geometry}
|
||||
|
||||
%% 设置章节格式
|
||||
\ctexset{chapter={
|
||||
name={},
|
||||
number = {\arabic{chapter}},
|
||||
format = {\heiti \centering \zihao{3}},
|
||||
pagestyle = {BJTU@heading},
|
||||
beforeskip = 28bp,
|
||||
afterskip = 20bp,
|
||||
fixskip = true,
|
||||
}
|
||||
}
|
||||
|
||||
%% 设置一级章节格式
|
||||
\ctexset{section={
|
||||
format={\raggedright \bfseries \sffamily \zihao{4}},
|
||||
beforeskip = 28bp plus 1ex minus .2ex,
|
||||
afterskip = 24bp plus .2ex,
|
||||
fixskip = true,
|
||||
}
|
||||
}
|
||||
|
||||
% 设置二级标题格式
|
||||
|
||||
%黑体小四加粗顶左,单倍行距,序号与题目间空一个汉字符
|
||||
|
||||
\ctexset{subsection={
|
||||
format = {\bfseries \sffamily \raggedright \zihao{-4}},
|
||||
beforeskip =28bp plus 1ex minus .2ex,
|
||||
afterskip = 24bp plus .2ex,
|
||||
fixskip = true,
|
||||
}
|
||||
}
|
||||
|
||||
% 设置三节标题格式:黑体小四居左书写,单倍行距,序号与题目间空一个汉字符
|
||||
|
||||
\ctexset{subsubsection={
|
||||
format={\heiti \raggedright \zihao{-4}},
|
||||
beforeskip=28bp plus 1ex minus .2ex,
|
||||
afterskip=24bp plus .2ex,
|
||||
fixskip=true,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
%目录
|
||||
\ifxetex % xelatex
|
||||
\RequirePackage[xetex]{hyperref}
|
||||
\hypersetup{
|
||||
bookmarksnumbered,
|
||||
colorlinks,
|
||||
linkcolor=black,
|
||||
citecolor=black,
|
||||
plainpages=false,
|
||||
pdfstartview=FitH
|
||||
}
|
||||
\else
|
||||
\ifpdf
|
||||
\RequirePackage[pdftex,unicode]{hyperref}
|
||||
\else
|
||||
\RequirePackage[dvipdfmx,unicode]{hyperref}
|
||||
\fi
|
||||
\fi
|
||||
|
||||
%\addtocontents{toc}{\protect\hypersetup{hidelinks}}
|
||||
\addtocontents{lot}{\protect\hypersetup{hidelinks}}
|
||||
\addtocontents{lof}{\protect\hypersetup{hidelinks}}
|
||||
|
||||
\RequirePackage{titletoc}
|
||||
\titlecontents{chapter}[0pt]{\songti \zihao{4}}
|
||||
{\thecontentslabel\hspace{\ccwd}}{}
|
||||
{\hspace{.5em}\titlerule*{.}\contentspage}
|
||||
\titlecontents{section}[2\ccwd]{\songti \zihao{-4}}
|
||||
{\thecontentslabel\hspace{\ccwd}}{}
|
||||
{\hspace{.5em}\titlerule*{.}\contentspage}
|
||||
\titlecontents{subsection}[4\ccwd]{\songti \zihao{-4}}
|
||||
{\thecontentslabel\hspace{\ccwd}}{}
|
||||
{\hspace{.5em}\titlerule*{.}\contentspage}
|
||||
|
||||
\titlecontents{figure}[0pt]{\songti\zihao{-4}}
|
||||
{\figurename~\thecontentslabel\quad}{\hspace*{-1.5cm}}
|
||||
{\hspace{.5em}\titlerule*{.}\contentspage}
|
||||
|
||||
\titlecontents{table}[0pt]{\songti\zihao{-4}}
|
||||
{\tablename~\thecontentslabel\quad}{\hspace*{-1.5cm}}
|
||||
{\hspace{.5em}\titlerule*{.}\contentspage}
|
||||
|
||||
\renewcommand\tableofcontents{%
|
||||
\chapter*{\contentsname}%目录里显示“目录”,否则\chapter*
|
||||
\@mkboth{\MakeUppercase\contentsname}{\MakeUppercase\contentsname}%
|
||||
\pdfbookmark[0]{目录}{bittoc}
|
||||
\@starttoc{toc}%
|
||||
}
|
||||
|
||||
|
||||
|
||||
%设定文档页眉页脚
|
||||
\pagestyle{BJTU@heading}
|
||||
%必须在设置完文档的页眉页脚格式之后再重定义此命令
|
||||
\rhead{\thepage\ / \pageref{LastPage} \small 页}
|
||||
|
||||
%%定义制作论文封面命令
|
||||
\newcommand{\makecover}{
|
||||
\newpage\thispagestyle{empty}
|
||||
\vspace{50pt}
|
||||
\begin{figure}
|
||||
\centering
|
||||
\includegraphics*[]{logo.png}
|
||||
\end{figure}
|
||||
\vspace{18pt}
|
||||
\begin{center}
|
||||
\if@isDoctor
|
||||
{\songti\zihao{-1}\bfseries{基于编码结构光的高铁轮轨姿态三维重建\\}}
|
||||
\else
|
||||
{\songti\zihao{-1}\bfseries{基于编码结构光的高铁轮轨姿态三维重建\\}}
|
||||
\fi
|
||||
\vspace{30pt}
|
||||
\textbf{{\songti\zihao{0}\BJTU@value@title\\}}
|
||||
\vspace{115pt}
|
||||
\begin{tabular}{l}
|
||||
{\songti\zihao{4}负责人:\BJTU@value@authora}\\
|
||||
\\
|
||||
{\songti\zihao{4}其他成员:\BJTU@value@authorb}\\
|
||||
\\
|
||||
{\songti\zihao{4}指导教师:\BJTU@value@advisor}\\
|
||||
\end{tabular}
|
||||
\\
|
||||
\vspace{80pt}
|
||||
{\songti\zihao{4}\textbf{北京交通大学}计算机与信息技术学院\\\vspace{14pt}2020年6月}
|
||||
\end{center}
|
||||
}
|
||||
|
||||
|
||||
%% graphics packages
|
||||
\RequirePackage{graphicx}
|
||||
\renewcommand{\tablename}{表}
|
||||
\setlength{\belowcaptionskip}{4pt}
|
||||
\setlength{\abovecaptionskip}{4pt} % 设置 caption 与上下文间距
|
||||
|
||||
|
||||
|
||||
%% 如果插入的图片没有指定扩展名,那么依次搜索下面的扩展名所对应的文件
|
||||
\DeclareGraphicsExtensions{.pdf,.eps,.png,.jpg,.jpeg}
|
||||
% ccaption -- bicaption
|
||||
%\RequirePackage{ccaption}
|
||||
%\captiondelim{\ }
|
||||
%\captionnamefont{\songti\zihao{5}}
|
||||
%\captiontitlefont{\songti\zihao{5}}
|
||||
|
||||
|
||||
%% sort and compress citations
|
||||
\RequirePackage[numbers,square,comma,super,sort&compress]{natbib}
|
||||
% 上标引用
|
||||
\newcommand{\upcite}[1]{\textsuperscript{\cite{#1}}}
|
||||
|
||||
|
||||
% 将浮动参数设为较宽松的值
|
||||
\renewcommand{\textfraction}{0.15}
|
||||
\renewcommand{\topfraction}{0.85}
|
||||
\renewcommand{\bottomfraction}{0.65}
|
||||
\renewcommand{\floatpagefraction}{0.60}
|
||||
|
||||
% 颜色宏包
|
||||
\RequirePackage{xcolor}
|
||||
|
||||
|
||||
% 中文破折号
|
||||
\newcommand{\cndash}{\rule{0.0em}{0pt}\rule[0.35em]{1.4em}{0.05em}\rule{0.2em}{0pt}}
|
||||
|
||||
% listings 源代码显示宏包
|
||||
\RequirePackage{listings}
|
||||
\lstset{tabsize=4, %
|
||||
frame=shadowbox, %把代码用带有阴影的框圈起来
|
||||
commentstyle=\color{red!50!green!50!blue!50},%浅灰色的注释
|
||||
rulesepcolor=\color{red!20!green!20!blue!20},%代码块边框为淡青色
|
||||
keywordstyle=\color{blue!90}\bfseries, %代码关键字的颜色为蓝色,粗体
|
||||
showstringspaces=false,%不显示代码字符串中间的空格标记
|
||||
stringstyle=\ttfamily, % 代码字符串的特殊格式
|
||||
keepspaces=true, %
|
||||
breakindent=22pt, %
|
||||
numbers=left,%左侧显示行号
|
||||
stepnumber=1,%
|
||||
numberstyle=\tiny, %行号字体用小号
|
||||
basicstyle=\footnotesize, %
|
||||
showspaces=false, %
|
||||
flexiblecolumns=true, %
|
||||
breaklines=true, %对过长的代码自动换行
|
||||
breakautoindent=true,%
|
||||
breakindent=4em, %
|
||||
aboveskip=1em, %代码块边框
|
||||
%% added by http://bbs.ctex.org/viewthread.php?tid=53451
|
||||
fontadjust,
|
||||
captionpos=t,
|
||||
framextopmargin=2pt,framexbottommargin=2pt,abovecaptionskip=-3pt,belowcaptionskip=3pt,
|
||||
xleftmargin=4em,xrightmargin=4em, % 设定listing左右的空白
|
||||
texcl=true,
|
||||
% 设定中文冲突,断行,列模式,数学环境输入,listing数字的样式
|
||||
extendedchars=false,columns=flexible,mathescape=true
|
||||
numbersep=-1em
|
||||
}
|
||||
\renewcommand{\lstlistingname}{代码} %% 重命名Listings标题头
|
||||
|
||||
%% enumerate 列表环境间距调节
|
||||
\usepackage{enumitem}
|
||||
% \setenumerate[1]{itemsep=0pt,partopsep=0pt,parsep=\parskip,topsep=5pt}
|
||||
% \setitemize[1]{itemsep=0pt,partopsep=0pt,parsep=\parskip,topsep=0pt}
|
||||
% \setdescription{itemsep=0pt,partopsep=0pt,parsep=\parskip,topsep=5pt}
|
||||
|
||||
%_ 参考文献风格 added by wei.jianwen@gmail.com
|
||||
\bibliographystyle{GBT7714-2005NLang}
|
||||
|
||||
%_ 参考文献环境
|
||||
\renewenvironment{thebibliography}[1]
|
||||
{\zihao{5}
|
||||
\chapter*{\bibname}
|
||||
\@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}%
|
||||
\addcontentsline{toc}{chapter}{参考文献}
|
||||
\list{\@biblabel{\@arabic\c@enumiv}}%
|
||||
{\settowidth\labelwidth{\@biblabel{#1}}%
|
||||
\leftmargin\labelwidth
|
||||
\advance\leftmargin\labelsep
|
||||
\setlength{\parsep}{1mm}
|
||||
\setlength{\labelsep}{0.5em}
|
||||
\setlength{\itemsep}{0.05pc}
|
||||
\setlength{\listparindent}{0in}
|
||||
\setlength{\itemindent}{0in}
|
||||
\setlength{\rightmargin}{0in}
|
||||
\@openbib@code
|
||||
\usecounter{enumiv}%
|
||||
\let\p@enumiv\@empty
|
||||
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
|
||||
\sloppy
|
||||
\clubpenalty4000
|
||||
\@clubpenalty \clubpenalty
|
||||
\widowpenalty4000%
|
||||
\sfcode`\.\@m}
|
||||
{\def\@noitemerr
|
||||
{\@latex@warning{Empty `thebibliography' environment}}%
|
||||
\endlist}
|
||||
|
||||
|
||||
|
||||
|
||||
\endinput
|
||||
2545
Latex/design pattern/bjtu-thesis-master/GBT7714-2005NLang.bst
Normal file
201
Latex/design pattern/bjtu-thesis-master/LICENSE
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
11
Latex/design pattern/bjtu-thesis-master/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
- 说明:
|
||||
|
||||
北京交通大学学位论文非官方latex模版,供学习交流使用。
|
||||
|
||||
- 功能:
|
||||
|
||||
基本满足北京交通大学专业硕士、学术硕士和博士的学位论文格式要求,但细节之处仍需要完善。
|
||||
|
||||
- 参考:
|
||||
|
||||
[北京理工大学学位论文latex模版](https://github.com/BIT-thesis/LaTeX-template)。
|
||||
8
Latex/design pattern/bjtu-thesis-master/build.bat
Normal file
@@ -0,0 +1,8 @@
|
||||
del *.log
|
||||
del *.aux
|
||||
del *.toc
|
||||
del *.out
|
||||
del *.bbl
|
||||
del *.blg
|
||||
del chapters\*.aux
|
||||
del *.synctex.gz
|
||||
1
Latex/design pattern/bjtu-thesis-master/build.sh
Normal file
@@ -0,0 +1 @@
|
||||
rm *.aux *.log *.toc *.synctex.gz *.out chapters/*.aux *.bbl *.blg
|
||||
@@ -0,0 +1,5 @@
|
||||
\begin{abstract}
|
||||
[鼠标左键单击选择该段落,输入替换之。内容为小四号宋体。] 中文摘要应将学位论文的内容要点简短明了地表达出来,硕士学位论文一般为500~1000字,博士学位论文一般为1000~2000字。留学生英文版学位论文不少于3000字中文摘要,留学生英文版博士学位论文不少于5000字中文摘要。字体为宋体小四号。内容应包括工作目的、研究方法、成果和结论。要突出本论文的创新点,语言力求精炼。为了便于文献检索,应在本页下方另起一行注明论文的关键词(3-8个),如有可能,尽量采用《汉语主题词表》等词表提供的规范词。图X幅,表X个,参考文献X篇。
|
||||
|
||||
\keywords{你好;世界}
|
||||
\end{abstract}
|
||||
@@ -0,0 +1,5 @@
|
||||
\begin{englishabstract}
|
||||
English Abstract.
|
||||
|
||||
\englishkeywords{Hello; World}
|
||||
\end{englishabstract}
|
||||
@@ -0,0 +1,3 @@
|
||||
\begin{thanks}
|
||||
放置在摘要页前,对象包括:1)国家科学基金,资助研究工作的奖学金基金,合同单位,资助或支持的企业、组织或个人。2)协助完成研究工作和提供便利条件的组织或个人。3)在研究工作中提出建议和提供帮助的人。4)给予转载和引用权的资料、图片、文献、研究思想和设想的所有者。5)其他应感谢的组织和个人。
|
||||
\end{thanks}
|
||||
216
Latex/design pattern/bjtu-thesis-master/demo.bbl
Normal file
@@ -0,0 +1,216 @@
|
||||
% Generated by BUPTThesis.bst, version: 0.2 (2009/01/25)
|
||||
\begin{thebibliography}{10}
|
||||
|
||||
\bibitem{a}
|
||||
刘宁, 郑东霞.
|
||||
基于UML的多视图软件体系结构描述方法研究~[J].
|
||||
计算机应用研究: 173--175.
|
||||
|
||||
\bibitem{Garlan1995Introduction}
|
||||
Garlan~D, Perry~D~E.
|
||||
Introduction to the Special Issue on Software Architecture~[M].
|
||||
1995.
|
||||
|
||||
\bibitem{ShawSoftware}
|
||||
Shaw~M, Garlan~D.
|
||||
Software Architecture : Perspectives on an Emerging Discipline / M. Shaw, D.
|
||||
Garlan~[J].
|
||||
|
||||
\bibitem{Allen1994Formalizing}
|
||||
Allen~R~J, Garlan~D.
|
||||
Formalizing Architectural Connection~[C].
|
||||
In Software Engineering, 1994. Proceedings. ICSE-16., 16th International
|
||||
Conference on, 1994.
|
||||
|
||||
\bibitem{Ivar1999Unified}
|
||||
Ivar~J, Grady~B, James~R.
|
||||
Unified software development process~[J], 1999.
|
||||
|
||||
\bibitem{Kruchten2006The}
|
||||
Kruchten~P, Obbink~H, Stafford~J.
|
||||
The Past, Present, and Future for Software Architecture~[J].
|
||||
IEEE Software, 2006, 23~(2): 22--30.
|
||||
|
||||
\bibitem{ShawThe}
|
||||
Shaw~M, Clements~P.
|
||||
The Golden Age of Software Architecture: A Comprehensive Survey~[J].
|
||||
|
||||
\bibitem{DashofyA}
|
||||
Dashofy~E~M, Hoek~A v~d, Taylor~R~N.
|
||||
A comprehensive approach for the development of modular software architecture
|
||||
description languages~[J].
|
||||
Acm Transactions on Software Engineering \& Methodology: 199--245.
|
||||
|
||||
\bibitem{Mei2002ABC}
|
||||
Mei~H, Chen~F, Wang~Q, et~al.
|
||||
ABC/ADL: An ADL Supporting Component Composition~[C].
|
||||
In Proceedings of the 4th International Conference on Formal Engineering
|
||||
Methods: Formal Methods and Software Engineering, 2002.
|
||||
|
||||
\bibitem{Medvidovic2000A}
|
||||
Medvidovic~N, Taylor~R~N.
|
||||
A Classification and Comparison Framework for Software Architecture Description
|
||||
Languages~[C].
|
||||
2000.
|
||||
|
||||
\bibitem{Oquendo2004}
|
||||
Oquendo~F.
|
||||
\&\#960;-ADL:an Architecture Description Language based on the higher-order typed
|
||||
\&\#960;-calculus for specifying dynamic and mobile software architectures~[J].
|
||||
Acm Sigsoft Software Engineering Notes, 2004.
|
||||
|
||||
\bibitem{Schmuller2004Sams}
|
||||
Schmuller~J.
|
||||
Sams Teach Yourself UML in 24 Hours, Complete Starter Kit (3rd Edition)~[M].
|
||||
2004.
|
||||
|
||||
\bibitem{b}
|
||||
孙昌爱, 金茂忠, 刘超.
|
||||
软件体系结构研究综述~[J].
|
||||
软件学报, 2002, 13~(7): 1228--1237.
|
||||
|
||||
\bibitem{c}
|
||||
梅宏, 申峻嵘.
|
||||
软件体系结构研究进展~[J].
|
||||
软件学报, 2006, 17~(6): 1257--1275.
|
||||
|
||||
\bibitem{d}
|
||||
朱雪阳.
|
||||
双重软件体系结构描述框架XYZ/ADL~[J].
|
||||
计算机研究与发展, 2007, 44~(9): 1485--1494.
|
||||
|
||||
\bibitem{e}
|
||||
王晓光, 冯耀东, 梅宏.
|
||||
ABC/ADL:一种基于XML的软件体系结构描述语言~[J].
|
||||
计算机研究与发展, 2004~(9): 1521--1531.
|
||||
|
||||
\bibitem{f}
|
||||
杨敬中, 戎玫, 张广泉, et~al.
|
||||
面向方面的软件体系结构描述语言AO-ADL~[J].
|
||||
计算机工程, 2008, 34~(10): 80--82.
|
||||
|
||||
\bibitem{g}
|
||||
毛斐巧, 齐德昱.
|
||||
软件体系结构风格研究现状及存在的问题~[J].
|
||||
计算机应用研究, 2008, 25~(8): 2270--2273.
|
||||
|
||||
\bibitem{h}
|
||||
李俊娥, 周洞汝.
|
||||
“平台/插件”软件体系结构风格~[J].
|
||||
小型微型计算机系统: 110--115.
|
||||
|
||||
\bibitem{i}
|
||||
汪保杰, 王如龙.
|
||||
Customer Relationship Management System Based on Orthogonal Software
|
||||
Architecture%基于正交软件体系结构的CRM系统~[J].
|
||||
计算机工程: 117--120.
|
||||
|
||||
\bibitem{j}
|
||||
巩绪芳, 周颖, 李必信.
|
||||
软件体系结构测试技术的现状与思考~[J]: 76--83.
|
||||
|
||||
\bibitem{k}
|
||||
许慧, 伦立军.
|
||||
基于π演算的软件体系结构测试技术~[J].
|
||||
计算机工程, 2009, 35~(13): 55--57.
|
||||
|
||||
\bibitem{l}
|
||||
任洪敏, 钱乐秋.
|
||||
构件组装及其形式化推导研究~[J].
|
||||
软件学报: 38--46.
|
||||
|
||||
\bibitem{m}
|
||||
向俊莲, 杨杰, 梅宏.
|
||||
基于软件体系结构的构件组装工具ABC-Tool~[J].
|
||||
计算机研究与发展, 2004, 41~(6): 956--964.
|
||||
|
||||
\bibitem{apriori}
|
||||
苗放[1, 2].
|
||||
面向数据的软件体系结构初步探讨*~[J].
|
||||
计算机科学与探索, 2016~(10).
|
||||
|
||||
\bibitem{la}
|
||||
王梦佳.
|
||||
DOA下数据注册方法的初步研究与实现~[D].
|
||||
[S.~l.]: 成都理工大学, 2015.
|
||||
|
||||
\bibitem{lb}
|
||||
李国强.
|
||||
基于DOA的面向数据的碎片化应用系统构建方法研究~[D].
|
||||
[S.~l.]: 成都理工大学, 2015.
|
||||
|
||||
\bibitem{lc}
|
||||
袁进俊.
|
||||
DOA下分布式DRC的元数据分级存储模型研究~[D].
|
||||
[S.~l.]: 成都理工大学, 2015.
|
||||
|
||||
\bibitem{ld}
|
||||
刘彬.
|
||||
分布式数据注册中心数据分区存储策略研究~[D].
|
||||
[S.~l.]: 成都理工大学, 2016.
|
||||
|
||||
\bibitem{za}
|
||||
苗放[1, 2].
|
||||
面向数据的软件体系结构初步探讨*~[J].
|
||||
计算机科学与探索, 2016~(10).
|
||||
|
||||
\bibitem{zb}
|
||||
李国强.
|
||||
基于DOA的面向数据的碎片化应用系统构建方法研究~[D].
|
||||
[S.~l.]: 成都理工大学, 2015.
|
||||
|
||||
\bibitem{zc}
|
||||
谭铁成.
|
||||
DOA下DAC中用户认证机制及证书授权技术研究~[D].
|
||||
[S.~l.]: 成都理工大学, 2015.
|
||||
|
||||
\bibitem{zd}
|
||||
陈林.
|
||||
DOA下DAC中数据授权机制及公共密钥基础设施研究~[D].
|
||||
[S.~l.]: 成都理工大学, 2015.
|
||||
|
||||
\bibitem{ze}
|
||||
李晓波, 祝孔强, 贾光宇, et~al.
|
||||
科学数据共享技术平台构想~[J].
|
||||
中国基础科学: 52--57.
|
||||
|
||||
\bibitem{zf}
|
||||
孙卫, 罗之兰, 张蔚.
|
||||
科学数据共享平台的数据管理研究~[J].
|
||||
科学学与科学技术管理: 34--38.
|
||||
|
||||
\bibitem{DeanMapReduce}
|
||||
Dean~J, Ghemawat~S.
|
||||
MapReduce: Simplified Data Processing on Large Clusters~[J].
|
||||
Communications of the ACM: p.107--113.
|
||||
|
||||
\bibitem{gamesfromwithin.com}
|
||||
Noel.
|
||||
Data-Oriented Design (Or Why You Might Be Shooting Yourself in The Foot With
|
||||
OOP).
|
||||
2009.
|
||||
\url{http://gamesfromwithin.com/data-oriented-design}.
|
||||
|
||||
\bibitem{Hey2009The}
|
||||
Hey~T, Tansley~S, Tolle~K.
|
||||
The Fourth Paradigm: Data-Intensive Scientific Discovery~[J].
|
||||
Proceedings of the IEEE, 2009, 99~(8): 1334--1337.
|
||||
|
||||
\bibitem{KirkpatrickBig}
|
||||
Kirkpatrick, Robert.
|
||||
Big Data for Development~[J].
|
||||
Big Data: 3--4.
|
||||
|
||||
\bibitem{tuzipei.baijia.baidu.com}
|
||||
Zipei~T.
|
||||
All business digitization: specific ideas of traditional business
|
||||
transformation.
|
||||
2015.
|
||||
\url{http://tuzipei.baijia.baidu.com/article/47068.}
|
||||
|
||||
\bibitem{Labrinidis2012Challenges}
|
||||
Labrinidis~A, Jagadish~H.
|
||||
Challenges and opportunities with big data~[J].
|
||||
Proceedings of the VLDB Endowment, 2012, 5~(12): 2032--2033.
|
||||
|
||||
\end{thebibliography}
|
||||
92
Latex/design pattern/bjtu-thesis-master/demo.blg
Normal file
@@ -0,0 +1,92 @@
|
||||
This is BibTeX, Version 0.99d (TeX Live 2019/W32TeX)
|
||||
Capacity: max_strings=100000, hash_size=100000, hash_prime=85009
|
||||
The top-level auxiliary file: demo.aux
|
||||
The style file: GBT7714-2005NLang.bst
|
||||
Illegal, another \bibstyle command---line 20 of file demo.aux
|
||||
: \bibstyle
|
||||
: {unsrt}
|
||||
I'm skipping whatever remains of this command
|
||||
Illegal, another \bibstyle command---line 21 of file demo.aux
|
||||
: \bibstyle
|
||||
: {unsrt}
|
||||
I'm skipping whatever remains of this command
|
||||
Reallocated singl_function (elt_size=4) to 100 items from 50.
|
||||
Reallocated wiz_functions (elt_size=4) to 6000 items from 3000.
|
||||
Database file #1: reference/ref.bib
|
||||
-- BUPTThesis.bst version 0.2 (2009/01/25) by Yu Zhang.
|
||||
-- http://code.google.com/p/buptthesis/
|
||||
-- See the "userguide.pdf" manual for usage information.
|
||||
Warning--there's neither address nor publisher in Garlan1995Introduction
|
||||
Warning--empty journal in ShawSoftware
|
||||
Warning--empty pages in ShawSoftware
|
||||
Warning--The editor in Allen1994Formalizing is missing.
|
||||
Warning--empty editor in Allen1994Formalizing
|
||||
Warning--empty pages in Allen1994Formalizing
|
||||
Warning--empty journal in Ivar1999Unified
|
||||
Warning--empty pages in Ivar1999Unified
|
||||
Warning--empty journal in ShawThe
|
||||
Warning--empty pages in ShawThe
|
||||
Warning--The editor in Mei2002ABC is missing.
|
||||
Warning--empty editor in Mei2002ABC
|
||||
Warning--empty pages in Mei2002ABC
|
||||
Warning--empty editor in Medvidovic2000A
|
||||
Warning--empty booktitle in Medvidovic2000A
|
||||
Warning--empty pages in Medvidovic2000A
|
||||
Warning--empty pages in Oquendo2004
|
||||
Warning--there's neither address nor publisher in Schmuller2004Sams
|
||||
Warning--empty journal in j
|
||||
Warning--empty pages in apriori
|
||||
Warning--there's a school but no address in la
|
||||
Warning--there's a school but no address in lb
|
||||
Warning--there's a school but no address in lc
|
||||
Warning--there's a school but no address in ld
|
||||
Warning--empty pages in za
|
||||
Warning--there's a school but no address in zb
|
||||
Warning--there's a school but no address in zc
|
||||
Warning--there's a school but no address in zd
|
||||
Warning--empty pages in gamesfromwithin.com
|
||||
Warning--empty pages in tuzipei.baijia.baidu.com
|
||||
|
||||
Done.
|
||||
You've used 41 entries,
|
||||
4577 wiz_defined-function locations,
|
||||
1206 strings with 12162 characters,
|
||||
and the built_in function-call counts, 19123 in all, are:
|
||||
= -- 2216
|
||||
> -- 296
|
||||
< -- 21
|
||||
+ -- 170
|
||||
- -- 85
|
||||
* -- 1474
|
||||
:= -- 2076
|
||||
add.period$ -- 121
|
||||
call.type$ -- 41
|
||||
change.case$ -- 0
|
||||
chr.to.int$ -- 0
|
||||
cite$ -- 71
|
||||
duplicate$ -- 1218
|
||||
empty$ -- 2034
|
||||
format.name$ -- 85
|
||||
if$ -- 4736
|
||||
int.to.chr$ -- 0
|
||||
int.to.str$ -- 41
|
||||
missing$ -- 0
|
||||
newline$ -- 207
|
||||
num.names$ -- 41
|
||||
pop$ -- 153
|
||||
preamble$ -- 1
|
||||
purify$ -- 0
|
||||
quote$ -- 2
|
||||
skip$ -- 617
|
||||
stack$ -- 0
|
||||
substring$ -- 1968
|
||||
swap$ -- 387
|
||||
text.length$ -- 21
|
||||
text.prefix$ -- 0
|
||||
top$ -- 5
|
||||
type$ -- 469
|
||||
warning$ -- 30
|
||||
while$ -- 168
|
||||
width$ -- 43
|
||||
write$ -- 326
|
||||
(There were 2 error messages)
|
||||
BIN
Latex/design pattern/bjtu-thesis-master/demo.pdf
Normal file
408
Latex/design pattern/bjtu-thesis-master/demo.tex
Normal file
@@ -0,0 +1,408 @@
|
||||
\documentclass[article]{BJTU-thesis}
|
||||
\usepackage{url}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{subcaption}
|
||||
\setcounter{tocdepth}{4}
|
||||
\setcounter{secnumdepth}{4}
|
||||
\hypersetup{hidelinks}
|
||||
\renewcommand\thesection{\arabic {section}}
|
||||
\renewcommand\thefigure{\arabic {figure}}
|
||||
%%%%%%%%%%%%%%%填写封面信息%%%%%%%%%%%%%%%%%%%%
|
||||
%\authora{汤新宇 17301137}
|
||||
%\authorb{陈嘉琪 17301060}
|
||||
%\authorc{刘歆怡 17301129}
|
||||
\authora{{\color{white}哈}唐麒}
|
||||
\authorb{罗瑶、赵彦阳}
|
||||
%\authorf{张钰铎 17301145}
|
||||
%\comment{同{\color{white}哈}等{\color{white}哈}贡{\color{white}哈}献}
|
||||
%\studentNumber{16121248}
|
||||
\advisor{尹辉、黄华}
|
||||
%\advisorTitle{教授}
|
||||
%\degreeType{学术型}
|
||||
%\major{机械制造}
|
||||
%\researchArea{切削力分析}
|
||||
\title{结构光三维重建软件\\设计模式分析}
|
||||
\bibliographystyle{unsrt} % BibTex
|
||||
%\englishtitle{The Path Planning of Blade Machining Tool Based on Cutting Force Analysis.}
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%\setmainfont{Times New Roman}
|
||||
\bibliographystyle{unsrt} % BibTex
|
||||
\begin{document}
|
||||
\makecover
|
||||
|
||||
\tableofcontents
|
||||
\newpage
|
||||
|
||||
\newpage
|
||||
\setcounter{page}{1}
|
||||
\section{项目简介}
|
||||
近年来,为了适应社会发展的需求,铁路向着高速、重载、高密度运行方向发展,尤其是在高速铁路领域,我国已经成为世界运营里程最长,动车组开行最多的国家。
|
||||
|
||||
高铁的轮轨姿态反映了车轮与钢轨之间复杂的动态相互作用和约束关系,掌握他们之间真实接触姿态是保障高速铁路安全运营的重要基础。但仅从二维图像上获取轮轨接触姿态是不精确、不可靠的,需要将轮轨表面的特征点提取出来,重建出一个三维模型,才能更加真实正确地获得轮轨接触姿态。但由于高铁轮轨表面相对光滑且无明显特征点,造成特征不易提取,使得重建精度较差。此外,高铁列车的快速运行速度快也给轮轨表面特征点的提取提出了严峻挑战。
|
||||
|
||||
三维重建技术是计算机视觉技术的一个重要分支,是计算机视觉和计算机图像图形学相结合的一个热门研究方向。根据测量时是否与被测物体接触可分为接触式测量与非接触式测量。其中,编码结构光法是一种主动式的非接触式测量方法,具有成本低,精度高,易于实现等优点。
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.7]{0.png}
|
||||
\caption{三维重建技术}
|
||||
\end{figure}
|
||||
|
||||
编码结构光法利用投影仪投射出的一定模式的编码结构光图案对目标物体进行编码,利用摄像机获取物体图像,通过计算机对所得图像进行解码处理,利用摄像机中的图像点和投影仪中的点对应关系计算物体表面点的空间坐标,获得物体的三维信息,从而还原物体三维形状。
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics{1.png}
|
||||
\caption{结构光系统}
|
||||
\end{figure}
|
||||
|
||||
编码结构光法三维重建技术主要由系统标定、结构光编码、图像获取、结构光解码和三维坐标计算等5个关键技术组成。
|
||||
\begin{itemize}
|
||||
\item 系统标定:结构光系统标定包括摄像机和投影仪的标定,从而获取摄像机和投影仪的内外参数;
|
||||
\item 结构光编码:通过编码的方式使图像每一点的“身份”可以被识别;
|
||||
\item 结构光解码:通过一定的解码方案将摄像机采集的投射在目标物体上的结构光图案的二维畸变图像解码;
|
||||
\item 三维坐标计算:结合标定好的系统参数,由光学三角测距原理获获得物体的三维信息。
|
||||
\end{itemize}
|
||||
|
||||
结构光编码方案依据编码策略主要分为时间编码和空间编码两大类。\textbf{时间编码}结构光法是对目标物体表面投射一系列不同的编码图案,获得一组编码图像序列,标记目标物体上同一点在不同时间点的,经过处理获取这一点的结构光。\textbf{空间编码}结构光法能够通过向目标物体投射一幅编码图案,将获得的编码图像与投影图案对照进行解码,获取物体的三维信息。
|
||||
|
||||
空间编码的特点是投影图案只有1幅,图案中每点的码字根据其周围邻近点的信息(如像素值、颜色或几何形状等)得到,适合与动态场景的三维重建。空间编码常用的编码方式主要有基于基于 $De \;Bruijn$ 序列的编码和基于 $M-$ 阵列 的编码。
|
||||
|
||||
综上所述,本项目以机器视觉理论和方法为基础,重点研究基于编码结构光的高铁轮轨姿态三维重建方法。通过编码结构光获取轮轨稠密三维点云数据,三维重建高铁轮轨姿态模型,并实现可视化。
|
||||
|
||||
\section{项目展示}
|
||||
近年来,关于编码结构光法三维重建的研究层出不穷。但现有的基于空间编码结构光的重建方法普遍存在计算时间长、点云稠密度低等问题。为了解决现有方案存在的问题,结合本项目的实际运用场景,设计了基于 $De \;Bruijn$ 序列的条纹模式,同时在图像的 V 通道编码了相位信息。在解码的过程中,通过对拍摄获得的图像进行条纹中心点的分析和小波分析,将二者的分析结果相机和,即可提高点云的稠密度,并避免了相位展开引入的误差,在重建速度上也有一定的改善。
|
||||
|
||||
在此实验方案的基础上,设计并实现了结构光三维重建软件,根据结构光系统进行三维重建的需求,本软件可分为相机标定、三维重建和点云渲染三个模块,下面分别对三个模块的功能进行介绍。
|
||||
\begin{itemize}
|
||||
\item 系统标定模块
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{2.png}
|
||||
\caption{系统标定界面}
|
||||
\end{figure}
|
||||
\begin{itemize}
|
||||
\item[$\blacksquare$] 配置相机和投影仪
|
||||
\item[$\blacksquare$] 上传标定图像
|
||||
\item[$\blacksquare$] 相机拍摄
|
||||
\item[$\blacksquare$] 设置标定板参数
|
||||
\item[$\blacksquare$] 相机(相机和投影仪)标定
|
||||
\item[$\blacksquare$] 保存标定结果
|
||||
\end{itemize}
|
||||
\newpage
|
||||
\item 三维重建模块
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.6]{3.png}
|
||||
\caption{三维重建界面}
|
||||
\label{fig:fig1}
|
||||
\end{figure}
|
||||
\begin{itemize}
|
||||
\item[$\blacksquare$] 投影编码图案
|
||||
\item[$\blacksquare$] 拍摄投影图像
|
||||
\item[$\blacksquare$] 上传本地图像
|
||||
\item[$\blacksquare$] 保存拍摄图像
|
||||
\item[$\blacksquare$] 进行三维重建
|
||||
|
||||
\end{itemize}
|
||||
\item 点云渲染模块
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.6]{4.png}
|
||||
\caption{点云渲染界面}
|
||||
\end{figure}
|
||||
|
||||
\begin{itemize}
|
||||
\item[$\blacksquare$] 渲染点云
|
||||
\item[$\blacksquare$] 改变点云颜色
|
||||
\item[$\blacksquare$] 异常点选择和剔除
|
||||
\item[$\blacksquare$] 泊松曲面重建
|
||||
\item[$\blacksquare$] 导出点云数据
|
||||
\item[$\blacksquare$] 使用帮助
|
||||
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\section{设计模式的运用}
|
||||
在软件工程中,设计模式指的是解决软件设计中常见问题的一种通用的,可重用的解决方案,用于详细设计阶段,是为了解决局部的设计问题。设计模式不是一种可以直接转换成代码的集成设计,关注于某一特定的面向对象设计领域的问题,是一种图和解决问题的描述或模板。
|
||||
|
||||
在本项目中运用了例如单例模式的创建型设计模式\footnote{创建型模式是创建对象,而不是直接实例化对象的模式,可以灵活确定特定情况下创建什么对象。}和代理模式的结构性模式\footnote{结构型模式是将一组对象组合为一个更大的结构体的模式,描述类与对象如何结合组成更大的结构。},在经过分析之后,项目的部分功能实现还可以采用包含责任链模式(一种行为型模式\footnote{行为型模式一种定义系统中对象之间的通信、以及复杂程序中流的控制的模式,行为型模式关心对象之间的通信、流的控制。})在内的其他设计模式,下面对不同的设计模式及其在本项目中的应用进行详细介绍。
|
||||
\subsection{单例模式}
|
||||
|
||||
单例模式是一种创建型模式,他是为了保证一个类只有一个对应的实例被创建,并提供一个指向这一单一实例的全局指针。单例模式的参与者是参与此种模式的类或对象。其类图如下图所示:
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{5.png}
|
||||
\caption{单例模式类图}
|
||||
\end{figure}
|
||||
|
||||
\newpage
|
||||
|
||||
参与单例模式的类定义了让用户访问其唯一实例的实例化操作和获取实例方法的操作,其中获取实例方法是一个类操作。此外,这个类还负责创造和维护唯一实例。
|
||||
|
||||
单例模式有三种实现方式,
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{6.png}
|
||||
\caption{单例模式实现方法——双重检验锁}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{7.png}
|
||||
\caption{单例模式实现方法——懒汉式,线程不安全}
|
||||
\end{figure}
|
||||
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{8.png}
|
||||
\caption{单例模式实现方法-静态内部类}
|
||||
\end{figure}
|
||||
|
||||
需要注意的是第而中实现方法在多线程的情形下,有可能会创建多个实例。
|
||||
|
||||
在本项目中有多处使用单例模式,如类 $Camera$ 和 $Projector$,分别用来初始化、控制相机和投影仪完成标定、拍摄等功能。
|
||||
|
||||
正如在上一节所介绍的,本系统由相机、投影仪和计算机三部分组成,软件的部分功能依赖于相机和投影仪,因此需要通过驱动、接口等获得相机、投影仪的实例,从而可以控制相机和投影仪进行拍摄等。
|
||||
|
||||
在系统标定模块,投影仪需要在标定板上投影一组图片,相机保持与投影相同的帧率进行拍摄,通过拍摄获得的图片,软件可以进行系统标定,从而获得相机参数(如平移参数、旋转参数、焦距等)。下图或部分拍摄获得的图形。
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{9.png}
|
||||
\caption{标定过程拍摄的部分图像}
|
||||
\end{figure}
|
||||
|
||||
而在三维重建模块,同样需要投影设计的编码结构光图案(如\ref{fig:fig1}所示),并对经过物体表面调制的图案进行拍摄。因此,在不同的两个模块均需要类 $Camera$ 和 $Projector$ 的实例,而由于在系统标定过程中,对相机的属性进行了改变,标定的结果与这些属性密切相关,如果在三维重建模块重新获得 $Camera$ 的实例进行拍摄,将导致物体三维坐标的计算产生一定的误差。此外,多次对 $Camera$ 和 $Projector$ 两个类进行实例化,也有可能导致异常的发生和资源的浪费。
|
||||
|
||||
综上所述,本项目对类 $Camera$ 和 $Projector$ 采用了单例模式,保证相机和投影仪对应的类只有一个对应的实例被创建。
|
||||
|
||||
本项目的类图如图\ref{fig:fig5}所示:
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.7]{13.png}
|
||||
\caption{项目类图}
|
||||
\label{fig:fig5}
|
||||
\end{figure}
|
||||
|
||||
使用单例模式的优劣分别如下:
|
||||
\begin{itemize}
|
||||
\item \textbf{优势}
|
||||
\begin{itemize}
|
||||
\item[$\blacksquare$] 参与单例模式的类只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就防止其它对象对自己的实例化,确保所有的对象都访问一个实例
|
||||
\item[$\blacksquare$] 单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性
|
||||
\item[$\blacksquare$] 提供了对唯一实例的受控访问
|
||||
\item[$\blacksquare$] 由于在系统内存中只存在一个对象,因此可以 节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能
|
||||
\item[$\blacksquare$] 避免对共享资源的多重占用。
|
||||
\end{itemize}
|
||||
\item \textbf{劣势}
|
||||
\begin{itemize}
|
||||
\item[$\blacksquare$] 单例类的职责过重,在一定程度上违背了“单一职责原则”
|
||||
\item[$\blacksquare$] 滥用单例将带来一些负面问题,如实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失
|
||||
\item[$\blacksquare$] 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\subsection{适配器模式}
|
||||
适配器模式是一种结构型模式,可以使一个类和接口不匹配的其它类进行交互。适配器将一个类的接口转换为 $Client$ 类期望的另一个接口,让类可以协同工作,否则会因为接口不兼容而无法进行。
|
||||
|
||||
适配器模式的参与者包括:
|
||||
\begin{itemize}
|
||||
\item $Target$:定义 $Client$ 使用的特定于某个域的接口
|
||||
\item $Adapter$:将 $Adaptee$ 接口适配到 $get$ 接口
|
||||
\item $Adoptee$:定义需要被适配的已有接口
|
||||
\item $Client$:与遵循 $Target$ 接口的对象协作
|
||||
\end{itemize}
|
||||
|
||||
适配器可以分为两种:
|
||||
\begin{enumerate}
|
||||
\item[(1)] \textbf{类适配器:}通过继承实现,从不兼容的类派生出新类并添加我们需要的方法使得派生类满足预期接口
|
||||
\item[(2)] \textbf{对象适配器:}通过对象组合实现,新类中包含原始类并且在新类里创建方法以实现调用的转换
|
||||
\end{enumerate}
|
||||
|
||||
其类图如图\ref{fig:fig2}和图\ref{fig:fig3}所示:
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{10.png}
|
||||
\caption{适配器模式类图-类适配器}
|
||||
\label{fig:fig2}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{11.png}
|
||||
\caption{适配器模式类图-对象适配器}
|
||||
\label{fig:fig3}
|
||||
\end{figure}
|
||||
|
||||
|
||||
|
||||
本项目的用户界面基于 Qt \footnote{Qt 是一个跨平台的 C++ 应用程序开发框架,广泛用于开发 GUI 程序。}开发,相机拍摄的图像将展示在 Qt 开发的用户界面。类 $Camera$ 定义了内部类 $CameraFrame$,包含图像的分辨率(宽度和高度),图像内容和图像信息等,为了将相机视野展示在用户界面上,需要将自定义的 $CameraFrame$ 类转换为 Qt 的图片类 $QImage$。此外,在结构光解码过程中,依赖于 OpenCV\footnote{OpenCV 是一个跨平台的计算机视觉库,可用于开发实时的图像处理、计算机视觉以及模式识别程序。} 对图像进行处理,因此,在对图像进行结构光解码之前,也需要对接口进行转换。
|
||||
|
||||
本项目主要采用对象适配器,即通过对象组合实现。通过定义新的类 $CVTools$,在新类中包含 $CameraFrame$,$Mat$ 等类的对象,实现不同类型数据对象之间的转换,并定义新的方法提供 $Client$ 类可以调用的转换接口。
|
||||
|
||||
下面为将 $CameraFrame$ 转换为 OpenCV 中 $Mat$ 的适配器。
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.8]{12.png}
|
||||
\caption{CameraFrame-Mat Adapter}
|
||||
\end{figure}
|
||||
|
||||
其类图如图\ref{fig:fig4}所示:
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{14.png}
|
||||
\caption{CameraFrame-Mat Adapter}
|
||||
\label{fig:fig4}
|
||||
\end{figure}
|
||||
|
||||
其中,$Camera$ 类为相机类,$getFrame()$ 方法控制相机拍摄并获得 $CameraFrame$ 对象,$CoreAlgorithm$ 类为进行结构光解码的类,是 $Client$ 类使用的特定接口,该接口需要 $Mat$ 对象作为输入参数,因此, $CVTools$ 类作为适配器对他们进行匹配,使得其可以协同工作。
|
||||
|
||||
使用对象适配器的优势在于一个对象适配器可以把多个不同的适配者适配到同一个目标。
|
||||
可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏替换原则”,适配者的子类也可通过该适配器进行适配。但与类适配器模式相比,要在适配器中置换适配者类的某些方法比较麻烦。如果一定要置换掉适配者类的一个或多个方法,可以先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。
|
||||
|
||||
\subsection{工厂模式}
|
||||
工厂模式是一种创建者模式的设计模式,有工厂方法和抽象工厂两种变种。工厂模式的目的在于创建对象的过程中没有暴露对象的初始化逻辑给用户,仅通过一个公共接口引用最新创建的对象。
|
||||
|
||||
工厂模式适用于当类不能预测要创建哪个类的对象或当类引用其子类去定义要创建的对象的类型以及当对象的创建要局部化三种情形。
|
||||
|
||||
工厂模式的参与者包括:
|
||||
|
||||
\begin{itemize}
|
||||
\item Product:定义工厂方法要创建的对象的接口
|
||||
\item Concrete Product:实现 Product 接口
|
||||
\item Creator:声明工厂方法,返回一个产品类型的对象构造器也可能定义一种缺省的工厂方法,返回一个缺省的 Concrete Product对象
|
||||
\item Concrete Creator: 重写工厂方法来获得一个 Concrete Product的实例
|
||||
\end{itemize}
|
||||
|
||||
其类图如下图所示:
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{15.png}
|
||||
\caption{工厂方法类图}
|
||||
\end{figure}
|
||||
|
||||
点云是在三维重建后获得的物体表面海量点集合,包含点的三维坐标(XYZ)和颜色信息(RGB)。本系统的点云渲染模块主要是对点云的可视化和对用户事件的相应。该模块的开发依赖于PCL\footnote{PCL 是C ++编写的一个开源的点云算法库,支持点云的处理,可用于特征估计,表面重建,模型拟合和分割等}。PCL 中提供的点云对象包括 $PointXYZ$, $PointXYZRGB$, $PointXYZRGBA$, $PointXYZHSV$ 等,目前,项目对点云对象的处理为默认 $PointXYZRGB$ 并提供缺省颜色。其类图如图\ref{fig:fig6}所示。
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{16.png}
|
||||
\caption{项目原始类图}
|
||||
\label{fig:fig6}
|
||||
\end{figure}
|
||||
|
||||
而通过工厂方法,在载入点云时,可根据点云文件(如$pcd$文件\footnote{PCD全称Point Cloud Data,是一种存储点云数据的文件格式,文件格式头(file format header)说明文件中存储的点云数据的格式。})的头部判断不同的点云对象,从而返回不同类型的点云对象。
|
||||
|
||||
修改后的类图如图\ref{fig:fig7}所示:
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{17.png}
|
||||
\caption{项目修改类图}
|
||||
\label{fig:fig7}
|
||||
\end{figure}
|
||||
|
||||
其中,$PointCloud$ 是点云对象的接口,定义了修改点云颜色、剔除异常点等方法,$ConcretePointCloud$ 实现了 $PointCloud$ 接口,有不同类型的点云对象。$Loader$ 声明了工厂方法,即从文件中读入点云的方法,$ConcreteLoader$ 重写工厂方法,根据文件中头部声明的不同点云类型来获得不同的 $ConcretePointCloud$ 的实例。
|
||||
|
||||
在工厂模式下,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。但在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
|
||||
|
||||
\subsection{代理模式}
|
||||
|
||||
代理模式采用代理对象可以给用户提供更好的用户体验(也可以对目标对象的访问进行一定的控制)。例如,当页面还没加载过来的时候,代理对象可以提供一个状态条来显示,页面、图像加载到什么程度。
|
||||
|
||||
代理模式适用于当需要用简单对象表示复杂对象,或如果一个对象,譬如大的图像,需要很长时间来加载,尤其对象需要通过网络加载,网络负载高时可能很缓慢以及如果对象具有有限访问权限,则代理可以验证该用户的访问权限。
|
||||
|
||||
代理模式的参与对象包括:
|
||||
\begin{itemize}
|
||||
\item Subject:由RealSubject实现的接口并代表其服务
|
||||
\item Proxy:维护Proxy访问RealSubject的引用,实现RealSubject实现的相同接口,以便Proxy替代RealSubject, 控制对RealSubject的访问,并可能负责其创建和删除,依赖于代理种类的其他职责
|
||||
\item RealSubject:Proxy代表的真实对象
|
||||
\end{itemize}
|
||||
其类图如图\ref{fig:fig8}所示:
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{18.png}
|
||||
\caption{代理模式类图}
|
||||
\label{fig:fig8}
|
||||
\end{figure}
|
||||
|
||||
根据第二节的描述,本系统旨在对轮轨表面进行稠密重建,项目进行到现在,已经实现了在半径 95 mm 的球体单表面提取 17 W+ 的点云数据。在三维重建进行坐标计算的过程中或在将这些点云数据导入软件的过程中,由于数据量大而容易造成界面假死。
|
||||
|
||||
而项目使用代理模式即可解决这一问题。由于数据体量大,加载时间过长,可以在加载的时候辟一个线程,在新的线程中加载,加载完成后通过delegate协议将点云对象传给界面。在加载的过程中,可以通过进度条或加载界面等方式提示用户加载进度等。
|
||||
|
||||
项目的类图如图\ref{fig:fig9}所示:
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{19.png}
|
||||
\caption{项目类图}
|
||||
\label{fig:fig9}
|
||||
\end{figure}
|
||||
|
||||
使用代理模式可以协调调用者和被调用者,在一定程度上降低了系统的耦合度。远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。虚拟代理通过使用一个小对象来代表一个大对象,可以减少系 统资源的消耗,对系统进行优化并提高运行速度。保护代理可以控制对真实对象的使用权限。但由于在客户端和真实主题之间增加了代理对象,因此 有些类型的代理模式可能会造成请求的处理速度变慢。而且实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
|
||||
|
||||
|
||||
\subsection{责任链模式}
|
||||
责任链模式通过为多个对象提供处理请求的机会,避免将请求的发送者耦合到其接受者。责任链模式将接收对象链接并沿链传递请求,直到对象处理它。链上的每个对象共享一个公共接口,用于处理请求和访问链上的后继者。
|
||||
|
||||
责任链模式适用于当多个对象可以处理请求且事先不知道实际处理对象或当请求遵循“处理或转发”模型,也就说某些请求可在生成的地方处理,而其他请求必须转发到另一个对象处理以及希望能够动态修改可处理请求的对象集。此方法为在对象间分配职责提供了额外的灵活性。
|
||||
|
||||
责任链模式的参与者包含:
|
||||
\begin{itemize}
|
||||
\item Handler:定义处理请求的接口,实现后继链接
|
||||
\item ConcreteHandler:处理他负责的请求,可以访问其继任者,如果 ConcreteHandler 可以处理请求,他会这样做,否则他会将请求转发给其继任者
|
||||
\item Client:启动对链上的 ConcreteHandler 对象的请求
|
||||
\end{itemize}
|
||||
|
||||
其类图如图\ref{fig:fig10}所示:
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.45]{20.png}
|
||||
\caption{责任链模式类图}
|
||||
\label{fig:fig10}
|
||||
\end{figure}
|
||||
\newpage
|
||||
在本项目中,导入时读取的点云文件可能有多种文件类型,如 $pcd$, $ply$ 或 $txt$ 等。不同的文件格式需要调用不同的方法,现有项目通过判断文件类型来选择调用的方法,这样的设计不利于系统的扩展,当需要读取新的文件格式时,软件只能以修改源代码的方式满足需求,而不是以扩展的方式,违反了开放封闭原则。
|
||||
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{21.png}
|
||||
\caption{项目原始类图}
|
||||
\end{figure}
|
||||
|
||||
其中,方法 $LoadFromFile()$ 通过 $if-else$ 判断不同的文件类型,调用不同的方法。
|
||||
|
||||
而进行重新设计使用责任链模式,链上的每个对象可以对文件类型进行判断,看是否可以进行处理,如果可以处理则将点云从文件中读入,否则将文件传给链上的后继。若最后没有对象可以处理该文件类型,则抛出警告或根据需要对软件进行扩展,添加新的对象处理该文件类型。
|
||||
|
||||
修改后的项目类图如下图所示:
|
||||
\begin{figure}[!htbp]
|
||||
\centering
|
||||
\includegraphics[scale=0.4]{22.png}
|
||||
\caption{项目修改类图}
|
||||
\end{figure}
|
||||
|
||||
责任链模式有多种实现方法,本项目的实现拟采用在 Handler 接口中添加接收描述请求类型的修改方法,这种实现方法没有冗余且符合开放封闭原则。
|
||||
|
||||
使用责任链模式的优点是链可以动态地修改,即可以根据需要动态地扩展软件处理文件的对象,缺点是必须分别在每个模块中实现链接,发送和转发代码。
|
||||
|
||||
\section{项目总结}
|
||||
通过本文对结构光三维重建软件中已经运用的设计模式和可通过设计模式进行的改进分析,我们发现设计模式的运用可以解决软件设计和实现中存在的一些问题,通过这些可重用的解决方案优化软件的设计与实现。
|
||||
|
||||
总体来说,设计模式的运用有以下几点好处:
|
||||
\begin{enumerate}
|
||||
\item[(1)] 复用解决方案——通过复用已经公认的设计,我能够在解决问题时取得先发优势,而且避免重蹈前人覆辙。我可以从学习他人的经验中获益,用不着为那些总是会重复出现的问题再次设计解决方案了。
|
||||
|
||||
\item[(2)] 确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。设计模式在项目的分析和设计阶段提供了共同的基准点。
|
||||
|
||||
\item[(3)] 提高观察高度--模式还为我们提供了观察问题、设计过程和面向对象的更高层次的视角,这将使我们从“过早处理细节”的桎梏中解放出来。
|
||||
|
||||
\item[(4)] 大多数设计模式还能使软件更容易修改和维护。其原因在于,它们都是久经考验的解决方案。所以,它们的结构都是经过长期发展形成的,比新构思的解决方案更善于应对变化。而且,这些模式所用代码往往更易于理解——从而使代码更易维护。
|
||||
\end{enumerate}
|
||||
|
||||
|
||||
|
||||
|
||||
\end{document}
|
||||
BIN
Latex/design pattern/bjtu-thesis-master/logo.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
Latex/design pattern/bjtu-thesis-master/model1.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
337
Latex/design pattern/bjtu-thesis-master/reference/ref.bib
Normal file
@@ -0,0 +1,337 @@
|
||||
@article{apriori,
|
||||
title={面向数据的软件体系结构初步探讨*},
|
||||
author={苗放[1 and 2]},
|
||||
journal={计算机科学与探索},
|
||||
number={10},
|
||||
year={2016},
|
||||
}
|
||||
|
||||
@phdthesis{la, title={DOA下数据注册方法的初步研究与实现}, author={王梦佳}, school={成都理工大学}, year={2015}, }
|
||||
@phdthesis{lb, title={基于DOA的面向数据的碎片化应用系统构建方法研究}, author={李国强}, school={成都理工大学}, year={2015}, }
|
||||
@phdthesis{lc, title={DOA下分布式DRC的元数据分级存储模型研究}, author={袁进俊}, school={成都理工大学}, year={2015}, }
|
||||
@phdthesis{ld, title={分布式数据注册中心数据分区存储策略研究}, author={刘彬}, school={成都理工大学}, year={2016}, }
|
||||
|
||||
@article{a,
|
||||
title={基于UML的多视图软件体系结构描述方法研究},
|
||||
author={刘宁 and 郑东霞},
|
||||
journal={计算机应用研究},
|
||||
number={11},
|
||||
pages={173-175},
|
||||
}
|
||||
|
||||
@book{Garlan1995Introduction,
|
||||
title={Introduction to the Special Issue on Software Architecture},
|
||||
author={Garlan, David and Perry, Dewayne E},
|
||||
year={1995},
|
||||
abstract={Abstract Maintaining the consistency of multiple program representations¿such as abstract syntax trees and program dependence graphs¿in a program manipulation tool is difficult. This paper describes a hybrid software architecture for a meaning-preserving program ...},
|
||||
}
|
||||
|
||||
@article{ShawSoftware,
|
||||
title={Software Architecture : Perspectives on an Emerging Discipline / M. Shaw, D. Garlan},
|
||||
author={Shaw, Mary and Garlan, David},
|
||||
abstract={Publisher’s description: Shaw and Garland examine the useful abstractions and paradigms of system design as well as key notations and tools. They present an introduction to software architecture that illustrates the current state of the discipline and examines ways in which architectural issues can impact software design.},
|
||||
}
|
||||
|
||||
@inproceedings{Allen1994Formalizing,
|
||||
title={Formalizing Architectural Connection},
|
||||
author={Allen, Robert J. and Garlan, David},
|
||||
booktitle={Software Engineering, 1994. Proceedings. ICSE-16., 16th International Conference on},
|
||||
year={1994},
|
||||
abstract={As software systems become more complex the overall system structure - or software architecture - becomes a central design problem. An important step towards an engineering discipline of software is a formal basis for describing and analyzing these designs. We present a theory for one aspect of architectural description, the interactions between components. The key idea is to define architectural connectors as explicit semantic entities. These are specified as a collection of protocols that characterize each of the participant roles in an interaction and how these roles interact. We illustrate how this scheme can be used to define a variety of common architectural connectors. We provide a formal semantics and show how this lends to a sound deductive system in which architectural compatibility can be checked in a way analogous to type checking in programming languages},
|
||||
}
|
||||
|
||||
@article{Ivar1999Unified,
|
||||
title={Unified software development process},
|
||||
author={Ivar, Jacobson and Grady, Booch and James, Rumbaugh},
|
||||
year={1999},
|
||||
abstract={This guide overviews the Unified Process for software development, with a focus on modeling using the Unified Modeling Language (UML). It demonstrates how the notation and process complement on another, using UML models to illustrate the new process in action. The authors describe semantics and notation of the different higher-level constructs used on the models. Constructs such as use cases, actors, subsystems, classes, interfaces, active classes, processes, threads, nodes, and most relations are described in the context of a model. ^^^^ Annotation c. Book News, Inc., Portland, OR (booknews.com) (Book News)},
|
||||
}
|
||||
|
||||
@article{Kruchten2006The,
|
||||
title={The Past, Present, and Future for Software Architecture},
|
||||
author={Kruchten, P. and Obbink, H. and Stafford, J.},
|
||||
journal={IEEE Software},
|
||||
volume={23},
|
||||
number={2},
|
||||
pages={22-30},
|
||||
year={2006},
|
||||
abstract={It's been 10 years since David Garlan and Mary Shaw wrote their seminal book Software Architecture Perspective on an Emerging Discipline, since Maarten Boasson edited a special issue of IEEE Software on software architecture, and since the first International Software Architecture Workshop took place. What has happened over these 10 years? What have we learned? Where do we look for information? What's the community around this discipline? And where are we going from here?This article is part of a focus section on software architecture.},
|
||||
}
|
||||
|
||||
@article{ShawThe,
|
||||
title={The Golden Age of Software Architecture: A Comprehensive Survey},
|
||||
author={Shaw, Mary and Clements, Paul},
|
||||
abstract={Abstract This retrospective on nearly two decades of software architecture research examines the maturation of the software architecture research area by tracing the evolution of research questions and results through their maturation cycle. We show how early qualitative results set the stage for later precision, formality, and automation, how results have built up over time, and how the research results have moved into practice.},
|
||||
}
|
||||
|
||||
@article{DashofyA,
|
||||
title={A comprehensive approach for the development of modular software architecture description languages},
|
||||
author={Dashofy, Eric M. and Hoek, André van der and Taylor, Richard N.},
|
||||
journal={Acm Transactions on Software Engineering & Methodology},
|
||||
volume={14},
|
||||
number={2},
|
||||
pages={199-245},
|
||||
abstract={We have developed an approach that allows for the rapid construction of new architecture description languages (ADLs). Our approach is unique because it encapsulates ADL features in modules that are composed to form ADLs. We achieve this by leveraging the extension mechanisms provided by XML and XML schemas. We have defined a set of generic, reusable ADL modules called xADL 2.0, useful as an ADL by itself, but also extensible to support new applications and domains. To support this extensibility, we have developed a set of reflective syntax-based tools that adapt to language changes automatically, as well as several semantically-aware tools that provide support for advanced features of xADL 2.0. We demonstrate the effectiveness, scalability, and flexibility of our approach through a diverse set of experiences. First, our approach has been applied in industrial contexts, modeling software architectures for aircraft software and spacecraft systems. Second, we show how xADL 2.0 can be extended to support the modeling features found in two different representations for modeling product-line architectures. Finally, we show how our infrastructure has been used to support its own development. The technical contribution of our infrastructure is augmented by several research contributions: the first decomposition of an architecture description language into modules, insights about how to develop new language modules and a process for integrating them, and insights about the roles of different kinds of tools in a modular ADL-based infrastructure},
|
||||
}
|
||||
|
||||
@inproceedings{Mei2002ABC,
|
||||
title={ABC/ADL: An ADL Supporting Component Composition},
|
||||
author={Mei, Hong and Chen, Feng and Wang, Qianxiang and Feng, Yao Dong},
|
||||
booktitle={Proceedings of the 4th International Conference on Formal Engineering Methods: Formal Methods and Software Engineering},
|
||||
year={2002},
|
||||
abstract={Architecture Description Language (ADL) is one of the keys to software architecture research, but most attention was paid to the description of software structure and high-level analysis of some syste},
|
||||
}
|
||||
|
||||
@inproceedings{Medvidovic2000A,
|
||||
title={A Classification and Comparison Framework for Software Architecture Description Languages},
|
||||
author={Medvidovic, Nenad and Taylor, Richard N.},
|
||||
year={2000},
|
||||
abstract={Abstract鈥擲oftware architectures shift the focus of developers from lines-of-code to coarser-grained architectural elements and their overall interconnection structure. Architecture description languages (ADLs) have been proposed as modeling notations to support architecture-based development. There is, however, little consensus in the research community on what is an ADL, what aspects of an architecture should be modeled in an ADL, and which of several possible ADLs is best suited for a particular problem. Furthermore, the distinction is rarely made between ADLs on one hand and formal specification, module interconnection, simulation, and programming languages on the other. This paper attempts to provide an answer to these questions. It motivates and presents a definition and a classification framework for ADLs. The utility of the definition is demonstrated by using it to differentiate ADLs from other modeling notations. The framework is used to classify and compare several existing ADLs, enabling us, in the process, to identify key properties of ADLs. The comparison highlights areas where existing ADLs provide extensive support and those in which they are deficient, suggesting a research agenda for the future.},
|
||||
}
|
||||
|
||||
@article{Oquendo2004,
|
||||
title={π-ADL:an Architecture Description Language based on the higher-order typed π-calculus for specifying dynamic and mobile software architectures},
|
||||
author={Oquendo, Flavio},
|
||||
journal={Acm Sigsoft Software Engineering Notes},
|
||||
year={2004},
|
||||
abstract={A key aspect of the design of any software system is its architecture. An architecture description, from a runtime perspective, should provide a formal specification of the architecture in terms of components and connectors and how they are composed together. Further, a dynamic or mobile architecture description must provide a specification of how the architecture of the software system can change at runtime. Enabling specification of dynamic and mobile architectures is a large challenge for an Architecture Description Language (ADL). This article describes π-ADL, a novel ADL that has been designed in the ArchWare European Project to address specification of dynamic and mobile architectures. It is a formal, well-founded theoretically language based on the higher-order typed π-calculus. While most ADLs focus on describing software architectures from a structural viewpoint, π-ADL focuses on formally describing architectures encompassing both the structural and behavioural viewpoints. The π-ADL design principles, concepts and notation are presented. How π-ADL can be used for specifying static, dynamic and mobile architectures is illustrated through case studies. The π-ADL toolset is outlined.},
|
||||
}
|
||||
|
||||
@book{Schmuller2004Sams,
|
||||
title={Sams Teach Yourself UML in 24 Hours, Complete Starter Kit (3rd Edition)},
|
||||
author={Schmuller, Joseph},
|
||||
year={2004},
|
||||
}
|
||||
|
||||
@article{b,
|
||||
title={软件体系结构研究综述},
|
||||
author={孙昌爱 and 金茂忠 and 刘超},
|
||||
journal={软件学报},
|
||||
volume={13},
|
||||
number={7},
|
||||
pages={1228-1237},
|
||||
year={2002},
|
||||
abstract={摘 要: 近年来,软件体系结构逐渐成为软件工程领域的研究热点以及大型软件系统与软件产品线开发中的关键技术之一,归纳了软件体系结构技术发展过程及其主要研究方向,在分析了典型的软件体系结构概念之后,给出了软件体系结构的定义,通过总结软件体系结构领域的若干研究活动,提出了软件体系结构研究的两大思路,并从7个方面介绍了软件体系结构研究进展,探讨了软件体系结构研究中的不足之处,并分析其原因,作为总结,给出了软件体系结构领域最有前途的发展趋势。},
|
||||
}
|
||||
|
||||
@article{c,
|
||||
title={软件体系结构研究进展},
|
||||
author={梅宏 and 申峻嵘},
|
||||
journal={软件学报},
|
||||
volume={17},
|
||||
number={6},
|
||||
pages={1257-1275},
|
||||
year={2006},
|
||||
abstract={作为控制软件复杂性、提高软件系统质量、支持软件开发和复用的重要手段之一,软件体系结构自提出以来,日益受到软件研究者和实践者的关注,并发展成为软件工程的一个重要的研究领域.如今,软件体系结构的研究也开始超出传统的对软件设计阶段的支持,逐步扩展到整个软件生命周期.基于软件体系结构近十年来的研究进展,综述了在软件生命周期的不同阶段软件体系结构的研究与应用,并探讨了软件体系结构领域的发展与研究方向.},
|
||||
}
|
||||
|
||||
@article{d,
|
||||
title={双重软件体系结构描述框架XYZ/ADL},
|
||||
author={朱雪阳},
|
||||
journal={计算机研究与发展},
|
||||
volume={44},
|
||||
number={9},
|
||||
pages={1485-1494},
|
||||
year={2007},
|
||||
abstract={体系结构设计在软件开发过程中扮演着重要角色.工程中常用图形语言为软件体系结构建模,它们有直观、半形式化的优点;但是语义不够精确,难以对它们表示的模型进行分析,在这方面,形式化方法可与之互补.但在工程使用中仅用形式化语言建模又不太现实,所以如何结合二者之长以提高软件的可靠性已成为工业界和学术界共同关心的问题.提出了双重软件体系结构描述框架XYZ/ADL:支持工程中软件体系结构的基本概念,前端用一般的体系结构框图作为结构描述,用UML活动图、状态图作为抽象行为表示;后端用既可表示系统动态语义又可表示系统静态语义的时序逻辑语言XYZ/E作为一致的语义基础.前端的图形语言便于软件工程师的交流和使用,后端的形式语言是进一步的形式化分析验证的基础.},
|
||||
}
|
||||
|
||||
@article{e,
|
||||
title={ABC/ADL:一种基于XML的软件体系结构描述语言},
|
||||
author={王晓光 and 冯耀东 and 梅宏},
|
||||
journal={计算机研究与发展},
|
||||
number={9},
|
||||
pages={1521-1531},
|
||||
year={2004},
|
||||
abstract={摘 要: 作为基于构件的软件开发过程的系统蓝图,软件体系结构(SA)扮演了非常重要的角色,其研究受到越来越多的关注.而软件体系结构描述语言(ADL)是研究和应用SA的基础.提出了一种基于XML的体系结构描述语言--ABC/ADL. ABC/ADL具备大多数ADL描述软件系统高层结构的能力,还支持系统的逐步精化与演化,并支持系统的自动化组装和验证.采用数据互操作标准XML作为元语言,不仅使ABC/ADL具有与其他ADL的互操作性,还有助于实现设计阶段的制品与其他软件生命周期阶段制品之间的可追踪性.},
|
||||
}
|
||||
|
||||
@article{f,
|
||||
title={面向方面的软件体系结构描述语言AO-ADL},
|
||||
author={杨敬中 and 戎玫 and 张广泉 and YANGJing-zhong and RONGMei and ZHANGGuang-quan},
|
||||
journal={计算机工程},
|
||||
volume={34},
|
||||
number={10},
|
||||
pages={80-82},
|
||||
year={2008},
|
||||
abstract={分析面向方面编程(AOP)的核心思想及其优越性,将编码阶段的AOP概念进一步提升到软件体系结构层次.在软件体系结构描述语言XYZ/ADL的基础上,通过增加新的元素和相关复合机制,得到一种面向方面的体系结构描述语言AO-ADL,实现了在软件体系结构中横切功能的模块化.},
|
||||
}
|
||||
|
||||
@article{g,
|
||||
title={软件体系结构风格研究现状及存在的问题},
|
||||
author={毛斐巧 and 齐德昱},
|
||||
journal={计算机应用研究},
|
||||
volume={25},
|
||||
number={8},
|
||||
pages={2270-2273},
|
||||
year={2008},
|
||||
abstract={摘 要: 针对现有软件体系结构风格定义在客观性和全面性方面存在的不足,从客观角度出发,站在软件工程的高度从多个方面对软件体系结构风格进行定义;同时通过研究分析软件体系结构风格的研究现状,发现并指出其四个重点研究方向及各自存在的问题。},
|
||||
}
|
||||
|
||||
@article{h,
|
||||
title={“平台/插件”软件体系结构风格},
|
||||
author={李俊娥 and 周洞汝},
|
||||
journal={小型微型计算机系统},
|
||||
number={5},
|
||||
pages={110-115},
|
||||
abstract={体系结构发现是软件体系结构研究领域的一个重要方向.近年出现的“平台+插件”软件设计方法,使得发布后的软件产品可以方便地通过安装插件模块而扩展其功能.然而,迄今为止,未见资料将这种结构从软件体系结构的高度进行提炼和描述.本文提出“平台+插件”的软件设计方法是一种软件体系结构风格,并将其称为“平台/插件(Platform/Plug-in)”风格,简写为“P/P风格”.由于软件体系结构和体系结构风格的概念还没有一个标准的定义,文中首先定义了本文使用的模型和概念;研究了“平台/插件”结构应用程序的特点和分类,分析了该类程序的架构,在本文定义的软件体系结构模型的基础上,用统一建模语言UML描述了P/P体系结构风格及P/P风格软件的开发过程.本文工作为需要动态扩展功能的大型软件开发提供了一种可复用的体系结构风格,可以认为,P/P风格是可扩展和可增量升级软件系统的领域体系结构模型.},
|
||||
}
|
||||
|
||||
@article{i,
|
||||
title={Customer Relationship Management System Based on Orthogonal Software Architecture%基于正交软件体系结构的CRM系统},
|
||||
author={汪保杰 and 王如龙},
|
||||
journal={计算机工程},
|
||||
volume={035},
|
||||
number={24},
|
||||
pages={117-120},
|
||||
abstract={为解决软件体系结构在应用软件领域难以实施的问题,避免软件开发的盲目性,提高软件质量,通过对正交软件体系结构理论的研究,给出其在客户关系管理系统中的运用.事实证明,正交软件体系结构具有结构清晰、易于理解和修改、重用力度大等优点.},
|
||||
}
|
||||
|
||||
@article{j,
|
||||
title={软件体系结构测试技术的现状与思考},
|
||||
author={巩绪芳 and 周颖 and 李必信},
|
||||
number={8},
|
||||
pages={76-83},
|
||||
abstract={软件体系结构经过10年的研究和发展取得了一系列可喜的成就.目前,一些有代表性的软件测试策略被研究人员提议用于软件体系结构的测试.但是,传统的软件测试技术和方法不能直接用来解决软件体系结构的测试问题,需要改进传统的软件测试技术和方法,或者开发新的软件体系结构测试技术和方法,使之能够更好地解决软件体系结构测试中存在的问题.本文概述了软件体系结构测试策略的研究现状,剖析了影响软件软件体系结构测试的因素,并讨论了软件体系结构分析与测试的未来研究主题.},
|
||||
}
|
||||
|
||||
@article{k,
|
||||
title={基于π演算的软件体系结构测试技术},
|
||||
author={许慧 and 伦立军},
|
||||
journal={计算机工程},
|
||||
volume={35},
|
||||
number={13},
|
||||
pages={55-57},
|
||||
year={2009},
|
||||
abstract={针对目前体系结构描述语言对描述软件系统行为方面的不足而难以生成实时测试路径的问题,提出一种基于π演算的软件体系结构测试方法,该方法包括π演算与Petri网结合、构造体系结构模型及测试路径生成算法。实验证明,该算法能够根据测试覆盖准则生成相应的测试路径,实现体系结构模型的动态性和测试技术的有效性。},
|
||||
}
|
||||
|
||||
@article{l,
|
||||
title={构件组装及其形式化推导研究},
|
||||
author={任洪敏 and 钱乐秋},
|
||||
journal={软件学报},
|
||||
number={6},
|
||||
pages={38-46},
|
||||
abstract={基于构件的软件工程(component based software engineering,简称CBSE)能够有效地提高软件开发的质量和效率.构件组装和组装推导(compositional reasoning)是CBSE的关键技术.基于软件构件的特点,借鉴进程代数中进程构造的方法,提出6种构件组装机制,能够灵活、简便地集成软件构件,并主张在构件组装的同时进行接口组装,通过生成功能更强、抽象级别更高的复合接口,提高构件组装的抽象级别和粒度.同时,基于Wright的形式化规约软件体系结构的研究,给出了复合构件和复合接口的组装推导算法,为系统行为的形式化分析、验证和仿真奠定了基础.},
|
||||
}
|
||||
|
||||
@article{m,
|
||||
title={基于软件体系结构的构件组装工具ABC-Tool},
|
||||
author={向俊莲 and 杨杰 and 梅宏},
|
||||
journal={计算机研究与发展},
|
||||
volume={41},
|
||||
number={6},
|
||||
pages={956-964},
|
||||
year={2004},
|
||||
abstract={摘 要: 软件朝着越来越复杂和庞大的趋势发展,因此对更有效的软件开发技术的需求十分迫切.近年来,软件体系结构、构件技术和软件复用技术等开始在软件开发中发挥重要作用,成为软件工程领域研究的热点.在基于构件复用的开发方法中,构件组装技术是关键,而且一直以来也是难点所在.ABC(architecture-based component composition)是一种基于软件体系结构、面向构件的软件开发方法.介绍了为ABC方法提供有效支持的工具ABC-Tool,ABC-Tool以软件体系结构为设计蓝图,以构件为基本开发单元,在不修改构件源代码的前提下,通过可视化的图形建模方式,从体系结构的高层设计逐层映射到底层实现,将可运行或可部署的构件组装为最终的可正确运行的系统.},
|
||||
}
|
||||
|
||||
@article{za,
|
||||
title={面向数据的软件体系结构初步探讨*},
|
||||
author={苗放[1 and 2]},
|
||||
journal={计算机科学与探索},
|
||||
number={10},
|
||||
year={2016},
|
||||
}
|
||||
|
||||
@phdthesis{zb,
|
||||
title={基于DOA的面向数据的碎片化应用系统构建方法研究},
|
||||
author={李国强},
|
||||
school={成都理工大学},
|
||||
year={2015},
|
||||
}
|
||||
|
||||
@phdthesis{zc,
|
||||
title={DOA下DAC中用户认证机制及证书授权技术研究},
|
||||
author={谭铁成},
|
||||
school={成都理工大学},
|
||||
year={2015},
|
||||
}
|
||||
|
||||
@phdthesis{zd,
|
||||
title={DOA下DAC中数据授权机制及公共密钥基础设施研究},
|
||||
author={陈林},
|
||||
school={成都理工大学},
|
||||
year={2015},
|
||||
}
|
||||
|
||||
@Misc{
|
||||
gamesfromwithin.com,
|
||||
author = "Noel",
|
||||
title = "Data-Oriented Design (Or Why You Might Be Shooting Yourself in The Foot With OOP)",
|
||||
howpublished = "Website",
|
||||
year = {2009},
|
||||
note = {\url{http://gamesfromwithin.com/data-oriented-design}}
|
||||
}
|
||||
|
||||
@Misc{
|
||||
tuzipei.baijia.baidu.com,
|
||||
author = "Tu Zipei",
|
||||
title = "All business digitization: specific ideas of traditional business transformation",
|
||||
howpublished = "Website",
|
||||
year = {2015},
|
||||
note = {\url{http://tuzipei.baijia.baidu.com/article/47068.}}
|
||||
}
|
||||
|
||||
@article{ze,
|
||||
title={科学数据共享技术平台构想},
|
||||
author={李晓波 and 祝孔强 and 贾光宇 and 徐枫 and 李集明},
|
||||
journal={中国基础科学},
|
||||
number={01},
|
||||
pages={52-57},
|
||||
abstract={进入21世纪的信息时代,科学数据对于社会和经济发展以及国家安全保障的作用更加显著,特别是科技创新直接源于科学数据的积累与应用。然而,科学数据作为一种新的战略资源和财富,只有被更多的人所共享,才能显示出其宝贵的价值。},
|
||||
}
|
||||
|
||||
@article{zf,
|
||||
title={科学数据共享平台的数据管理研究},
|
||||
author={孙卫 and 罗之兰 and 张蔚},
|
||||
journal={科学学与科学技术管理},
|
||||
number={12},
|
||||
pages={34-38},
|
||||
abstract={运用公共经济学等相关理论对科学数据共享平台的数据进行了分类,提出了以数据付费管理、数据标准化管理和数据收费管理为核心内容的平台数据管理框架,建立了付费管理、数据标准化管理和数据收费管理的方法体系,为我国科学数据共享平台建设的不断推进和有效的数据管理提供了重要的思路和政策参考。},
|
||||
}
|
||||
|
||||
@article{DeanMapReduce,
|
||||
title={MapReduce: Simplified Data Processing on Large Clusters},
|
||||
author={Dean, Jeffrey and Ghemawat, Sanjay},
|
||||
journal={Communications of the ACM},
|
||||
volume={51},
|
||||
number={1},
|
||||
pages={p.107-113},
|
||||
abstract={MapReduce is a programming model and an associated implementation for processing and generating large datasets that is amenable to a broad variety of real-world tasks. Users specify the computation in terms of a map and a reduce function, and the underlying runtime system automatically parallelizes the computation across large-scale clusters of machines, handles machine failures, and schedules inter-machine communication to make efficient use of the network and disks. Programmers find the system easy to use: more than ten thousand distinct MapReduce programs have been implemented internally at Google over the past four years, and an average of one hundred thousand MapReduce jobs are executed on Google's clusters every day, processing a total of more than twenty petabytes of data per day.},
|
||||
}
|
||||
|
||||
@article{KirkpatrickBig,
|
||||
title={Big Data for Development},
|
||||
author={Kirkpatrick and Robert},
|
||||
journal={Big Data},
|
||||
volume={1},
|
||||
number={1},
|
||||
pages={3-4},
|
||||
abstract={where mobile phone use goes be- yond phone calls to trade and ``OUR WORK IS FOCUSED ON As promising as this work has banking. In those countries, mo- bile data can certainly tell compa- nies what types of bank products are most popular with users. ThatTHE EXPLOSION OF BIG DATA,ESPECIALLY IN THE PLACESWHERE THE U.N. DOES ITSbeen, however, significant ques-tions remain about how big dataanalysis can be practically inte-grated into UN systems. We know, same data could also hold infor-MOST CRUCIAL WORK.''for example, that the real-time na- mation about the well-being ofture of big data will definitely im- the vulnerable populations the UNprove development programs. In a serves.world of fast-moving, global shocks like the recent financialrecession, traditional data collection methods like door-to- Consider that in recent years, MIT researchers have founddoor household surveys have become woefully inadequate. evidence that changes in mobile phone calling patterns can be used to detect flu outbreaks.1 In addition, a Telefo麓 nica Re-What we at Global Pulse are still not sure about is exactly search team has demonstrated that calling patterns can bewhat types of digital data sources would be most useful to the},
|
||||
}
|
||||
|
||||
@article{Hey2009The,
|
||||
title={The Fourth Paradigm: Data-Intensive Scientific Discovery},
|
||||
author={Hey, Tony and Tansley, Stewart and Tolle, Kristin},
|
||||
journal={Proceedings of the IEEE},
|
||||
volume={99},
|
||||
number={8},
|
||||
pages={1334-1337},
|
||||
year={2009},
|
||||
abstract={This book presents the first broad look at the rapidly emerging field of data-intensive science, with the goal of influencing the worldwide scientific and computing research communities and inspiring the next generation of scientists. Increasingly, scientific breakthroughs will be powered by advanced computing capabilities that help researchers manipulate and explore massive datasets. The speed at which any given scientific discipline advances will depend on how well its researchers collaborate with one another, and with technologists, in areas of eScience such as databases, workflow management, visualization, and cloud-computing technologies. This collection of essays expands on the vision of pioneering computer scientist Jim Gray for a new, fourth paradigm of discovery based on data-intensive science and offers insights into how it can be fully realized.},
|
||||
}
|
||||
|
||||
@article{Labrinidis2012Challenges,
|
||||
title={Challenges and opportunities with big data},
|
||||
author={Labrinidis, Alexandros and H.V. Jagadish},
|
||||
journal={Proceedings of the VLDB Endowment},
|
||||
volume={5},
|
||||
number={12},
|
||||
pages={2032-2033},
|
||||
year={2012},
|
||||
abstract={The promise of data-driven decision-making is now being recognized broadly, and there is growing enthusiasm for the notion of ``Big Data.鈥欌While the promise of Big Data is real -- for example, it is estimated that Google alone contributed 54 billion dollars to the US economy in 2009 -- there is currently a wide gap between its potential and its realization.Heterogeneity, scale, timeliness, complexity, and privacy problems with Big Data impede progress at all phases of the pipeline that can create value from data. The problems start right away during data acquisition, when the data tsunami requires us to make decisions, currently in an ad hoc manner, about what data to keep and what to discard, and how to store what we keep reliably with the right metadata. Much data today is not natively in structured format; for example, tweets and blogs are weakly structured pieces of text, while images and video are structured for storage and display, but not for semantic content and search: transforming such content into a structured format for later analysis is a major challenge. The value of data explodes when it can be linked with other data, thus data integration is a major creator of value. Since most data is directly generated in digital format today, we have the opportunity and the challenge both to influence the creation to facilitate later linkage and to automatically link previously created data. Data analysis, organization, retrieval, and modeling are other foundational challenges. Data analysis is a clear bottleneck in many applications, both due to lack of scalability of the underlying algorithms and due to the complexity of the data that needs to be analyzed. Finally, presentation of the results and its interpretation by non-technical domain experts is crucial to extracting actionable knowledge.During the last 35 years, data management principles such as physical and logical independence, declarative querying and cost-based optimization have led, during the last 35 years, to a multi-billion dollar industry. More importantly, these technical advances have enabled the first round of business intelligence applications and laid the foundation for managing and analyzing Big Data today. The many novel challenges and opportunities associated with Big Data necessitate rethinking many aspects of these data management platforms, while retaining other desirable aspects. We believe that appropriate investment in Big Data will lead to a new wave of fundamental technological advances that will be embodied in the next generations of},
|
||||
}
|
||||
|
||||
|
||||
|
||||
BIN
Latex/design pattern/img/0.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
Latex/design pattern/img/1.eddx
Normal file
BIN
Latex/design pattern/img/1.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
Latex/design pattern/img/2.eddx
Normal file
BIN
Latex/design pattern/img/2.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
Latex/design pattern/img/3.eddx
Normal file
BIN
Latex/design pattern/img/3.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
Latex/design pattern/新建Microsoft Visio Drawing.vsdx
Normal file
143
Readme-en.md
Normal file
@@ -0,0 +1,143 @@
|
||||
<h1 align="center">
|
||||
<a href="https://github.com/Tang1705/Reconstruction" title="3D Reconstruction of High-Speed Rail-Wheel Based on Coded Structured Light">
|
||||
<img alt="Reconstruction" src="http://static.zybuluo.com/TangWill/jhiwlfucn275608lfkr5yw86/icon.png" width="200px" height="200px" />
|
||||
</a>
|
||||
<br />
|
||||
基于编码结构光的高铁轮轨姿态三维重建
|
||||
</h1>
|
||||
<p align="center">
|
||||
3D Reconstruction of High-Speed Rail-Wheel Based on Coded Structured Light
|
||||
</p>
|
||||
<div align="center">
|
||||
<a href="http://gjcxcy.bjtu.edu.cn/NewLXItemListForStudentDetail.aspx?ItemNo=594113&year=2020&type=student&IsLXItem=1">
|
||||
<img alt="Organization" src="https://img.shields.io/badge/Organization-BJTU-072063.svg?style=shield&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAaCAYAAABCfffNAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQ4SURBVEhLfZZ3qI5RGMC/j+vae3Otskn2JmSma0SZJUkR4h+biBuyytZNyChKlJ0tIbtsMq+V7L1dv9/nfa/vWk/9Ot973nOe5zzrvF808h9JT0/PztAIWkBR+ArZ4BtkhadwEE5Eo9EvjH+VfxrBQG+G5nAGDkBFOIqyj4y+L8LgATTeFLbDNt6nM/5f2FwSZkMPyAdRyAqDIEewJgF6Qr3gOQcMhHmQ37l4yRKMMWFBJYbRsA5ywoe4k92F8j9/RpzLBW980DtYxU/3aUgvMyTDCC9KMwyBuXABSkIt5l3TGsxFF543MI6HNCjqe9Cz9jznAQ85h+fcjDHJyAmT0xg2caLzwbNG3sEY0EOV3oeXYEjKgp5dguVQHc6w/yV76/K7O78nM/70hMk2DB/AkyU5h3iANWCFTYKJcAzygcbnwzgoBItBY6/Yr87HoLHGjJFYUhmXgp44qZIdsAJ2g7HuAu1AhaXAAngPHs78DIVW0BdqQQfQaFsYqlVdOwePwHI8DWPhOmjoO6jA8DwDRS9rQzIh+cS4BB7ASCgIR2AfqKOiRuyFgyxW2RbwtMVgIXOfAyW+awIWh3IHzN1wI8EaG3Em1IcbcIg5c2fvdNSICt1kKRrLBHjB7zQUtIWWPNvpO8EwGV4rx1Cam+6sSWb0MG+hLHs9lHIbYp4kMOkCC8BnO/2sz8gUSAGbrjA0A2Ou9/3BMBta93SEk5CMnljVolcPoyr9/WrxFMZXGQbHwRPaYIkBVpz7vLd6wjKwrC1z5+N1ftFITAIvfPkaDIknMe56Y3Ma0lMBJ8CyPsAabwILwjDbsOYiXmKeJGLAhM6AMqCLlSGU4qCiBXAVroDGvQzD2JtX+6wCuD8JnfXDsGnkc/DChdVgL7QMFyANwJD1Asu2DthPPSAUbwLFdrAF7H5zZ8990shNyAu3wEaztnW5DobsfivH/hGrJaQ57y135SHYnOoz+R5Ew+UgzcnDYPKMs+EysbvAO8tkXwa/JTWhahyWthWn2IBW2FowIq5X7Pw98deKpTgK9MKrxITr4QTwQ2UI9MbfHu4iPAnmvAj1ZBZYkaZgNbh3RBaS56dUpQNgM3jj6q5GrKhU8N5S/MaIV7pJN5TewJb8VLBXbNj90A9Woj8juZawSg2TFbKLl68DL01wZ1CpXtj9htSSdW4PuK8b1Ah+e2k2RMc8xl9Ng0JP55U9lpePefbLZ4dbtnpriIy1YbOETaw3hUa7gt/5reD6wZCCnheMmTpTQybQL+Mi8F4yvrpvxajsHpgzPSqGksOBt67zD4eHsQCm8y68sTMbUQKP/IQ+h/VgjvRIcb3euMbSnw6GrAD0Ab1PxUCmrv/DiIIh5/0g2YBWkXG3F/TKq0MvzUkJ8MNUBTai/BDjH/JXI6EExrwFOoHfcxWH/168JWxgD3ANA+EV85tEIj8AtaCkdv/9vSUAAAAASUVORK5CYII=" />
|
||||
</a>
|
||||
<a href="https://project.tang5618.com/?t=happy-reconstruction">
|
||||
<img alt="Webpage" src="https://img.shields.io/badge/Link-Webpage-c00000.svg?style=shield&logo=wordpress" />
|
||||
</a>
|
||||
<!--<a href="https://github.com/Tang1705/Reconstruction">
|
||||
<img alt="Github" src="https://img.shields.io/badge/Github-%20%20%20%20%20%20Repository-%2324292e.svg?style=shield&logo=Github" />
|
||||
</a>-->
|
||||
<a href="https://github.com/Tang1705/Happy-Reconstruction/raw/master/Doc/poster.pdf">
|
||||
<img alt="Poster" src="https://img.shields.io/badge/Poster-PDF-B50052.svg?style=shield&logo=adobe-indesign&logoColor=ffffff" />
|
||||
</a>
|
||||
<a href="https://github.com/Tang1705/Reconstruction/raw/master/Exe/Reconstructionn.exe">
|
||||
<img alt="Software" src="https://img.shields.io/badge/Release-EXE-2f528f.svg?style=shield&logo=windows" />
|
||||
</a>
|
||||
<a href="https://github.com/Tang1705/Reconstruction/raw/master/Doc/%E7%BB%93%E6%9E%84%E5%85%89%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E8%BD%AF%E4%BB%B6%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.pdf">
|
||||
<img alt="User-Guide" src="https://img.shields.io/badge/User%20Manual-PDF-548235.svg?style=shield&logo=adobe-acrobat-reader" />
|
||||
</a>
|
||||
<a href="https://github.com/Tang1705/Reconstruction/raw/master/Doc/%E7%BB%93%E6%9E%84%E5%85%89%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%88%86%E6%9E%90.pdf">
|
||||
<img alt="Software-Design-Patter" src="https://img.shields.io/badge/Design%20Pattern-PDF-548235.svg?style=shield&logo=latex" />
|
||||
</a>
|
||||
<br />
|
||||
<br />
|
||||
<a href="./Readme.md">
|
||||
<img src="https://img.shields.io/badge/Readme-%E4%B8%AD%E6%96%87%E7%89%88%E6%9C%AC-red?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP8AAACqCAMAAABVlWm8AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACLlBMVEXuHCXvMCLxRB7vJCT7zAjxSh3wMyHxSR7uHiX6uAz//wDwOCDuHSX7xgn80gf0cBfuICT4nBDvIyT/+wH96AT2jBP2ihP+8wL83QbvKSP96gP+7gPuIiT1fBX+6wP3khLwNCH0ZxnvLCL83Ab5qQ7vJSTuIST7xAr96QT6uwv2hhTyURzzZBnzYxn5sA32ghT5rg35rQ33lBH+9QL7ygn3lRHzYRr0Zhn+8AL+8gLxSB7uHyX0bxjyUhzzXhrzXRrxPh/4qA74pw7xQh/+7AP3lhHzWRvyWBv4og/xQR/96wP4nxD1dRb1gBX//AD0aRjwPSD2iRP4mxDzYBr0aRnwOiD4pA/0axj95AT95gTxPx//+gH1eRb5sg3//QD81QfyTR3yTB33lxHySx394AX94gXyUB36vwr1dhb1dxb2iBP3jhL//gD4nRDvKCP0bhj6vQv+7wPxRx7yVhzzXBv1fRXvLiL6wgrwMSLwPCDzWhvwNiH+9wH/+QH82AbwNSH5rA3vJyP6wQr0bRjwNyH70AjwOyD95wTzWxvwMCLwMiH1ehb7wwrvLSLvLyL1dBf1cxf6vgv6uQv5sgzvJiP4pQ/++AH1fxX+9gH82wb81gf0aBn94wX0ahj7zgj7yAn+9ALzYhr95QTyUxzyTh3+8QL94QX5tAzxQB/+7QP2gRT5qg7yTx30chf7yQn5swz2hBT7ywj93gX7xQn2ixP3mhH3kBL2gRX0bBj///+FqRNKAAAAAWJLR0S5OrgWYAAAAAd0SU1FB+UBAgU0OmbZKQQAAAQ/SURBVHja7Zv5WxNHGMdXKBheQxNZWhoU8AAkoFJt5FaonNo2ilUUEbRVbPEABAStqKBWQAWPUqCll9pqL+3hUf88N5vNYiWQ2egvs+/38zx59snuzDz57M7MO8dGUQAAAAAAwOtgQQxr/dg34lh6xy/UD44EWsTS35n4psutKIuJknhW/BiVkt96myiFa8vXHn2Ad7j6e1J1/yWupUxvQFqwAlB6xjJ7iS0XSrViJYVQM1fYKaSnZwmkyl5lyOd4c/Oy7fT4V9Magfi31tDPt127fpfWRU60/j3fhoJFyUSFdtN3F1FxxPqcVVIaOJQRbbSb/yatUpcLjwKpwm7+72v+m0UTV6oem+mXVgUGNW7R5NV2e/w1eq9eK5rcdoO/Ot2/LpqsW2yg78jR/beWRpH3gw/l999oDGvyosj7kX+bftxe75B9Vks7osj7Mfl3KsquBnW3tPrOPYZ/o9N65r1ETfuaW2i/vI//gDmn+8R65mx/MOsmeZv/p6Z/FIH9YIqe0ydx93fI9G+1mvXwZ0bOz2WRjWt7mSM0w5FZV+db6c/zmhlTDsoy0zvaQuIcOz7PrLC9o7oz1HXSiS5ZakB3srB+ek/E0jwntXRN2qeqUpYb0OsV1O87JRYA1dPxX+Rnes9IE/Db+gXsz+YKhXQtANYpslF5LqL+yhLBslr7z8sX82KPR9AfGBQt6sJ6KaN+YdE89ikXxQvKkHQf4JJvTv0vL1soZ1CRFPdR/xxB363woHsojP7WYYUNvTmz9HN6+egrI7NbQMsVRv5Xw9T/fYz8V4Xxv8ZHf1QN4+8fY+N/PWz8u8HG/2ZY/06rI0mnpPqeJtN5KG1mKNBkcXuzT9bt8DJT+dao4vnK/NZhqZTxs19L6n/L8J2Y1Guwa8r4nmCplAIqjpVSf9BYBfkmtHS35VvjfrRbKaaOaFpK/53GTH/cPJNkrApY8Rn/jqgvrmZ4+mKPZP56gy/+/n/nVp8InGwWmz/WNxZNvDBukmzckBTYuflh10tnz/yonf1JsEEPN0o8aV6jzXXC/OjSwKrAbdEI2hBaMFouXfNfR3fuhr3wcysNCJeyO+hfLp2+uyhhdK6n2vyL8MutBUH/DOn8uyfnGba67lqIfuoSoj3Sbf87XuHqC9yjqtqx+0TdCkt+JV+8dpj+LZOn/+8NwZ5i5I8slv4VM/2pArjQy1vf7eXtvziVp/efD/S9zjI6xNPf8XDirxpn1xTtZ1rx9/YT3UuW+23HV+Jv4/2ALKb+jn+M6f5AjZPlDcg3F3z+rWc4CugKLZH39+Uu5FcDxozXXR/Vsvz/uzuRKHWtSvSYZ+/3xBeo9E+J/mOp7wyuimefozbWw/8S9Rnv+U91AW//pMsKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDmOWPMtv1GDCVwAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTAyVDA1OjUyOjU4KzAwOjAwWHQoZgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wMlQwNTo1Mjo1OCswMDowMCkpkNoAAAAASUVORK5CYII="/>
|
||||
</a>
|
||||
<a href="./Readme-en.md">
|
||||
<img src="https://img.shields.io/badge/Readme-English%20Version-blue?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAZCAIAAAD8NuoTAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXvSURBVEhLzVdrUBNXFM4uCApJ0ELAks74gNouECggYiERRGWKgJoIalXUYkxw+sMOCgGLHaU+AEVntK1AHmipgJUQHjpOK08RSkQoiDWAlr4EC4lVkqBCJelZdksLgmUydIZv9se5Z+7Z/fY79979FrkbGs0UCemcJZRhPH02+EVO9SlZxcPePiLzCrDecmy5mtR1POvB0c/JFIXyxv4PmXECj5DDre3dZGpiONjRPopewV/m1Hc2R3PxsvHFC5qfF3OfANV+16RaswsubU0DzLOaZbFPsKq94uCJ/by5DDpR/H/A3paWlshrkfA3tCl/DNigzi2mLmZhxWKXUqlN4FJ0UW0hY/NaXf33qjV8UA4CqKFaWcbyV96rPHR8P49hSyNuNFUAQscTeXe+jOG11Pzy3tbe8wU033cwRabLFRmd40NBEOgYikVlFHpwFlZ9bb+NB5zuhuxQhUUTyllbWe7lr+ysTk4VcadEOXjDFNG6O+eF3Ns3OgMj1ReKqF6uWIkEuyylL1sChPp0z9IlZQs4SWjvI118ioK1I0vBYjvXyhlb1ulutoBycI2QixOuAuXSErhz7UwkZ283TEjKj2xTdgZEQMtoSzywEjFWIsUVolCA0Alxmcuq5Lijheo/9ChR1qPR7jsqd9uedcnNf9H1AsaWv9sKytU1wQQgB2uug2jra1SiajKAlqUmcFuzBRE/1P0cEtV7roD2rhe0DCuW4PsMRXT9A0DINTg5/ljhyD4jaRHoUWsT04qwbRlyd45T9SVGFFdX16QK/QAnd10JE6jWeFvvVyfDanX4L+WAPU7ovHB9a+1PQZvUOQprTxfssgy6hrcMRbT65ycl5W8GfgKEuntGbXwEWbCbDEcD3lIUE7yd7fTkTDaxdeHlmPECOhvXHKB/OnCl4s7GMO9xD4j80ltB8+h6Sa4mr9RoMND9vJnxQpq/N4LiQgChzNya09mVXT1PiKoxQPJK8AU0EWBNLF+6aPDXbn1jK5GherMs5zGJmMC4tAzPnvdV1BkGBiFjwZxL9XEnCBGoVt579bmIGAb/JENT0X1S8iDlLDkAWgm7HWP55MBUIEp7bzI0GQaD8cUQGcMdzVCKmRk5MBVI/Wx3MpxOGLUTpw+mKa2pWFtDQ8YhAxnDHc3NKP/adKZhuu7EyZxbCIKQY4MRDrCB33AjhZib2wT5mVGtxj23yMEwBrt7CGMCsHbHZjrPq6rv+F2tJTLjwnzzHhkZjgZ8W2J3BoUudyM5GYy6+iZQRVvbCG2y2xhGF2xV1LRHhHgOTx+LC8UN3GAPcG8QWzg6zHBgdEHtjQZkhrltxGrWnp2323VHzlyFrzIxfwzGWQSvM+jgh+5VHYoTBtOoMyGjrb2lWrsLd2PKZrtN4U7l+WA3WNGST09fIUpeRlrGN/PZSaek5fr+ARjS/b2xUtzA0Hw9NXkl9/24ofXlHbm74UHjWqZRtEAhmNdWfnDvrpXgBClGo/b6zTZejCpsp+5mM3y551/LK/YMcI0Wxx0rBNNBlk0AzWP93iPyhcsOpIvL4CMIGbr/YpxcicSG46PJL21byuXerrkr46clch0dZhNVBEhahGNsHyaEKwSEQCGuEC4IwIQ5leXJXf29hDLwP70aHVE1GQA5eAdsxcG0zG/BdkIGDNbbRVnADyRUf1XUEbiR11zTLIk+dSBixJWgoCH4u/tVyUCITsNbpgN3H86HCwLGpnDnyotydzaLLxWlKsbYj8njoVqbkFo0n5N0Qnyt/+lwW9k+WKkUjDLV1wNcYWdAZHhDpSpHmP7xeqAELuw53i8AKHTjVle6WFutRC0tbCNXW/G35Dc+OPLZ1UdP+vEJL8G0Px/bOdbxwmDB+2wb2iwiAw3pSs3AzTCKQGfmxEShxBrCFcJbJsAViuIuLMuVu/n7xJyLPVwwESeT8ehxvyhFAf74n7bCmgNHD/aQ7QNusYMTgWrrGsl/nromuw1hzlUXC1lsd75MlFo0kUebEoDfgrYugA0hKRtZc/BDBp2l+Xr8BWTo0i10Rj4iAAAAAElFTkSuQmCC""/>
|
||||
</a>
|
||||
<br/>
|
||||
<br/>
|
||||
<!-- <p align="center">
|
||||
<a href="./Readme.md">中文版本</a>
|
||||
·
|
||||
<a href="./Readme-en.md">English Version</a>
|
||||
</p>-->
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
## [👁️🗨️](https://emojipedia.org/eye-in-speech-bubble/) Overview
|
||||
|
||||
The wheel-rail attitude of high-speed rail reflects the complex dynamic interaction and restraint relationship between wheels and rails. Mastering the true contact attitude between them is an important foundation for ensuring the safe of high-speed railways. How to accurately obtain the wheel-track attitude of high-speed railways has always been a hot research field in domestic railway scientific research. However, it is imprecise and unreliable to obtain the wheel-rail contact attitude from 2D image. Extracting the feature points of the wheel-rail surface and reconstructing a 3D model can obtain the wheel-rail contact attitude more realistically and accurately.
|
||||
|
||||
|
||||
Due to the fast running speed of high-speed trains, the wheel-rail surface is relatively smooth and there are no obvious feature points, which brings great challenges to the 3D reconstruction based on feature point extraction.
|
||||
|
||||
<p align="center">
|
||||
<img src="./img/cn/01.gif" alt="01" width="45%" height="45%" hspace="10" /> <img src="./img/cn/02.gif" alt="02" width="45%" height="45%" />
|
||||
<br>
|
||||
</p>
|
||||
|
||||
3D reconstruction technology is an important branch of computer vision technology and a popular research direction combining computer vision and computer image graphics. According to whether it is in contact with the measured object during measurement, it can be divided into contact measurement and non-contact measurement.
|
||||
|
||||
<div class="imgs" align="center" ><img src="./img/en/03.png" alt="16" width="50%" height="50%"/></div>
|
||||
|
||||
Although the contact measurement method has high measurement accuracy, the measurement efficiency is low, the speed is slow, and improper operation can easily damage the surface of the object to be measured, and because the probe has a certain surface area, it is difficult to measure objects with complex surfaces and does not have universality and versatility. Non-contact three-dimensional measurement methods can be divided into two categories: active measurement and passive measurement. The former is to project a designed pattern onto the surface of the target object. The pattern is distorted due to the height fluctuation of the object, and the target object is obtained by matching the distorted pattern. The latter is to illuminate the target object with ambient light and then detect the characteristic points of the target object to obtain its data. The non-contact measurement method has become the research trend of three-dimensional profile measurement due to its advantages of no damage, high measurement speed, and simplicity.
|
||||
The coded structured light method used in the project uses a certain pattern of coded structured light patterns projected by the projector to encode the target object, uses the camera to obtain the object image, and uses the computer to decode the resulting image, using the image points in the camera and the projector The point correspondence in Calculates the space coordinates of the surface points of the object, obtains the three-dimensional information of the object, and restores the three-dimensional shape of the object. The structured light system is shown in the following figure.
|
||||
|
||||
<div class="imgs" align="center" ><img src="./img/en/04.png" alt="17" width="80%" height="80%"/></div>
|
||||
|
||||
The 3D reconstruction technology of coded structured light method is mainly composed of five key technologies: system calibration, structured light coding, image acquisition, structured light decoding and three-dimensional coordinate calculation.
|
||||
|
||||
<div class="imgs" align="center" ><img src="./img/en/05.png" alt="19" width="80%" height="80%"/></div>
|
||||
|
||||
- System Calibration: The system consists of a camera, a projector and a computer. The goal of calibration is to calculate the internal parameter matrix and the lens distortion coefficient of the camera and the projector and the external parameter matrix of the relative position between the two.
|
||||
- Structured Light Coding: The "identity" of each point of the pattern can be identified through coding.
|
||||
- Image Capture: The projector projects the coded structured light pattern on the surface of the target, and the pattern will be distorted with the modulation of the surface shape of the object. What is captured by the camera is the structured light image modulated by the object. The modulated image reflects the three-dimensional information of the surface shape of the object.
|
||||
- Structured Light Decoding: Decode the captured structured light image, the decoding method depends on the encoding method. The purpose is to establish the correspondence between the feature points of the camera plane and the projection plane.
|
||||
- 3D Coordinate Calculation: Using the corresponding relationship between the feature points and the calibration results, the 3D information of the feature points are obtained based on the principle of triangulation.
|
||||
|
||||
The coded structured light mainly include Time-multiplexing and Space Codification. Although Time-multiplexing has good reconstruction accuracy, it is not a good choice for moving objects because of the need to project multiple pictures on the surface of the object. Compared with Time-multiplexing, Space Codification has a lower reconstruction accuracy, but because only one picture is projected, it is often used for object reconstruction of dynamic objects.
|
||||
|
||||
In summary, given the difficulty in the project that the surface of the wheel and rail is smooth and the feature points are not easy to extract, the feature points on the surface of the object can be artificially increased by projecting the coding pattern on the surface of the object. The Space Codification only needs a single projection, which is suitable for the reconstruction of dynamic objects. Therefore, this project mainly studies the method of Space Codification to obtain a relatively finer and high-density three-dimensional point cloud (point cloud, a collection of feature points on the surface of the object. These points Contains information such as the three-dimensional coordinates and color of the surface of the object).
|
||||
|
||||
## [📷](https://emojipedia.org/camera/) Algorithm
|
||||
|
||||
<table><tr><td width="500px"><div class="img" align="center"><img src="./img/cn/06.png" alt="12" height="100%" width="100%"></div></td><td>The main innovations of the project are as follows:
|
||||
<ul><li><b>Stripe center extraction with sub-pixel precision</b>: Designed and implemented the coded structured light pattern and the stripe center point extraction algorithm suitable for the pattern, and the stripe center point is accurate to the sub-pixel level</li>
|
||||
<li><b>Increase point cloud density through wavelet transform</b>: An improved method of windowed Fourier transform for fringe phase analysis is proposed. The wavelet transform based on generalized Morse wavelet is used for analysis to obtain the phase information of non-central points. Increase point cloud density</li>
|
||||
<li><b>Construction of a full-process 3D reconstruction platform</b>: The above algorithm and point cloud visualization are packaged into structured light 3D reconstruction software, which completes the 3D reconstruction of rails and multiple geometric bodies, which is expected to be used for wheel-rail posture reconstruction and visualization</li></ul></td></tr></table>
|
||||
|
||||
<table> <tr> <td>Pattern Creation</td><td width="600px">The pattern is designed in HSV color space. And the pattern consists on a colored sinusoidal fringe pattern
|
||||
<ul>
|
||||
<li> The H channel is coded in the 𝐵(3,4) sequence. The stripes are the basic elements of the coding pattern. Different values correspond to the three colors of red, blue, and green.</li>
|
||||
<li> The S channel is set to 1 for all pixels.</li>
|
||||
<li> The V channel is calculated by the sinusodial signal.</li>
|
||||
</ul>
|
||||
<p>There are 64 stripes in the coding pattern, and the stripe width is 14 𝑝𝑖𝑥𝑒𝑙, with the center point of the stripe as the feature point of the projection pattern</p>
|
||||
♣ The 𝐷𝑒 𝐵𝑟𝑢𝑖𝑗𝑛 sequence is composed of 𝑛 different elements, and any consecutive subsequence whose length is 𝑚 only appears once
|
||||
</td><td><div align="center"><img src="./img/cn/07.png" alt="21" width="100%" height="100%"/></div></td></tr><tr><td> DeBruijn Analysis</td><td>After preprocessing the gray image, in order to extract the center point of the stripes, a local maximum algorithm is applied to searching local maxima (detected with sub-pixel precision) of each row of the image from the strips which is present a gaussian-like shape, The local maximum point is the center point of the fringe. In the 𝐿𝑎𝑏 color space, classify the colors of the center point of the stripe. In a 4×1 window, you can get the corresponding position of the center point of the stripe in the projection pattern.</td><td><div align="center"><img src="./img/cn/08.png" alt="22" width="100%" height="100%"/></div></td></tr><tr><td>Wavelet Transform Analysis</td><td>The change of the V channel satisfies the given cosine function and contains the phase information of the non-center point of the fringe. But after the pattern is modulated by the object, the originally stable signal changes. As a non-stationary signal processing method, the wavelet transform method has been introduced into many signal processing fields, including phase extraction from fringe patterns. Comprehensive comparison of one-dimensional and two-dimensional window Fourier transform, wavelet transform and other methods, for the consideration of reconstruction accuracy and speed, the one-dimensional wavelet transform method is selected. The generalized Morse wavelet has flexible time-frequency local characteristics and strict analysis, and the effect of measuring the 3D contour of the object is better than the popular complex Morlet wavelet as the mother wavelet.</td><td><div align="center"><img src="./img/cn/09.png" alt="23" width="100%" height="100%"/></div></td></tr></table>
|
||||
|
||||
|
||||
|
||||
|
||||
## [📽️](https://emojipedia.org/film-projector/) Performance
|
||||
|
||||
<table> <tr align="center"> <td><div align="center"><img src="./img/cn/10.gif" alt="24" width="100%" height="100%"/></div></td><td>
|
||||
<div align="center"><img src="./img/cn/11.gif" alt="25" width="100%" height="100%"/></div> </td><td> <div align="center"><img src="./img/cn/12.gif" alt="26" width="100%" height="100%"/></div> </td></tr><tr align="center"><td>Sphere with a radius of 95mm<br>Point cloud data 17W+<br>Radius error 0.678mm<br>Calculation time 10-15s</td><td>Multi-object 3D reconstruction</td><td>3D reconstruction of rail surface</td></tr></table>
|
||||
|
||||
|
||||
|
||||
|
||||
## [💻](https://emojipedia.org/laptop/) Demo
|
||||
|
||||
<a style="color:black" href="./Exe/Reconstructionn.exe">The software</a> integrates the entire process of 3D reconstruction, and implements the three functions of system calibration, 3D reconstruction and point cloud rendering. The software uses C++ as the development language and the interface development is based on the QT framework, which relies on OpenCV and PCL (Point Cloud Library) for image and point cloud data processing. It adopts some design patterns such as singleton pattern and chain of responsibility pattern, etc. <a href="https://youtu.be/DM47pxDPks8"><img src="https://img.shields.io/badge/Demo- -%23FF0000?colorA=%23FF0000&colorB=%23FF0000&style=for-the-badge&logo=YouTube"/></a>
|
||||
|
||||
- UI of System Calibration
|
||||
<div class="imgs" align="center" ><img src="./img/cn/13.jpg" alt="16" width="75%" height="75%" /></div>
|
||||
|
||||
- UI of 3D reconstruction
|
||||
<div class="imgs" align="center" ><img src="./img/cn/14.jpg" alt="17" width="75%" height="75%" /></div>
|
||||
|
||||
- UI of point cloud rendering
|
||||
<div class="imgs" align="center" ><img src="./img/cn/15.jpg" alt="18" width="75%" height="75%" /></div>
|
||||
|
||||
## [🔧](https://emojipedia.org/wrench/) Configuration
|
||||
|
||||
<table><tr align="center" style="background-color:#D9E2F3"><td width="500px">Hardware</td><td width="500px">Version</td></tr><tr align="center"><td>Point Grey Camera</td><td>——</td></tr><tr align="center"><td>LightCrafter4500</td><td>——</td></tr></table>
|
||||
|
||||
<table><tr align="center" style="background-color:#D9E2F3"><td width="500px">Software</td><td width="500px">Version</td></tr><tr align="center"><td>Windows</td><td>Windows 10</td></tr><tr align="center"><td>Visual Studio</td><td>2017</td></tr><tr align="center"><td>QT</td><td>5.12.3</td></tr><tr align="center"><td>OpenCV</td><td>4.2.03</td></tr><tr align="center"><td>FlyCapture2</td><td>2.12.3.2</td></tr><tr align="center"><td>PCL</td><td>1.8.1</td></tr><tr align="center"><td>VTK</td><td>8.0</td></tr></table>
|
||||
|
||||
<div><text style="color:red">Note</text>: Need to configure the environment variables of the computer and the properties of the project in Visual Studio (VC++ directory-include directory, VC++-library directory and linker-input-additional dependencies)</div>
|
||||
|
||||
## 📜 License
|
||||
|
||||
The code is made available under the [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0).
|
||||
|
||||
## 🔒 Copyright
|
||||
|
||||
It is applied for a software copyright (Structured Light 3D Reconstruction Software V1.0, registration number: 2022SR0655971)
|
||||
|
||||
144
Readme.md
@@ -1,36 +1,142 @@
|
||||
高铁轮轨姿态反映了车轮与钢轨之间复杂的动态相互作用和约束关系,掌握他们之间真实接触姿态是保障高速铁路安全运营的重要基础。如何能够精确获得高铁轮轨姿态一直是国内铁路科研的热门研究领域。而单单从二维图像上获取轮轨接触姿态是不精确、不可靠的,需要将轮轨表面的特征点提取出来,重建出一个三维模型才能更加真实正确地获得轮轨接触姿态。
|
||||
<h1 align="center">
|
||||
<a href="https://github.com/Tang1705/Happy-Reconstruction" title="3D Reconstruction of High-Speed Rail-Wheel Based on Coded Structured Light">
|
||||
<img alt="Reconstruction" src="http://static.zybuluo.com/TangWill/jhiwlfucn275608lfkr5yw86/icon.png" width="200px" height="200px" />
|
||||
</a>
|
||||
<br />
|
||||
基于编码结构光的高铁轮轨姿态三维重建
|
||||
</h1>
|
||||
<p align="center">
|
||||
3D Reconstruction of High-Speed Rail-Wheel Based on Coded Structured Light
|
||||
</p>
|
||||
<div align="center">
|
||||
<a href="http://gjcxcy.bjtu.edu.cn/NewLXItemListForStudentDetail.aspx?ItemNo=594113&year=2020&type=student&IsLXItem=1">
|
||||
<img alt="Organization" src="https://img.shields.io/badge/Organization-BJTU-072063.svg?style=shield&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAaCAYAAABCfffNAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQ4SURBVEhLfZZ3qI5RGMC/j+vae3Otskn2JmSma0SZJUkR4h+biBuyytZNyChKlJ0tIbtsMq+V7L1dv9/nfa/vWk/9Ot973nOe5zzrvF808h9JT0/PztAIWkBR+ArZ4BtkhadwEE5Eo9EvjH+VfxrBQG+G5nAGDkBFOIqyj4y+L8LgATTeFLbDNt6nM/5f2FwSZkMPyAdRyAqDIEewJgF6Qr3gOQcMhHmQ37l4yRKMMWFBJYbRsA5ywoe4k92F8j9/RpzLBW980DtYxU/3aUgvMyTDCC9KMwyBuXABSkIt5l3TGsxFF543MI6HNCjqe9Cz9jznAQ85h+fcjDHJyAmT0xg2caLzwbNG3sEY0EOV3oeXYEjKgp5dguVQHc6w/yV76/K7O78nM/70hMk2DB/AkyU5h3iANWCFTYKJcAzygcbnwzgoBItBY6/Yr87HoLHGjJFYUhmXgp44qZIdsAJ2g7HuAu1AhaXAAngPHs78DIVW0BdqQQfQaFsYqlVdOwePwHI8DWPhOmjoO6jA8DwDRS9rQzIh+cS4BB7ASCgIR2AfqKOiRuyFgyxW2RbwtMVgIXOfAyW+awIWh3IHzN1wI8EaG3Em1IcbcIg5c2fvdNSICt1kKRrLBHjB7zQUtIWWPNvpO8EwGV4rx1Cam+6sSWb0MG+hLHs9lHIbYp4kMOkCC8BnO/2sz8gUSAGbrjA0A2Ou9/3BMBta93SEk5CMnljVolcPoyr9/WrxFMZXGQbHwRPaYIkBVpz7vLd6wjKwrC1z5+N1ftFITAIvfPkaDIknMe56Y3Ma0lMBJ8CyPsAabwILwjDbsOYiXmKeJGLAhM6AMqCLlSGU4qCiBXAVroDGvQzD2JtX+6wCuD8JnfXDsGnkc/DChdVgL7QMFyANwJD1Asu2DthPPSAUbwLFdrAF7H5zZ8990shNyAu3wEaztnW5DobsfivH/hGrJaQ57y135SHYnOoz+R5Ew+UgzcnDYPKMs+EysbvAO8tkXwa/JTWhahyWthWn2IBW2FowIq5X7Pw98deKpTgK9MKrxITr4QTwQ2UI9MbfHu4iPAnmvAj1ZBZYkaZgNbh3RBaS56dUpQNgM3jj6q5GrKhU8N5S/MaIV7pJN5TewJb8VLBXbNj90A9Woj8juZawSg2TFbKLl68DL01wZ1CpXtj9htSSdW4PuK8b1Ah+e2k2RMc8xl9Ng0JP55U9lpePefbLZ4dbtnpriIy1YbOETaw3hUa7gt/5reD6wZCCnheMmTpTQybQL+Mi8F4yvrpvxajsHpgzPSqGksOBt67zD4eHsQCm8y68sTMbUQKP/IQ+h/VgjvRIcb3euMbSnw6GrAD0Ab1PxUCmrv/DiIIh5/0g2YBWkXG3F/TKq0MvzUkJ8MNUBTai/BDjH/JXI6EExrwFOoHfcxWH/168JWxgD3ANA+EV85tEIj8AtaCkdv/9vSUAAAAASUVORK5CYII=" />
|
||||
</a>
|
||||
<a href="https://project.tang5618.com/?t=happy-reconstruction">
|
||||
<img alt="Webpage" src="https://img.shields.io/badge/Link-Webpage-c00000.svg?style=shield&logo=wordpress" />
|
||||
</a>
|
||||
<!--<a href="https://project.tang5618.com/?t=happy-reconstruction">
|
||||
<img alt="Github" src="https://img.shields.io/badge/Github-%20%20%20%20%20%20Repository-%2324292e.svg?style=shield&logo=Github" />
|
||||
</a>-->
|
||||
<a href="https://github.com/Tang1705/Happy-Reconstruction/raw/master/Doc/poster.pdf">
|
||||
<img alt="Poster" src="https://img.shields.io/badge/Poster-PDF-B50052.svg?style=shield&logo=adobe-indesign&logoColor=ffffff" />
|
||||
</a>
|
||||
<a href="https://github.com/Tang1705/Reconstruction/raw/master/Exe/Reconstructionn.exe">
|
||||
<img alt="Software" src="https://img.shields.io/badge/Release-EXE-2f528f.svg?style=shield&logo=windows" />
|
||||
</a>
|
||||
<a href="https://github.com/Tang1705/Reconstruction/raw/master/Doc/%E7%BB%93%E6%9E%84%E5%85%89%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E8%BD%AF%E4%BB%B6%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.pdf">
|
||||
<img alt="User-Guide" src="https://img.shields.io/badge/User%20Manual-PDF-548235.svg?style=shield&logo=adobe-acrobat-reader" />
|
||||
</a>
|
||||
<a href="https://github.com/Tang1705/Reconstruction/raw/master/Doc/%E7%BB%93%E6%9E%84%E5%85%89%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%88%86%E6%9E%90.pdf">
|
||||
<img alt="Software-Design-Patter" src="https://img.shields.io/badge/Design%20Pattern-PDF-548235.svg?style=shield&logo=latex" />
|
||||
</a>
|
||||
<br/>
|
||||
<br />
|
||||
<a href="./Readme.md">
|
||||
<img src="https://img.shields.io/badge/Readme-%E4%B8%AD%E6%96%87%E7%89%88%E6%9C%AC-red?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP8AAACqCAMAAABVlWm8AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACLlBMVEXuHCXvMCLxRB7vJCT7zAjxSh3wMyHxSR7uHiX6uAz//wDwOCDuHSX7xgn80gf0cBfuICT4nBDvIyT/+wH96AT2jBP2ihP+8wL83QbvKSP96gP+7gPuIiT1fBX+6wP3khLwNCH0ZxnvLCL83Ab5qQ7vJSTuIST7xAr96QT6uwv2hhTyURzzZBnzYxn5sA32ghT5rg35rQ33lBH+9QL7ygn3lRHzYRr0Zhn+8AL+8gLxSB7uHyX0bxjyUhzzXhrzXRrxPh/4qA74pw7xQh/+7AP3lhHzWRvyWBv4og/xQR/96wP4nxD1dRb1gBX//AD0aRjwPSD2iRP4mxDzYBr0aRnwOiD4pA/0axj95AT95gTxPx//+gH1eRb5sg3//QD81QfyTR3yTB33lxHySx394AX94gXyUB36vwr1dhb1dxb2iBP3jhL//gD4nRDvKCP0bhj6vQv+7wPxRx7yVhzzXBv1fRXvLiL6wgrwMSLwPCDzWhvwNiH+9wH/+QH82AbwNSH5rA3vJyP6wQr0bRjwNyH70AjwOyD95wTzWxvwMCLwMiH1ehb7wwrvLSLvLyL1dBf1cxf6vgv6uQv5sgzvJiP4pQ/++AH1fxX+9gH82wb81gf0aBn94wX0ahj7zgj7yAn+9ALzYhr95QTyUxzyTh3+8QL94QX5tAzxQB/+7QP2gRT5qg7yTx30chf7yQn5swz2hBT7ywj93gX7xQn2ixP3mhH3kBL2gRX0bBj///+FqRNKAAAAAWJLR0S5OrgWYAAAAAd0SU1FB+UBAgU0OmbZKQQAAAQ/SURBVHja7Zv5WxNHGMdXKBheQxNZWhoU8AAkoFJt5FaonNo2ilUUEbRVbPEABAStqKBWQAWPUqCll9pqL+3hUf88N5vNYiWQ2egvs+/38zx59snuzDz57M7MO8dGUQAAAAAAwOtgQQxr/dg34lh6xy/UD44EWsTS35n4psutKIuJknhW/BiVkt96myiFa8vXHn2Ad7j6e1J1/yWupUxvQFqwAlB6xjJ7iS0XSrViJYVQM1fYKaSnZwmkyl5lyOd4c/Oy7fT4V9Magfi31tDPt127fpfWRU60/j3fhoJFyUSFdtN3F1FxxPqcVVIaOJQRbbSb/yatUpcLjwKpwm7+72v+m0UTV6oem+mXVgUGNW7R5NV2e/w1eq9eK5rcdoO/Ot2/LpqsW2yg78jR/beWRpH3gw/l999oDGvyosj7kX+bftxe75B9Vks7osj7Mfl3KsquBnW3tPrOPYZ/o9N65r1ETfuaW2i/vI//gDmn+8R65mx/MOsmeZv/p6Z/FIH9YIqe0ydx93fI9G+1mvXwZ0bOz2WRjWt7mSM0w5FZV+db6c/zmhlTDsoy0zvaQuIcOz7PrLC9o7oz1HXSiS5ZakB3srB+ek/E0jwntXRN2qeqUpYb0OsV1O87JRYA1dPxX+Rnes9IE/Db+gXsz+YKhXQtANYpslF5LqL+yhLBslr7z8sX82KPR9AfGBQt6sJ6KaN+YdE89ikXxQvKkHQf4JJvTv0vL1soZ1CRFPdR/xxB363woHsojP7WYYUNvTmz9HN6+egrI7NbQMsVRv5Xw9T/fYz8V4Xxv8ZHf1QN4+8fY+N/PWz8u8HG/2ZY/06rI0mnpPqeJtN5KG1mKNBkcXuzT9bt8DJT+dao4vnK/NZhqZTxs19L6n/L8J2Y1Guwa8r4nmCplAIqjpVSf9BYBfkmtHS35VvjfrRbKaaOaFpK/53GTH/cPJNkrApY8Rn/jqgvrmZ4+mKPZP56gy/+/n/nVp8InGwWmz/WNxZNvDBukmzckBTYuflh10tnz/yonf1JsEEPN0o8aV6jzXXC/OjSwKrAbdEI2hBaMFouXfNfR3fuhr3wcysNCJeyO+hfLp2+uyhhdK6n2vyL8MutBUH/DOn8uyfnGba67lqIfuoSoj3Sbf87XuHqC9yjqtqx+0TdCkt+JV+8dpj+LZOn/+8NwZ5i5I8slv4VM/2pArjQy1vf7eXtvziVp/efD/S9zjI6xNPf8XDirxpn1xTtZ1rx9/YT3UuW+23HV+Jv4/2ALKb+jn+M6f5AjZPlDcg3F3z+rWc4CugKLZH39+Uu5FcDxozXXR/Vsvz/uzuRKHWtSvSYZ+/3xBeo9E+J/mOp7wyuimefozbWw/8S9Rnv+U91AW//pMsKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDmOWPMtv1GDCVwAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTAyVDA1OjUyOjU4KzAwOjAwWHQoZgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wMlQwNTo1Mjo1OCswMDowMCkpkNoAAAAASUVORK5CYII="/>
|
||||
</a>
|
||||
<a href="./Readme-en.md">
|
||||
<img src="https://img.shields.io/badge/Readme-English%20Version-blue?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAZCAIAAAD8NuoTAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXvSURBVEhLzVdrUBNXFM4uCApJ0ELAks74gNouECggYiERRGWKgJoIalXUYkxw+sMOCgGLHaU+AEVntK1AHmipgJUQHjpOK08RSkQoiDWAlr4EC4lVkqBCJelZdksLgmUydIZv9se5Z+7Z/fY79979FrkbGs0UCemcJZRhPH02+EVO9SlZxcPePiLzCrDecmy5mtR1POvB0c/JFIXyxv4PmXECj5DDre3dZGpiONjRPopewV/m1Hc2R3PxsvHFC5qfF3OfANV+16RaswsubU0DzLOaZbFPsKq94uCJ/by5DDpR/H/A3paWlshrkfA3tCl/DNigzi2mLmZhxWKXUqlN4FJ0UW0hY/NaXf33qjV8UA4CqKFaWcbyV96rPHR8P49hSyNuNFUAQscTeXe+jOG11Pzy3tbe8wU033cwRabLFRmd40NBEOgYikVlFHpwFlZ9bb+NB5zuhuxQhUUTyllbWe7lr+ysTk4VcadEOXjDFNG6O+eF3Ns3OgMj1ReKqF6uWIkEuyylL1sChPp0z9IlZQs4SWjvI118ioK1I0vBYjvXyhlb1ulutoBycI2QixOuAuXSErhz7UwkZ283TEjKj2xTdgZEQMtoSzywEjFWIsUVolCA0Alxmcuq5Lijheo/9ChR1qPR7jsqd9uedcnNf9H1AsaWv9sKytU1wQQgB2uug2jra1SiajKAlqUmcFuzBRE/1P0cEtV7roD2rhe0DCuW4PsMRXT9A0DINTg5/ljhyD4jaRHoUWsT04qwbRlyd45T9SVGFFdX16QK/QAnd10JE6jWeFvvVyfDanX4L+WAPU7ovHB9a+1PQZvUOQprTxfssgy6hrcMRbT65ycl5W8GfgKEuntGbXwEWbCbDEcD3lIUE7yd7fTkTDaxdeHlmPECOhvXHKB/OnCl4s7GMO9xD4j80ltB8+h6Sa4mr9RoMND9vJnxQpq/N4LiQgChzNya09mVXT1PiKoxQPJK8AU0EWBNLF+6aPDXbn1jK5GherMs5zGJmMC4tAzPnvdV1BkGBiFjwZxL9XEnCBGoVt579bmIGAb/JENT0X1S8iDlLDkAWgm7HWP55MBUIEp7bzI0GQaD8cUQGcMdzVCKmRk5MBVI/Wx3MpxOGLUTpw+mKa2pWFtDQ8YhAxnDHc3NKP/adKZhuu7EyZxbCIKQY4MRDrCB33AjhZib2wT5mVGtxj23yMEwBrt7CGMCsHbHZjrPq6rv+F2tJTLjwnzzHhkZjgZ8W2J3BoUudyM5GYy6+iZQRVvbCG2y2xhGF2xV1LRHhHgOTx+LC8UN3GAPcG8QWzg6zHBgdEHtjQZkhrltxGrWnp2323VHzlyFrzIxfwzGWQSvM+jgh+5VHYoTBtOoMyGjrb2lWrsLd2PKZrtN4U7l+WA3WNGST09fIUpeRlrGN/PZSaek5fr+ARjS/b2xUtzA0Hw9NXkl9/24ofXlHbm74UHjWqZRtEAhmNdWfnDvrpXgBClGo/b6zTZejCpsp+5mM3y551/LK/YMcI0Wxx0rBNNBlk0AzWP93iPyhcsOpIvL4CMIGbr/YpxcicSG46PJL21byuXerrkr46clch0dZhNVBEhahGNsHyaEKwSEQCGuEC4IwIQ5leXJXf29hDLwP70aHVE1GQA5eAdsxcG0zG/BdkIGDNbbRVnADyRUf1XUEbiR11zTLIk+dSBixJWgoCH4u/tVyUCITsNbpgN3H86HCwLGpnDnyotydzaLLxWlKsbYj8njoVqbkFo0n5N0Qnyt/+lwW9k+WKkUjDLV1wNcYWdAZHhDpSpHmP7xeqAELuw53i8AKHTjVle6WFutRC0tbCNXW/G35Dc+OPLZ1UdP+vEJL8G0Px/bOdbxwmDB+2wb2iwiAw3pSs3AzTCKQGfmxEShxBrCFcJbJsAViuIuLMuVu/n7xJyLPVwwESeT8ehxvyhFAf74n7bCmgNHD/aQ7QNusYMTgWrrGsl/nromuw1hzlUXC1lsd75MlFo0kUebEoDfgrYugA0hKRtZc/BDBp2l+Xr8BWTo0i10Rj4iAAAAAElFTkSuQmCC"/>
|
||||
</a>
|
||||
<br/>
|
||||
<br/>
|
||||
<!-- <p align="center">
|
||||
<a href="./Readme.md">中文版本</a>
|
||||
·
|
||||
<a href="./Readme-en.md">English Version</a>
|
||||
</p>-->
|
||||
</div>
|
||||
|
||||
高铁列车运行速度快,轮轨表面相对光滑且无明显特征点,使得特征不易提取,点云重建精度较差,给三维重建带来了很大的困难。
|
||||
|
||||
<div class="imgs" align="center" ><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/00.gif" alt="01" width="45%" height="45%" /> </div>
|
||||
|
||||
针对高铁列车速度快的特点,可以通过采用非接触的测量方法 —— 计算机视觉。物体表面的点云三维重建在机器视觉领域已经成为一个很重要的研究方向。点云即物体表面特征点的集合,这些点包含了物体表面的三维坐标以及颜色等信息。点云的重建方法包括基于结构光的三维重建技术、光照模型、基于单目视觉或双目视觉的重建方法等。
|
||||
## [👁️🗨️](https://emojipedia.org/eye-in-speech-bubble/) 基本概述
|
||||
|
||||
当物体表面相对光滑时,物体的特征不易提取,点云重建精度较差。而基于编码结构光的重建方法可以向物体表面投射编码图案从而增加物体表面的特征,获得较好的点云重建结果。编码结构光三维重建技术主要由图像获取、结构光编码、结构光解码、系统标定和三维坐标计算等5个关键技术组成。
|
||||
高铁轮轨姿态反映了车轮与钢轨之间复杂的动态相互作用和约束关系,掌握他们之间真实接触姿态是保障高速铁路安全运营的重要基础。如何能够精确获得高铁轮轨姿态一直是国内铁路科研的热门研究领域。但单单从二维图像上获取轮轨接触姿态是不精确、不可靠的,而将轮轨表面的特征点提取出来,重建出一个三维模型能更加真实、准确地获得轮轨接触姿态。
|
||||
|
||||
结构光的编码方式主要有时间编码和空间编码两种。时间编码虽具有较好的重建精度,但由于需要向物体表面投射多张图片,所以对于运动物体来说时间编码的结构光重建不是一个好的选择.空间编码虽然重建精度相对没有时间编码好,但由于只需投射一张图片,所以常常用于动态物体的物体重建。综上所述,本项目主要研究通过空间编码的方式获得相对更高精度和高密度的三维点云。
|
||||
由于高铁列车运行速度快,轮轨表面相对光滑且无明显特征点,给基于特征点提取的三维重建带来了极大挑战。
|
||||
|
||||
项目前期,对项目研究内容进行深入了解,根据研究内容查阅相关文献资料,了解了目前各项技术研究现状,能够明白经典方法的原理并能够将其实现。在学习并理解了研究内容及相关原理的基础上,对空间编码中的基于 De Bruijn 序列编码和基于伪随机矩阵编码两种方式的有关理论及其相关论文进行了学习,部分论文如下所示。
|
||||
<p align="center">
|
||||
<img src="./img/cn/01.gif" alt="01" width="45%" height="45%" hspace="10" /> <img src="./img/cn/02.gif" alt="02" width="45%" height="45%" />
|
||||
<br>
|
||||
</p>
|
||||
|
||||
<div class="imgs" align="center" ><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/02.png" alt="03" width="30%" height="30%" /> <img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/03.png" alt="04" width="30%" height="30%" /> <img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/04.png" alt="05" width="30%" height="30%" /></div>
|
||||
|
||||
项目中期,对前期所阅读的文献和经典算法的实现进行研究、归纳、整理。参照本项目的研究内容拟选出适用的相关算法与技术,提出实验思路,制定实验方案。
|
||||
三维重建技术是计算机视觉技术的一个重要分支,是计算机视觉和计算机图像图形学相结合的一个热门研究方向。根据测量时是否与被测物体接触,可分为接触式测量和非接触式测量。
|
||||
|
||||
伪随机序列具有良好的窗口特性,即通过一个较小的窗口在编码图案上面移动时,每个窗口内的编码组合是唯一的,根据窗口的这个特性可以唯一地辨识编码图案上的特征点。复现论文的本原多项式采用 h(x)=2𝑥^6+2𝑥^5+𝑥^4+3𝑥^3+2𝑥^2+2𝑥+1,菱形作为结构光编码图案的基本元素,红、蓝、绿、黑四种颜色作为标记菱形代表的不同数值,窗口大小为$2\times 3$,同时以菱形角点作为特征点,可以有效提高特征点提取的精度。根据论文提出的结构光解码方法,可有效提取物体表面特征点,但由于角点数量较少,不能达到稠密点云的效果,未来可以通过改善相机分辨率,减小菱形面积,增加特征点等方式以提高特征点的密度。部分参考论文和实验结果如下。
|
||||
<div class="imgs" align="center"><img src="./img/cn/03.png" alt="17" width="50%" height="50%"/></div>
|
||||
|
||||
<div class="imgs" align="center" ><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/04.png" alt="06" width="22%" height="22%" /> <img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/05.png" alt="07" width="22%" height="22%" /> <img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/06.png" alt="08" width="22%" height="22%" /><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/07.png" alt="09" width="22%" height="22%" /></div>
|
||||
接触式测量方法虽然测量精度高,但测量效率低,速度慢,操作不当很容易损坏被测物体表面,而且由于探头有一定表面积,对表面复杂的物体难以测量,不具备普遍性和通用性。非接触式三维测量方式又可以分为两大类:主动式测量和被动式测量。前者是向目标物体表面投射设计好的图案,该图案由于物体的高度起伏引起一定的畸变,通过匹配畸变的图案获得目标物体的。后者是通过周围环境光对目标物体进行照射,然后检测目标物体的特征点以得到其数据。非接触式测量方式以其无损坏、测量速度高、简单等优点已成为三维轮廓测量的研究趋势。
|
||||
|
||||
De Bruijn 序列由n种不同元素构成,任意长度为m的连续子序列只出现一次。复现的论文以 B(3,4) 序列进行编码,条纹作为结构光编码图案的基本元素,红、蓝、绿三种颜色作为标记条纹代表的不同数值,窗口大小为 4*1,以条纹中心点作为特征点。同时在 HSV 颜色空间模型中,以余弦函数对条纹的 V 通道进行编码。在结构光解码时,除了提取条纹中心点作为特征点,同时对拍摄到的图像的 V 通道进行加窗傅里叶变换分析,通过分析得到的相位进而增加特征点的密度。根据论文的基本思路,可在提高提取点云进度的同时增加点云的稠密度,实验效果较好。根据项目内容和有关研究的进展,在研究论文和实验的基础上,对复现论文的算法进行改进,提出适合项目场景的算法流程。部分论文如下。
|
||||
项目采用的编码结构光法利用投影仪投射出的一定模式的编码结构光图案对目标物体进行编码,利用摄像机获取物体图像,通过计算机对所得图像进行解码处理,利用摄像机中的图像点和投影仪中的点对应关系计算物体表面点的空间坐标,获得物体的三维信息,从而还原物体三维形状,结构光系统如下图所示。
|
||||
|
||||
<div class="imgs" align="center" ><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/08.png" alt="10" width="22%" height="22%" /> <img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/09.png" alt="11" width="22%" height="22%" /> <img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/10.png" alt="12" width="22%" height="22%" /><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/11.png" alt="13" width="22%" height="22%" /></div>
|
||||
<div class="imgs" align="center" ><img src="./img/cn/04.png" alt="17" width="80%" height="80%"/></div>
|
||||
|
||||
基于改进的算法对球体表面进行重建,得到约 17W 条点云数据,在 Meshlab 中对点云数据进行渲染,实验结果如下。
|
||||
<div class="imgs" align="center" ><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/13.png" alt="14" /></div>
|
||||
编码结构光法三维重建技术主要由系统标定、结构光编码、图像获取、结构光解码和三维坐标计算等5个关键技术组成。
|
||||
|
||||
改用以 B(4,3) 序列进行编码,条纹作为结构光编码图案的基本元素,红、蓝、绿、白四种颜色作为标记条纹代表的不同数值,窗口大小为 3*1,以条纹中心点作为特征点。同样对球体表面进行重建,得到约 20W 条点云数据,在 Meshlab 中对点云数据进行渲染,实验结果如下。
|
||||
<div class="imgs" align="center" ><img src="./img/cn/05.png" alt="19" width="80%" height="80%"/></div>
|
||||
|
||||
<div class="imgs" align="center" ><img src="https://5618.oss-cn-beijing.aliyuncs.com/wordpress/image/00/14.png" alt="15" /></div>
|
||||
- 系统标定:系统由摄像机、投影仪和计算机组成,标定的目标是计算摄像机和投影仪内参矩阵、镜头畸变系数和两者之间相对位置的外参矩阵;
|
||||
- 结构光编码:通过编码的方式使图像每一点的“身份”可以被识别;
|
||||
- 图像获取:投影仪向物体投射编码结构光图案,图案会随物体表面形状的调制而发生畸变,摄像机拍摄被物体调制过的结构光图像,变形的图像反映了物体表面形状的三维信息;
|
||||
- 结构光解码:对捕获的结构光图像进行解码,解码的方法取决于编码的方法,目的是建立相机平面和投影平面特征点之间的对应关系;
|
||||
- 三维坐标计算:利用解码算法得出的特征点对应关系和系统标定结果,基于三角测量原理求出特征点的三维信息。
|
||||
|
||||
---
|
||||
结构光的编码方式主要有时间编码和空间编码两种。时间编码虽具有较好的重建精度,但由于需要向物体表面投射多张图片,所以对于运动物体来说时间编码的结构光重建不是一个好的选择。空间编码相较于时间编码重建精度较低,但由于只需投射一张图片,所以常常用于动态物体的物体重建。
|
||||
|
||||
综上所述,针对项目中轮轨表面光滑,特征点不易提取的难点,可以通过向物体表面投射编码图案,人为地增加物体表面的特征点。由于空间编码只需单次投影,适合对高速运动的高铁轮轨进行重建。因此,本项目主要研究通过空间编码结构光方法获得相对更高精度和高密度的三维点云(点云,即物体表面特征点的集合,这些点包含了物体表面的三维坐标及颜色等信息)。
|
||||
|
||||
## [📷](https://emojipedia.org/camera/) 技术路线
|
||||
|
||||
<table><tr><td width="500px"><div class="img" align="center"><img src="./img/cn/06.png" alt="12" height="100%" width="100%"></div></td><td>项目主要创新点如下:
|
||||
<ul><li><b>亚像素级条纹中心的提取</b>:设计实现了编码结构光图案以及适用于该图案的条纹中心点提取算法,将条纹中心点精确到亚像素级别</li>
|
||||
<li><b>通过小波变换增加点云稠密度</b>:提出了加窗傅里叶变化对条纹相位分析的改进方法,采用用基于广义 Morse 小波的小波变换进行分析,获得非中心点的相位信息,增加点云稠密度</li>
|
||||
<li><b>构建三维重建全流程平台</b>:将上述算法与点云可视化封装成结构光三维重建软件,完成了铁轨及多个几何体的三维重建,预期可用于轮轨姿态重建和可视化</li></ul></td></tr></table>
|
||||
|
||||
<table> <tr> <td>编码图案</td><td width="600px">在 HSV 颜色空间下对编码图案进行设计,图案由彩色正弦条纹图案组成
|
||||
<ul>
|
||||
<li> H 通道以 𝐵(3,4) 序列进行编码,条纹作为编码图案的基本元素,不同的数值分别对应红、蓝、绿三种颜色</li>
|
||||
<li> S 通道设定为1</li>
|
||||
<li>V 通道按照给定的余弦函数计算每一个像素点的值</li>
|
||||
</ul>
|
||||
<p>编码图案共64条条纹,条纹宽度14 𝑝𝑖𝑥𝑒𝑙,以条纹中心点作为投影图案的特征点</p>
|
||||
♣ 𝐷𝑒 𝐵𝑟𝑢𝑖𝑗𝑛 序列由 𝑛 种不同元素构成,任意长度为 𝑚 的连续子序列只出现一次
|
||||
</td><td><div align="center"><img src="./img/cn/07.png" alt="21" width="100%" height="100%"/></div></td></tr><tr><td>德布鲁因分析</td><td>在对灰度图像进行预处理后,为获得条纹中心点的位置,采用局部最大值算法从类似“高斯”形状的条纹灰度图像中提取图像每一行的局部最大值(以亚像素精度检测),局部最大值点即为条纹的中心点。在 𝐿𝑎𝑏 颜色空间下,对条纹中心点的颜色进行分类,在 4×1 的窗口中,即可获得条纹中心点在投影图案的对应位置。
|
||||
</td><td><div align="center"><img src="./img/cn/08.png" alt="22" width="100%" height="100%"/></div></td></tr><tr><td>小波变换分析</td><td>V 通道的变化满足给定的余弦函数,包含了条纹非中心点的相位信息。但图案经过物体的调制,原本平稳的信号发生了改变。小波变换方法作为一个非平稳信号处理方法,被引入到许多信号处理领域,包括从条纹图中提取相位。综合对比了一维和二维的窗口傅里叶变换、小波变换等方法,出于对重建精度和速度的考虑,选择一维小波变换的方法。广义 Morse 小波具有灵活的时频局部特性及严格解析性,且测量物体 3D 轮廓效果优于目前流行的用复 Morlet 小波作为母小波。</td><td><div align="center"><img src="./img/cn/09.png" alt="23" width="100%" height="100%"/></div></td></tr></table>
|
||||
|
||||
|
||||
|
||||
## [📽️](https://emojipedia.org/film-projector/) 评价指标
|
||||
|
||||
<table> <tr align="center"> <td><div align="center"><img src="./img/cn/10.gif" alt="24" width="100%" height="100%"/></div></td><td>
|
||||
<div align="center"><img src="./img/cn/11.gif" alt="25" width="100%" height="100%"/></div> </td><td> <div align="center"><img src="./img/cn/12.gif" alt="26" width="100%" height="100%"/></div> </td></tr><tr align="center"><td>半径95mm的球体<br>表面点云17W+<br>半径误差0.678mm<br>运算时间10-15s</td><td>多物体三维重建</td><td>铁轨表面三维重建</td></tr></table>
|
||||
|
||||
|
||||
|
||||
## [💻](https://emojipedia.org/laptop/) 软件展示
|
||||
|
||||
<a style="color:black" href="./Exe/Reconstructionn.exe">软件</a>集三维重建整个流程为一体,主要实现系统(相机与投影仪)标定、三维重建和点云渲染三个功能。软件以 C++ 作为开发语言并基于 QT 框架进行界面开发,依赖于 OpenCV 和 PCL (Point Cloud Library) 进行图像和点云数据处理。在开发上采用了单例模式、责任链模式等设计模式。 <a href="https://youtu.be/DM47pxDPks8"><img src="https://img.shields.io/badge/Demo- -%23FF0000?colorA=%23FF0000&colorB=%23FF0000&style=for-the-badge&logo=YouTube"/></a>
|
||||
|
||||
- 系统标定界面
|
||||
<div class="imgs" align="center" ><img src="./img/cn/13.jpg" alt="16" width="75%" height="75%" /></div>
|
||||
|
||||
- 三维重建界面
|
||||
<div class="imgs" align="center" ><img src="./img/cn/14.jpg" alt="17" width="75%" height="75%" /></div>
|
||||
|
||||
- 点云渲染界面
|
||||
<div class="imgs" align="center" ><img src="./img/cn/15.jpg" alt="18" width="75%" height="75%" /></div>
|
||||
|
||||
## [🔧](https://emojipedia.org/wrench/) 开发配置
|
||||
|
||||
<table><tr align="center" style="background-color:#D9E2F3"><td width="500px">硬件环境</td><td width="500px">版本</td></tr><tr align="center"><td>Point Grey Camera</td><td>——</td></tr><tr align="center"><td>LightCrafter4500</td><td>——</td></tr></table>
|
||||
<table><tr align="center" style="background-color:#D9E2F3"><td width="500px">软件环境</td><td width="500px">版本</td></tr><tr align="center"><td>Windows</td><td>Windows 10</td></tr><tr align="center"><td>Visual Studio</td><td>2017</td></tr><tr align="center"><td>QT</td><td>5.12.3</td></tr><tr align="center"><td>OpenCV</td><td>4.2.03</td></tr><tr align="center"><td>FlyCapture2</td><td>2.12.3.2</td></tr><tr align="center"><td>PCL</td><td>1.8.1</td></tr><tr align="center"><td>VTK</td><td>8.0</td></tr></table>
|
||||
|
||||
<div><text style="color:red">说明</text>:需配置电脑的环境变量、Visual Studio 中项目的属性(VC++ 目录-包含目录、VC++ -库目录和链接器-输入-附加依赖性)</div>
|
||||
|
||||
## 📜 开源许可
|
||||
|
||||
代码在 [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) 下可用
|
||||
|
||||
## 🔒 软件著作
|
||||
|
||||
登记软件著作权一项,登记号 2022SR0655971
|
||||
|
||||
本项目的介绍也可以访问 [这里](https://tang5618.com/wordpress/?p=598)
|
||||
|
||||
73
Reconstruction.rc
Normal file
@@ -0,0 +1,73 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource1.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "winres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// 中文(简体,中国) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
|
||||
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
|
||||
#pragma code_page(936)
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource1.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""winres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_ICON1 ICON "icon1.ico"
|
||||
|
||||
IDI_ICON2 ICON "icon1.ico"
|
||||
|
||||
#endif // 中文(简体,中国) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{3C281B59-4E57-4CE3-A978-01D36E144E94}</ProjectGuid>
|
||||
<Keyword>QtVS_v302</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||
<QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
@@ -39,8 +39,12 @@
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<IncludePath>D:\BJTU\Reconstruction\Lib\FlyCapture2\include;D:\BJTU\Reconstruction\Lib\FlyCapture2\include\C;D:\BJTU\Reconstruction\Lib\opencv\build\include;D:\BJTU\Reconstruction\Lib\opencv\build\include\opencv2;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>D:\BJTU\Reconstruction\Lib\FlyCapture2\lib64;D:\BJTU\Reconstruction\Lib\FlyCapture2\lib64\vs2015;D:\BJTU\Reconstruction\Lib\opencv\build\x64\vc15\lib;$(LibraryPath)</LibraryPath>
|
||||
<IncludePath>D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\VTK\include\vtk-8.0;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Qhull\include;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\FLANN\include;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Eigen\eigen3;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Boost\include\boost-1_64;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\include\pcl-1.8;C:\Program Files\OpenNI2\Include;D:\BJTU\Reconstruction\Lib\FlyCapture2\include;D:\BJTU\Reconstruction\Lib\FlyCapture2\include\C;D:\BJTU\Reconstruction\Lib\opencv\build\include;D:\BJTU\Reconstruction\Lib\opencv\build\include\opencv2;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Boost\lib;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\FLANN\lib;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Qhull\lib;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\VTK\lib;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\lib;C:\Program Files\OpenNI2\Lib;D:\BJTU\Reconstruction\Lib\FlyCapture2\lib64;D:\BJTU\Reconstruction\Lib\FlyCapture2\lib64\vs2015;D:\BJTU\Reconstruction\Lib\opencv\build\x64\vc15\lib;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<IncludePath>D:\BJTU\Reconstruction\Lib\opencv\build\include\opencv2;D:\BJTU\Reconstruction\Lib\opencv\build\include;D:\BJTU\Reconstruction\Lib\FlyCapture2\include;D:\BJTU\Reconstruction\Lib\FlyCapture2\include\C;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\VTK\include\vtk-8.0;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Qhull\include;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\FLANN\include;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Eigen\eigen3;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Boost\include\boost-1_64;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\include\pcl-1.8;C:\Program Files\OpenNI2\Include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\VTK\lib;D:\BJTU\Reconstruction\Lib\opencv\build\x64\vc15\lib;D:\BJTU\Reconstruction\Lib\FlyCapture2\lib64\vs2015;D:\BJTU\Reconstruction\Lib\FlyCapture2\lib64;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Boost\lib;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\FLANN\lib;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\3rdParty\Qhull\lib;D:\BJTU\Reconstruction\Lib\PCL\PCL 1.8.1\lib;C:\Program Files\OpenNI2\Lib;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')">
|
||||
<Import Project="$(QtMsBuild)\qt_defaults.props" />
|
||||
@@ -63,12 +67,14 @@
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>setupapi.lib;opencv_world420d.lib;FlyCapture2d_v140.lib;FlyCapture2GUId_v140.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>setupapi.lib;opencv_world420d.lib;FlyCapture2d_v140.lib;FlyCapture2GUId_v140.lib;pcl_common_debug.lib;pcl_features_debug.lib;pcl_filters_debug.lib;pcl_io_debug.lib;pcl_io_ply_debug.lib;pcl_kdtree_debug.lib;pcl_keypoints_debug.lib;pcl_ml_debug.lib;pcl_octree_debug.lib;pcl_outofcore_debug.lib;pcl_people_debug.lib;pcl_recognition_debug.lib;pcl_registration_debug.lib;pcl_sample_consensus_debug.lib;pcl_search_debug.lib;pcl_segmentation_debug.lib;pcl_stereo_debug.lib;pcl_surface_debug.lib;pcl_tracking_debug.lib;pcl_visualization_debug.lib;vtkalglib-8.0-gd.lib;vtkChartsCore-8.0-gd.lib;vtkCommonColor-8.0-gd.lib;vtkCommonComputationalGeometry-8.0-gd.lib;vtkCommonCore-8.0-gd.lib;vtkCommonDataModel-8.0-gd.lib;vtkCommonExecutionModel-8.0-gd.lib;vtkCommonMath-8.0-gd.lib;vtkCommonMisc-8.0-gd.lib;vtkCommonSystem-8.0-gd.lib;vtkCommonTransforms-8.0-gd.lib;vtkDICOMParser-8.0-gd.lib;vtkDomainsChemistry-8.0-gd.lib;vtkDomainsChemistryOpenGL2-8.0-gd.lib;vtkexoIIc-8.0-gd.lib;vtkexpat-8.0-gd.lib;vtkFiltersAMR-8.0-gd.lib;vtkFiltersCore-8.0-gd.lib;vtkFiltersExtraction-8.0-gd.lib;vtkFiltersFlowPaths-8.0-gd.lib;vtkFiltersGeneral-8.0-gd.lib;vtkFiltersGeneric-8.0-gd.lib;vtkFiltersGeometry-8.0-gd.lib;vtkFiltersHybrid-8.0-gd.lib;vtkFiltersHyperTree-8.0-gd.lib;vtkFiltersImaging-8.0-gd.lib;vtkFiltersModeling-8.0-gd.lib;vtkFiltersParallel-8.0-gd.lib;vtkFiltersParallelImaging-8.0-gd.lib;vtkFiltersPoints-8.0-gd.lib;vtkFiltersProgrammable-8.0-gd.lib;vtkFiltersSelection-8.0-gd.lib;vtkFiltersSMP-8.0-gd.lib;vtkFiltersSources-8.0-gd.lib;vtkFiltersStatistics-8.0-gd.lib;vtkFiltersTexture-8.0-gd.lib;vtkFiltersTopology-8.0-gd.lib;vtkFiltersVerdict-8.0-gd.lib;vtkfreetype-8.0-gd.lib;vtkGeovisCore-8.0-gd.lib;vtkgl2ps-8.0-gd.lib;vtkglew-8.0-gd.lib;vtkGUISupportQt-8.0-gd.lib;vtkGUISupportQtSQL-8.0-gd.lib;vtkhdf5-8.0-gd.lib;vtkhdf5_hl-8.0-gd.lib;vtkImagingColor-8.0-gd.lib;vtkImagingCore-8.0-gd.lib;vtkImagingFourier-8.0-gd.lib;vtkImagingGeneral-8.0-gd.lib;vtkImagingHybrid-8.0-gd.lib;vtkImagingMath-8.0-gd.lib;vtkImagingMorphological-8.0-gd.lib;vtkImagingSources-8.0-gd.lib;vtkImagingStatistics-8.0-gd.lib;vtkImagingStencil-8.0-gd.lib;vtkInfovisCore-8.0-gd.lib;vtkInfovisLayout-8.0-gd.lib;vtkInteractionImage-8.0-gd.lib;vtkInteractionStyle-8.0-gd.lib;vtkInteractionWidgets-8.0-gd.lib;vtkIOAMR-8.0-gd.lib;vtkIOCore-8.0-gd.lib;vtkIOEnSight-8.0-gd.lib;vtkIOExodus-8.0-gd.lib;vtkIOExport-8.0-gd.lib;vtkIOExportOpenGL2-8.0-gd.lib;vtkIOGeometry-8.0-gd.lib;vtkIOImage-8.0-gd.lib;vtkIOImport-8.0-gd.lib;vtkIOInfovis-8.0-gd.lib;vtkIOLegacy-8.0-gd.lib;vtkIOLSDyna-8.0-gd.lib;vtkIOMINC-8.0-gd.lib;vtkIOMovie-8.0-gd.lib;vtkIONetCDF-8.0-gd.lib;vtkIOParallel-8.0-gd.lib;vtkIOParallelXML-8.0-gd.lib;vtkIOPLY-8.0-gd.lib;vtkIOSQL-8.0-gd.lib;vtkIOTecplotTable-8.0-gd.lib;vtkIOVideo-8.0-gd.lib;vtkIOXML-8.0-gd.lib;vtkIOXMLParser-8.0-gd.lib;vtkjpeg-8.0-gd.lib;vtkjsoncpp-8.0-gd.lib;vtklibharu-8.0-gd.lib;vtklibxml2-8.0-gd.lib;vtklz4-8.0-gd.lib;vtkmetaio-8.0-gd.lib;vtkNetCDF-8.0-gd.lib;vtknetcdf_c++-gd.lib;vtkoggtheora-8.0-gd.lib;vtkParallelCore-8.0-gd.lib;vtkpng-8.0-gd.lib;vtkproj4-8.0-gd.lib;vtkRenderingAnnotation-8.0-gd.lib;vtkRenderingContext2D-8.0-gd.lib;vtkRenderingContextOpenGL2-8.0-gd.lib;vtkRenderingCore-8.0-gd.lib;vtkRenderingFreeType-8.0-gd.lib;vtkRenderingGL2PSOpenGL2-8.0-gd.lib;vtkRenderingImage-8.0-gd.lib;vtkRenderingLabel-8.0-gd.lib;vtkRenderingLOD-8.0-gd.lib;vtkRenderingOpenGL2-8.0-gd.lib;vtkRenderingQt-8.0-gd.lib;vtkRenderingVolume-8.0-gd.lib;vtkRenderingVolumeOpenGL2-8.0-gd.lib;vtksqlite-8.0-gd.lib;vtksys-8.0-gd.lib;vtktiff-8.0-gd.lib;vtkverdict-8.0-gd.lib;vtkViewsContext2D-8.0-gd.lib;vtkViewsCore-8.0-gd.lib;vtkViewsInfovis-8.0-gd.lib;vtkViewsQt-8.0-gd.lib;vtkzlib-8.0-gd.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@@ -77,29 +83,68 @@
|
||||
<DebugInformationFormat />
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<AdditionalDependencies>setupapi.lib;opencv_world420.lib;FlyCapture2_v140.lib;FlyCapture2GUI_v140.lib;qtmain.lib;shell32.lib;Qt5Widgets.lib;Qt5Gui.lib;Qt5Core.lib;pcl_common_release.lib;pcl_features_release.lib;pcl_filters_release.lib;pcl_io_ply_release.lib;pcl_io_release.lib;pcl_kdtree_release.lib;pcl_keypoints_release.lib;pcl_ml_release.lib;pcl_octree_release.lib;pcl_outofcore_release.lib;pcl_people_release.lib;pcl_recognition_release.lib;pcl_registration_release.lib;pcl_sample_consensus_release.lib;pcl_search_release.lib;pcl_segmentation_release.lib;pcl_stereo_release.lib;pcl_surface_release.lib;pcl_tracking_release.lib;pcl_visualization_release.lib;flann.lib;flann_cpp.lib;flann_cpp_s.lib;flann_s.lib;qhull_d.lib;qhullcpp_d.lib;qhullstatic_d.lib;qhullstatic_r_d.lib;qhull_p_d.lib;qhull_r_d.lib;vtkGUISupportQt-8.0.lib;vtkRenderingOpenGL2-8.0.lib;vtkglew-8.0.lib;vtkInteractionImage-8.0.lib;vtkInteractionWidgets-8.0.lib;vtkFiltersHybrid-8.0.lib;vtkFiltersModeling-8.0.lib;vtkImagingGeneral-8.0.lib;vtkImagingHybrid-8.0.lib;vtkRenderingAnnotation-8.0.lib;vtkRenderingFreeType-8.0.lib;vtkfreetype-8.0.lib;vtkRenderingVolume-8.0.lib;vtkIOXML-8.0.lib;vtkIOXMLParser-8.0.lib;vtkexpat-8.0.lib;vtkInteractionStyle-8.0.lib;vtkFiltersExtraction-8.0.lib;vtkFiltersStatistics-8.0.lib;vtkImagingFourier-8.0.lib;vtkalglib-8.0.lib;vtkImagingSources-8.0.lib;vtkIOImage-8.0.lib;vtkDICOMParser-8.0.lib;vtkmetaio-8.0.lib;vtkpng-8.0.lib;vtktiff-8.0.lib;vtkjpeg-8.0.lib;vtkImagingColor-8.0.lib;vtkImagingCore-8.0.lib;vtkRenderingCore-8.0.lib;vtkFiltersSources-8.0.lib;vtkFiltersGeneral-8.0.lib;vtkCommonComputationalGeometry-8.0.lib;vtkCommonColor-8.0.lib;vtkFiltersGeometry-8.0.lib;vtkFiltersCore-8.0.lib;vtkIOCore-8.0.lib;vtkCommonExecutionModel-8.0.lib;vtkCommonDataModel-8.0.lib;vtkCommonTransforms-8.0.lib;vtkCommonMisc-8.0.lib;vtkCommonMath-8.0.lib;vtkCommonSystem-8.0.lib;vtkCommonCore-8.0.lib;vtksys-8.0.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<QtUic Include="UI\AboutDialog.ui" />
|
||||
<QtUic Include="UI\DisplayPic.ui" />
|
||||
<QtUic Include="UI\Help.ui" />
|
||||
<QtUic Include="UI\Loading.ui" />
|
||||
<QtUic Include="UI\Reconstruction.ui" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Classes\CoreAlgorithm.cpp" />
|
||||
<ClCompile Include="Classes\AboutDialog.cpp" />
|
||||
<ClCompile Include="Classes\API.cpp" />
|
||||
<ClCompile Include="Classes\bsxfun.cpp" />
|
||||
<ClCompile Include="Classes\CalibrationData.cpp" />
|
||||
<ClCompile Include="Classes\Calibrator.cpp" />
|
||||
<ClCompile Include="Classes\Camera.cpp" />
|
||||
<ClCompile Include="Classes\CameraPointGrey.cpp" />
|
||||
<ClCompile Include="Classes\CameraArguments.cpp" />
|
||||
<ClCompile Include="Classes\CoreAlgorithm.cpp" />
|
||||
<ClCompile Include="Classes\cvtools.cpp" />
|
||||
<ClCompile Include="Classes\cwt.cpp" />
|
||||
<ClCompile Include="Classes\cwtfilterbank.cpp" />
|
||||
<ClCompile Include="Classes\cwtfreqlimits.cpp" />
|
||||
<ClCompile Include="Classes\cwt_data.cpp" />
|
||||
<ClCompile Include="Classes\cwt_emxAPI.cpp" />
|
||||
<ClCompile Include="Classes\cwt_emxutil.cpp" />
|
||||
<ClCompile Include="Classes\cwt_initialize.cpp" />
|
||||
<ClCompile Include="Classes\cwt_rtwutil.cpp" />
|
||||
<ClCompile Include="Classes\cwt_terminate.cpp" />
|
||||
<ClCompile Include="Classes\Device.cpp" />
|
||||
<ClCompile Include="Classes\DisplayPic.cpp" />
|
||||
<ClCompile Include="Classes\fft.cpp" />
|
||||
<ClCompile Include="Classes\fft1.cpp" />
|
||||
<ClCompile Include="Classes\fstools.cpp" />
|
||||
<ClCompile Include="Classes\gammaln.cpp" />
|
||||
<ClCompile Include="Classes\Help.cpp" />
|
||||
<ClCompile Include="Classes\hid.Win.c" />
|
||||
<ClCompile Include="Classes\HisThread.cpp" />
|
||||
<ClCompile Include="Classes\ifft.cpp" />
|
||||
<ClCompile Include="Classes\Loading.cpp" />
|
||||
<ClCompile Include="Classes\log2.cpp" />
|
||||
<ClCompile Include="Classes\main.cpp" />
|
||||
<ClCompile Include="Classes\MyThread.cpp" />
|
||||
<ClCompile Include="Classes\PointCloudData.cpp" />
|
||||
<ClCompile Include="Classes\ProjectorLC4500.cpp" />
|
||||
<ClCompile Include="Classes\Reconstruction.cpp" />
|
||||
<ClCompile Include="Lib\projector\LC4500API\API.cpp" />
|
||||
<ClCompile Include="Lib\projector\LC4500API\hid.Win.c" />
|
||||
<ClCompile Include="Lib\projector\LC4500API\usb.cpp" />
|
||||
<ClCompile Include="Lib\projector\ProjectorLC4500.cpp" />
|
||||
<ClCompile Include="Classes\rtGetInf.cpp" />
|
||||
<ClCompile Include="Classes\rtGetNaN.cpp" />
|
||||
<ClCompile Include="Classes\rt_nonfinite.cpp" />
|
||||
<ClCompile Include="Classes\structured_light.cpp" />
|
||||
<ClCompile Include="Classes\TreeModel.cpp" />
|
||||
<ClCompile Include="Classes\usb.cpp" />
|
||||
<ClCompile Include="Classes\wavCFandSD.cpp" />
|
||||
<ClCompile Include="Classes\YourThread.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtMoc Include="Classes\Reconstruction.h" />
|
||||
@@ -108,16 +153,62 @@
|
||||
<QtRcc Include="Resources\Reconstruction.qrc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Classes\CoreAlgorithm.h" />
|
||||
<QtMoc Include="Classes\AboutDialog.h" />
|
||||
<ClInclude Include="Classes\API.h" />
|
||||
<ClInclude Include="Classes\bsxfun.h" />
|
||||
<ClInclude Include="Classes\CalibrationData.h" />
|
||||
<ClInclude Include="Classes\Calibrator.h" />
|
||||
<ClInclude Include="Classes\Camera.h" />
|
||||
<ClInclude Include="Classes\CameraPointGrey.h" />
|
||||
<ClInclude Include="Classes\CameraArguments.h" />
|
||||
<ClInclude Include="Classes\HisThread.h" />
|
||||
<ClInclude Include="Classes\PointCloudData.h" />
|
||||
<ClInclude Include="Classes\YourThread.h" />
|
||||
<ClInclude Include="resource1.h" />
|
||||
<QtMoc Include="Classes\Loading.h" />
|
||||
<QtMoc Include="Classes\DisplayPic.h" />
|
||||
<ClInclude Include="Lib\projector\LC4500API\API.h" />
|
||||
<ClInclude Include="Lib\projector\LC4500API\Common.h" />
|
||||
<ClInclude Include="Lib\projector\LC4500API\hidapi.h" />
|
||||
<ClInclude Include="Lib\projector\LC4500API\usb.h" />
|
||||
<ClInclude Include="Lib\projector\Projector.h" />
|
||||
<ClInclude Include="Lib\projector\ProjectorLC4500.h" />
|
||||
<ClInclude Include="Classes\Common.h" />
|
||||
<ClInclude Include="Classes\CoreAlgorithm.h" />
|
||||
<ClInclude Include="Classes\cvtools.h" />
|
||||
<ClInclude Include="Classes\cwt.h" />
|
||||
<ClInclude Include="Classes\cwtfilterbank.h" />
|
||||
<ClInclude Include="Classes\cwtfreqlimits.h" />
|
||||
<ClInclude Include="Classes\cwt_data.h" />
|
||||
<ClInclude Include="Classes\cwt_emxAPI.h" />
|
||||
<ClInclude Include="Classes\cwt_emxutil.h" />
|
||||
<ClInclude Include="Classes\cwt_initialize.h" />
|
||||
<ClInclude Include="Classes\cwt_rtwutil.h" />
|
||||
<ClInclude Include="Classes\cwt_terminate.h" />
|
||||
<ClInclude Include="Classes\cwt_types.h" />
|
||||
<ClInclude Include="Classes\Device.h" />
|
||||
<ClInclude Include="Classes\fft.h" />
|
||||
<ClInclude Include="Classes\fft1.h" />
|
||||
<ClInclude Include="Classes\fstools.h" />
|
||||
<ClInclude Include="Classes\gammaln.h" />
|
||||
<QtMoc Include="Classes\Help.h" />
|
||||
<ClInclude Include="Classes\hidapi.h" />
|
||||
<ClInclude Include="Classes\ifft.h" />
|
||||
<ClInclude Include="Classes\log2.h" />
|
||||
<ClInclude Include="Classes\MyThread.h" />
|
||||
<ClInclude Include="Classes\Projector.h" />
|
||||
<ClInclude Include="Classes\ProjectorLC4500.h" />
|
||||
<ClInclude Include="Classes\rtGetInf.h" />
|
||||
<ClInclude Include="Classes\rtGetNaN.h" />
|
||||
<ClInclude Include="Classes\rtwtypes.h" />
|
||||
<ClInclude Include="Classes\rt_defines.h" />
|
||||
<ClInclude Include="Classes\rt_nonfinite.h" />
|
||||
<ClInclude Include="Classes\structured_light.h" />
|
||||
<ClInclude Include="Classes\tmwtypes.h" />
|
||||
<ClInclude Include="Classes\TreeModel.h" />
|
||||
<ClInclude Include="Classes\usb.h" />
|
||||
<ClInclude Include="Classes\wavCFandSD.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Reconstruction.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="icon1.ico" />
|
||||
<Image Include="Resources\image\common\icon.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
|
||||
|
||||
@@ -17,12 +17,6 @@
|
||||
<Filter Include="lib">
|
||||
<UniqueIdentifier>{bfb1e724-306d-436f-9c4b-61bcfde16fb2}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="lib\projector">
|
||||
<UniqueIdentifier>{0a72a89e-fc22-42c6-9293-1cf2d411e663}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="lib\projector\LC4500API">
|
||||
<UniqueIdentifier>{b0d62f9b-d43c-4971-9e7c-a0cc53e4140f}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\scene">
|
||||
<UniqueIdentifier>{2ae873f3-9729-42ac-8918-28ee9ea3c253}</UniqueIdentifier>
|
||||
</Filter>
|
||||
@@ -50,6 +44,29 @@
|
||||
<Filter Include="resource\font">
|
||||
<UniqueIdentifier>{ec183521-b5e0-408b-9e24-aa9910874ed3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\reconstruction\cwt">
|
||||
<UniqueIdentifier>{67a013bf-9fd9-4fa2-a2a7-e8d6817bcc7a}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\reconstruction\tool">
|
||||
<UniqueIdentifier>{defd3eaf-903c-49c5-a2d6-2edbeb2f02b3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\reconstruction\calibrator">
|
||||
<UniqueIdentifier>{3a7d9bd9-24e9-4558-9564-4ef98bd12ea3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\reconstruction\camera">
|
||||
<UniqueIdentifier>{288ad6dd-dd7c-43f3-abd5-8998c2a01d04}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\reconstruction\projector">
|
||||
<UniqueIdentifier>{762af5a3-10df-4dc7-8ce8-ed2501d9eb12}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="src\reconstruction\pointcloud">
|
||||
<UniqueIdentifier>{cdf9f84f-4a3a-4fc8-b596-038eb3990675}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
<ParseFiles>true</ParseFiles>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtUic Include="UI\Reconstruction.ui">
|
||||
@@ -61,6 +78,12 @@
|
||||
<QtUic Include="UI\Loading.ui">
|
||||
<Filter>ui</Filter>
|
||||
</QtUic>
|
||||
<QtUic Include="UI\Help.ui">
|
||||
<Filter>ui</Filter>
|
||||
</QtUic>
|
||||
<QtUic Include="UI\AboutDialog.ui">
|
||||
<Filter>ui</Filter>
|
||||
</QtUic>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Classes\main.cpp">
|
||||
@@ -69,30 +92,132 @@
|
||||
<ClCompile Include="Classes\Reconstruction.cpp">
|
||||
<Filter>src</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Lib\projector\LC4500API\API.cpp">
|
||||
<Filter>lib\projector\LC4500API</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Lib\projector\LC4500API\hid.Win.c">
|
||||
<Filter>lib\projector\LC4500API</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Lib\projector\LC4500API\usb.cpp">
|
||||
<Filter>lib\projector\LC4500API</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Lib\projector\ProjectorLC4500.cpp">
|
||||
<Filter>lib\projector</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\CameraArguments.cpp">
|
||||
<Filter>src\reconstruction</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\Loading.cpp">
|
||||
<Filter>src\scene\loadingscene</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\DisplayPic.cpp">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwt_emxAPI.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwt_emxutil.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\ifft.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\fft1.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\fft.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\bsxfun.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\gammaln.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\wavCFandSD.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwtfreqlimits.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\log2.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwtfilterbank.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwt.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwt_terminate.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwt_initialize.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwt_data.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cwt_rtwutil.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\rtGetInf.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\rtGetNaN.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\rt_nonfinite.cpp">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\CalibrationData.cpp">
|
||||
<Filter>src\reconstruction\calibrator</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\cvtools.cpp">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\Camera.cpp">
|
||||
<Filter>src\reconstruction\camera</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\CameraPointGrey.cpp">
|
||||
<Filter>src\reconstruction\camera</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\Calibrator.cpp">
|
||||
<Filter>src\reconstruction\calibrator</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\structured_light.cpp">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\ProjectorLC4500.cpp">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\API.cpp">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\usb.cpp">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\CoreAlgorithm.cpp">
|
||||
<Filter>src\reconstruction</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\Help.cpp">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\Device.cpp">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\TreeModel.cpp">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\fstools.cpp">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\hid.Win.c">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\YourThread.cpp">
|
||||
<Filter>src\scene\mainscene</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\CameraArguments.cpp">
|
||||
<Filter>src\reconstruction\calibrator</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\PointCloudData.cpp">
|
||||
<Filter>src\reconstruction\pointcloud</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\MyThread.cpp">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\HisThread.cpp">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Classes\AboutDialog.cpp">
|
||||
<Filter>src\scene\common</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtMoc Include="Classes\Reconstruction.h">
|
||||
@@ -104,6 +229,12 @@
|
||||
<QtMoc Include="Classes\DisplayPic.h">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Classes\Help.h">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</QtMoc>
|
||||
<QtMoc Include="Classes\AboutDialog.h">
|
||||
<Filter>src\scene\common</Filter>
|
||||
</QtMoc>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtRcc Include="Resources\Reconstruction.qrc">
|
||||
@@ -111,29 +242,147 @@
|
||||
</QtRcc>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Lib\projector\LC4500API\API.h">
|
||||
<Filter>lib\projector\LC4500API</Filter>
|
||||
<ClInclude Include="Classes\cwt_emxAPI.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\projector\LC4500API\Common.h">
|
||||
<Filter>lib\projector\LC4500API</Filter>
|
||||
<ClInclude Include="Classes\cwt_emxutil.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\projector\LC4500API\hidapi.h">
|
||||
<Filter>lib\projector\LC4500API</Filter>
|
||||
<ClInclude Include="Classes\ifft.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\projector\LC4500API\usb.h">
|
||||
<Filter>lib\projector\LC4500API</Filter>
|
||||
<ClInclude Include="Classes\fft1.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\projector\Projector.h">
|
||||
<Filter>lib\projector</Filter>
|
||||
<ClInclude Include="Classes\fft.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Lib\projector\ProjectorLC4500.h">
|
||||
<Filter>lib\projector</Filter>
|
||||
<ClInclude Include="Classes\bsxfun.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\CameraArguments.h">
|
||||
<Filter>src\reconstruction</Filter>
|
||||
<ClInclude Include="Classes\gammaln.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\wavCFandSD.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwtfreqlimits.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\log2.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwtfilterbank.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwt.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwt_terminate.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwt_initialize.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwt_data.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwt_types.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cwt_rtwutil.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\rt_defines.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\rtGetInf.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\rtGetNaN.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\rt_nonfinite.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\rtwtypes.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\tmwtypes.h">
|
||||
<Filter>src\reconstruction\cwt</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\MyThread.h">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\CalibrationData.h">
|
||||
<Filter>src\reconstruction\calibrator</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\cvtools.h">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\Camera.h">
|
||||
<Filter>src\reconstruction\camera</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\CameraPointGrey.h">
|
||||
<Filter>src\reconstruction\camera</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\Calibrator.h">
|
||||
<Filter>src\reconstruction\calibrator</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\structured_light.h">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\Projector.h">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\ProjectorLC4500.h">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\API.h">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\Common.h">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\hidapi.h">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\usb.h">
|
||||
<Filter>src\reconstruction\projector</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\CoreAlgorithm.h">
|
||||
<Filter>src\reconstruction</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\Device.h">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\TreeModel.h">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\fstools.h">
|
||||
<Filter>src\reconstruction\tool</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\YourThread.h">
|
||||
<Filter>src\scene\mainscene</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\CameraArguments.h">
|
||||
<Filter>src\reconstruction\calibrator</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\PointCloudData.h">
|
||||
<Filter>src\reconstruction\pointcloud</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Classes\HisThread.h">
|
||||
<Filter>src\scene\resultscene</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="resource1.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Reconstruction.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="icon1.ico" />
|
||||
<Image Include="Resources\image\common\icon.ico" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -2,6 +2,7 @@
|
||||
<qresource prefix="/Reconstruction">
|
||||
<file>image/loading/loading.png</file>
|
||||
<file>image/reconstruction/help.png</file>
|
||||
<file>image/common/logo.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/icon">
|
||||
<file>image/common/3D.png</file>
|
||||
@@ -21,6 +22,14 @@
|
||||
<file>image/loading/label.png</file>
|
||||
<file>image/loading/press.png</file>
|
||||
<file>image/reconstruction/loading.png</file>
|
||||
<file>image/reconstruction/surface.png</file>
|
||||
<file>image/reconstruction/help2.png</file>
|
||||
<file>image/projection/image.png</file>
|
||||
<file>image/projection/projector.png</file>
|
||||
<file>image/projection/save.png</file>
|
||||
<file>image/projection/three_d.png</file>
|
||||
<file>icon1.ico</file>
|
||||
<file>image/common/icon.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/qss">
|
||||
<file>qss/flat.qss</file>
|
||||
|
||||
BIN
Resources/icon1.ico
Normal file
|
After Width: | Height: | Size: 17 KiB |