Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



Розробка методів І засобів текстурування для покращення

Розробка методів І засобів текстурування для покращення




Сторінка9/9
Дата конвертації09.04.2017
Розмір0.84 Mb.
1   2   3   4   5   6   7   8   9

ДОДАТОК А


ТЕХНІЧНЕ ЗАВДАННЯ

Технічне завдання на магістерську кваліфікаційну роботу

Міністерство освіти і науки України

Вінницький національний технічний університет

Факультет інформаційних технологій та комп’ютерної інженерії
ЗАТВЕРДЖУЮ

д.т.н.

Кваліфіка́ція (від англ. Quality - якість) - це: наявність підготовки, професійних знань, навичок та досвіду, які дають можливість особі належним чином проводити певні дії; рівень підготовленості, майстерності, ступінь готовності до виконання праці за визначеною спеціальністю чи посадою, що визначається розрядом, класом чи іншими атестаційними категоріями.

, проф. А. М. Пєтух

"____ "________201_ р.

Технічне завдання

на магістерську кваліфікаційну роботу за спеціальністю

8.05010301 – Програмне забезпечення систем


Керівник магістерської кваліфікаційної роботи:

д.т.н., проф. О. Н. Романюк

"____"_________________201__ р.

Виконaв: студент гр.1ПЗ-14м О.О. Дудник

"____"_________________201__ р.

Вінниця ВНТУ 2015
1. Галузь застосування – реалістична комп’ютерна графіка.
2. Підстава для розробки.

Підставою для розробки даної магістерської кваліфікаційної роботи є рішення засідання кафедри програмного забезпечення (протокол №___ від «___»_____________ 20__ року).


3. Мета та призначення розробки.

Мета роботи – Метою роботи є підвищення реалістичності відтворення графічних об’єктів за рахунок розробки нових методів та моделей. Призначення розробки: програмні та апаратні засоби текстурування у системах комп’ютерної графіки.


4. Джерела розробки:

– завдання на магістерську кваліфікаційну роботу;

– ДСТУ 2939-94 Системи оброблення інформації. Комп'ютерна графіка. 
5. Технічні вимоги: базові моделі освітлення – графічний режим – truecolor, розмір дискретного координатного простору 4096х4096, мова програмування - С , вектори нормалі, вихідні текстури.
6. Кліматичні умови.

Температурний діапазон 5ºС 40ºС, відносна вологість повітря не більше 75% та тиск – 720-740мм.

Обробка інформації́ - вся сукупність операцій (збирання, введення, записування, перетворення, зчитування, зберігання, знищення, реєстрація), що здійснюються за допомогою технічних і програмних засобів, включаючи обмін по каналах передачі даних [6.

Вологість повітря - вміст водяної пари в повітрі, характеризується пружністю водяної пари, відносною вологістю, дефіцитом вологи, точкою роси, - є одним з найважливіших параметрів атмосфери, що визначає погоду, а також те, наскільки комфортно почуває себе людина в цей момент часу.

рт.ст.


7. Конструктивні вимоги.

При розробці апаратних засобів дотримуватися конструктивів ПЕОМ.

Графічна та текстова документація повинна відповідати всім діючим стандартам України.

Документа́ція - сукупність офіційно визнаних, взаємопов'язаних та складених у визначеній формі документів, які містять передбачувану інформацію про виріб, процес або діяльність даного підприємства. Відповідно до області застосування Документа́цій поділяється на бухгалтерську, конструкторську, нормативну, технічну, товарну, тощо.

8. Стадії та етапи розробки:



з/п


Назва етапів магістерської кваліфікаційної роботи

Строк виконання етапів роботи

1

Аналіз методів текстурування

01.10–6.10

2

Розробка методів перспективно-коректного текстурування

07.10–13.10

3

Розробка методів підвищення якості текстурування

14.10–17.10

4

Розробка апаратних засобів та программного забезпечення

17.10–27.10

5

Вирішення питань економіки

28.10–07.11

9. Порядок контролю та прийняття.

Виконання етапів графічної та розрахункової документації магістерської кваліфікаційної роботи контролюється керівником згідно з графіком виконання проекту.

Прийняття магістерської кваліфікаційної роботи здійснюється ДЕК, затвердженою зав. кафедрою згідно з графіком захисту.

Корегування технічного завдання допускається з дозволу керівника магістерської кваліфікаційної роботи


ДОДАТОК Б

ЛІСТИНГ ВИХІДНОГО КОДУ ПРОГРАМНОГО ДОДАТКУ

#include


using namespace pcl;

Керівни́к, також мéнеджер - найманий робітник, зайнятий професійною організаторською діяльністю в органах керування підприємства, фірми, установи, наділений суб'єктом власності визначеними повноваженнями.

Техні́чне завдання́ (ТЗ) (англ. scope statements та англ. statement of work; SOW) - документ, що встановлює основне призначення, показники якості, техніко- економічні та спеціальні вимоги до виробу, обсягу, стадії розроблення та складу конструкторської документації.

using namespace std;

namespace fs = boost::filesystem;

TextureMapper::TextureMapper(ros::NodeHandle nh, ros::NodeHandle nhp)

{

string cloud_filename, work_dir;



nhp.param("cloud_filename", cloud_filename, string(""));

nhp.param("work_dir", work_dir, string(""));

nhp.param("focal_length", focal_length_, 0.0);

nhp.param("image_height", image_height_, 768);

nhp.param("image_width", image_width_, 1024);

process(cloud_filename, work_dir);

std::cout << "Finished!" << std::endl;

}

PointCloudRGB::Ptr TextureMapper::filterCloud(PointCloudRGB::Ptr in_cloud, float voxel_size)



{

// Remove nans

vector indices;

PointCloudRGB::Ptr cloud(new PointCloudRGB);

removeNaNFromPointCloud(*in_cloud, *cloud, indices);

indices.clear();


return cloud;

}
void TextureMapper::greedyTriangulation(PointCloudRGB::Ptr cloud,

PolygonMesh& triangles)

{

// Convert pointcloud to XYZ



PointCloudXYZ::Ptr cloud_xyz(new PointCloudXYZ);

cloud_xyz->points.resize(cloud->size());

for (size_t i = 0; i < cloud_xyz->points.size(); i ) {

cloud_xyz->points[i].x = cloud->points[i].x;

cloud_xyz->points[i].y = cloud->points[i].y;

cloud_xyz->points[i].z = cloud->points[i].z;

}
// Normal estimation*

NormalEstimation


n;

PointCloud::Ptr normals(new PointCloud);

search::KdTree
::Ptr tree(new search::KdTree
);

tree->setInputCloud(cloud_xyz);

n.setInputCloud(cloud_xyz);

n.setSearchMethod(tree);

n.setKSearch(20);

n.compute(*normals);

//* normals should not contain the point normals surface curvatures
// Concatenate the XYZ and normal fields*

PointCloud


::Ptr cloud_with_normals(new PointCloud
);

concatenateFields(*cloud_xyz, *normals, *cloud_with_normals);

//* cloud_with_normals = cloud normals
// Create search tree*

search::KdTree


::Ptr tree2(new search::KdTree
);

tree2->setInputCloud(cloud_with_normals);


// Initialize objects

GreedyProjectionTriangulation


gp3;
// Set the maximum distance between connected points(maximum edge length)

gp3.setSearchRadius(0.05);


// Set typical values for the parameters

gp3.setMu(100.0); // 2.5

gp3.setMaximumNearestNeighbors(300); // 100

gp3.setMaximumSurfaceAngle(M_PI/4); // 45 degrees

gp3.setMinimumAngle(M_PI/18); // 10 degrees

gp3.setMaximumAngle(2*M_PI/3); // 120 degrees

gp3.setNormalConsistency(true);
// Get result

gp3.setInputCloud(cloud_with_normals);

gp3.setSearchMethod(tree2);

gp3.reconstruct(triangles);


// Additional vertex information

vector parts = gp3.getPartIDs();

vector states = gp3.getPointStates();

}
void TextureMapper::transformTFToEigen(const tf::Transform &t, Eigen::Affine3f &e)

{

for(int i=0; i<3; i )



{

e.matrix()(i,3) = t.getOrigin()[i];

for(int j=0; j<3; j )

{

e.matrix()(i,j) = t.getBasis()[i][j];



}

}

// Fill in identity in last row



for (int col = 0 ; col < 3; col )

e.matrix()(3, col) = 0;

e.matrix()(3,3) = 1;

}
/** \brief Save a textureMesh object to obj file */

int TextureMapper::saveOBJFile (const string &file_name,

const TextureMesh &tex_mesh, unsigned precision)

{

if (tex_mesh.cloud.data.empty ())



{

PCL_ERROR ("[io::saveOBJFile] Input point cloud has no data!\n");

return (-1);

}
// Open file

ofstream fs;

fs.precision (precision);

fs.open (file_name.c_str ());
// Define material file

string mtl_file_name = file_name.substr (0, file_name.find_last_of (".")) ".mtl";

// Strip path for "mtllib" command

string mtl_file_name_nopath = mtl_file_name;

mtl_file_name_nopath.erase (0, mtl_file_name.find_last_of ('/') 1);
/* Write 3D information */

// number of points

int nr_points = tex_mesh.cloud.width * tex_mesh.cloud.height;

int point_size = tex_mesh.cloud.data.size () / nr_points;


// mesh size

int nr_meshes = tex_mesh.tex_polygons.size ();

// number of faces for header

int nr_faces = 0;

for (int m = 0; m < nr_meshes; m)

nr_faces = tex_mesh.tex_polygons[m].size ();


// Write the header information

fs << "####" << endl;

fs << "# OBJ dataFile simple version. File name: " << file_name << endl;

fs << "# Vertices: " << nr_points << endl;

fs << "# Faces: " <

fs << "# Material information:" << endl;

fs << "mtllib " << mtl_file_name_nopath << endl;

fs << "####" << endl;


// Write vertex coordinates

fs << "# Vertices" << endl;

for (int i = 0; i < nr_points; i)

{

int xyz = 0;



// "v" just be written one

bool v_written = false;

for (size_t d = 0; d < tex_mesh.cloud.fields.size (); d)

{

int count = tex_mesh.cloud.fields[d].count;



if (count == 0)

count = 1; // we simply cannot tolerate 0 counts (coming from older converter code)

int c = 0;

// adding vertex

if ((tex_mesh.cloud.fields[d].datatype == PCLPointField::FLOAT32) && (

tex_mesh.cloud.fields[d].name == "x" ||

tex_mesh.cloud.fields[d].name == "y" ||

tex_mesh.cloud.fields[d].name == "z"))

{

if (!v_written)



{

// write vertices beginning with v

fs << "v ";

v_written = true;

}

float value;



memcpy (&value, &tex_mesh.cloud.data[i * point_size tex_mesh.cloud.fields[d].offset c * sizeof (float)], sizeof (float));

fs << value;

if ( xyz == 3)

break;


fs << " ";

}

}



if (xyz != 3)

{

PCL_ERROR ("[io::saveOBJFile] Input point cloud has no XYZ data!\n");



return (-2);

}

fs << endl;



}

fs << "# "<< nr_points <<" vertices" << endl

// Write vertex normals

for (int i = 0; i < nr_points; i)

{

int xyz = 0;



// "vn" just be written one

bool v_written = false;

for (size_t d = 0; d < tex_mesh.cloud.fields.size (); d)

{

int count = tex_mesh.cloud.fields[d].count;



if (count == 0)

count = 1; // we simply cannot tolerate 0 counts (coming from older converter code)

int c = 0;

// adding vertex

if ((tex_mesh.cloud.fields[d].datatype == PCLPointField::FLOAT32) && (

tex_mesh.cloud.fields[d].name == "normal_x" ||

tex_mesh.cloud.fields[d].name == "normal_y" ||

tex_mesh.cloud.fields[d].name == "normal_z"))

{

if (!v_written)



{

// write vertices beginning with vn

fs << "vn ";

v_written = true;

}

float value;



memcpy (&value, &tex_mesh.cloud.data[i * point_size tex_mesh.cloud.fields[d].offset c * sizeof (float)], sizeof (float));

fs << value;

if ( xyz == 3)

break;


fs << " ";

}

}



if (xyz != 3)

{

PCL_ERROR ("[io::saveOBJFile] Input point cloud has no normals!\n");



return (-2);

}

fs << endl;



}

// Write vertex texture with "vt" (adding latter)


for (int m = 0; m < nr_meshes; m)

{

if(tex_mesh.tex_coordinates.size() == 0)



continue;
PCL_INFO ("%lu vertex textures in submesh %d\n", tex_mesh.tex_coordinates[m].size (), m);

fs << "# " << tex_mesh.tex_coordinates[m].size() << " vertex textures in submesh " << m << endl;

for (size_t i = 0; i < tex_mesh.tex_coordinates[m].size (); i)

{

fs << "vt ";



fs << tex_mesh.tex_coordinates[m][i][0] << " " << tex_mesh.tex_coordinates[m][i][1] << endl;

}

}


int f_idx = 0;
// int idx_vt =0;

PCL_INFO ("Writting faces...\n");

for (int m = 0; m < nr_meshes; m)

{

if (m > 0)



f_idx = tex_mesh.tex_polygons[m-1].size ();
if(tex_mesh.tex_materials.size() !=0)

{

fs << "# The material will be used for mesh " << m << endl;



//TODO pbl here with multi texture and unseen faces

fs << "usemtl " << tex_mesh.tex_materials[m].tex_name << endl;

fs << "# Faces" << endl;

}

for (size_t i = 0; i < tex_mesh.tex_polygons[m].size(); i)



{

// Write faces with "f"

fs << "f";

size_t j = 0;

// There's one UV per vertex per face, i.e., the same vertex can have

// different UV depending on the face.

for (j = 0; j < tex_mesh.tex_polygons[m][i].vertices.size (); j)

{

unsigned int idx = tex_mesh.tex_polygons[m][i].vertices[j] 1;



fs << " " << idx

<< "/" << 3*(i f_idx) j 1

<< "/" << idx; // vertex index in obj file format starting with 1

}

fs << endl;



}

p3=pcl::transformPoint (p3, cam.pose);

p4=pcl::transformPoint (p4, cam.pose);

p5=pcl::transformPoint (p5, cam.pose);

std::stringstream ss;

ss << "Cam #" << i 1;

visu.addText3D(ss.str (), p1, 0.1, 1.0, 1.0, 1.0, ss.str ());

}
// add a coordinate system

visu.addCoordinateSystem (0.25);
// add the mesh's cloud (colored on Z axis)

pcl::visualization::PointCloudColorHandlerGenericField


color_handler (cloud, "z");

visu.addPointCloud (cloud, color_handler, "cloud");


// reset camera

visu.resetCamera ();


// wait for user input

visu.spin ();

}

void TextureMapper::process(string cloud_filename, string work_dir)



{

ROS_INFO("\nLoading cloud from file %s...\n", cloud_filename.c_str());

PointCloudRGB::Ptr cloud(new PointCloud
);

PCDReader reader;

reader.read (cloud_filename, *cloud);

ROS_INFO("\tInput cloud contains %lu vertices\n", cloud->points.size());

ROS_INFO("\nLoading poses from file %sgraph_vertices.txt ...\n", work_dir.c_str());

vector< pair > img_poses;

tf::Transform img_pose;

std::string image_name("/home/miquel/Dropbox/UIB/workspace/indigo/src/stereo_slam/keyframes/00000.jpg");

readPoses(work_dir, 0, img_pose);

img_poses.push_back(std::make_pair(image_name, img_pose));

ROS_INFO("\tLoaded %lu poses\n", img_poses.size());
ROS_INFO("\nFiltering cloud...\n");

PointCloudRGB::Ptr cloud_filtered;

cloud_filtered = filterCloud(cloud, 0.02f);

ROS_INFO("\tFiltered cloud contains %lu vertices\n",

cloud_filtered->points.size());
ROS_INFO("\nTriangulating cloud...\n");

PolygonMesh triangles;

greedyTriangulation(cloud_filtered, triangles);

ROS_INFO("\tMesh contains %lu faces and %lu vertices\n",

triangles.polygons.size(),

cloud_filtered->points.size());


ROS_INFO("\nTexturing mesh...\n");

TextureMesh mesh;

PointCloudXYZ::Ptr cloud_filtered_xyz(new PointCloudXYZ);

copyPointCloud(*cloud_filtered, *cloud_filtered_xyz);

mapTexture(cloud_filtered_xyz, triangles, img_poses, mesh);

}

ДОДАТОК В



ІЛЮСТРАТИВНИЙ МАТЕРІАЛ ДО ЗАХИСТУ МАГІСТЕРСЬКОЇ КВАЛІФІКАЦІЙНОЇ РОБОТИ


Завідувач кафедри ПЗ, д.т.н., професор _____________ А. М. Пєтух

Науковий керівник, д.т.н., професор ________________ О. Н. Романюк

Рецензент д.т.н., професор _________________ О. М. Роїк




Виконавець, студент групи 1ПЗ-14м __________________ О. О. Дудник
1   2   3   4   5   6   7   8   9



  • ДОДАТОК Б
  • ДОДАТОК В