Skip to content

Commit

Permalink
Merge pull request OpenDroneMap#122 from smathermather/gh-pages
Browse files Browse the repository at this point in the history
Texture using best available camera
  • Loading branch information
Stephen Mather committed Jun 29, 2015
2 parents 636f843 + 04e9694 commit 5b85628
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 214 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Expand Up @@ -4,7 +4,8 @@ include/
lib/
logs/
src/

odm_texturing-build/
*.user
cmvs.tar.gz
parallel.tar.bz2
pcl.tar.gz
203 changes: 0 additions & 203 deletions odm_texturing/CMakeLists.txt.user

This file was deleted.

60 changes: 50 additions & 10 deletions odm_texturing/src/OdmTexturing.cpp
Expand Up @@ -397,6 +397,11 @@ void OdmTexturing::triangleToImageAssignment()
// Vector containing information if the face has been given an optimal camera or not
std::vector<bool> hasOptimalCamera = std::vector<bool>(mesh_->tex_polygons[0].size());

//Vector containing minimal distances to optimal camera
std::vector<double> tTIA_distances(mesh_->tex_polygons[0].size(),DBL_MAX);
//Vector containing minimal angles of face to cameraplane normals
std::vector<double> tTIA_angles(mesh_->tex_polygons[0].size(),DBL_MAX);

// Set default value that no face has an optimal camera
for (size_t faceIndex = 0; faceIndex < hasOptimalCamera.size(); ++faceIndex)
{
Expand Down Expand Up @@ -484,7 +489,8 @@ void OdmTexturing::triangleToImageAssignment()


}

std::vector<double> local_tTIA_distances(mesh_->tex_polygons[0].size(),DBL_MAX);
std::vector<double> local_tTIA_angles(mesh_->tex_polygons[0].size(),DBL_MAX);
// If any faces are visible in the current camera perform occlusion culling
if (countInsideFrustum > 0)
{
Expand Down Expand Up @@ -518,16 +524,45 @@ void OdmTexturing::triangleToImageAssignment()
// Perform radius search in the acceleration structure
int radiusSearch = kdTree.radiusSearch(center, radius, neighbors, neighborsSquaredDistance);

// Extract distances for all vertices for face to camera
double d0 = cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[0]].z;
double d1 = cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[1]].z;
double d2 = cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[2]].z;

// Calculate largest distance and store in distance variable
double distance = std::max(d0, std::max(d1,d2));

//Get points
pcl::PointXYZ p0=cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[0]];
pcl::PointXYZ p1=cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[1]];
pcl::PointXYZ p2=cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[2]];
//Calculate face normal

pcl::PointXYZ diff0;
pcl::PointXYZ diff1;
diff0.x=p1.x-p0.x;
diff0.y=p1.y-p0.y;
diff0.z=p1.z-p0.z;
diff1.x=p2.x-p0.x;
diff1.y=p2.y-p0.y;
diff1.z=p2.z-p0.z;
pcl::PointXYZ normal;
normal.x=diff0.y*diff1.z-diff0.z*diff1.y;
normal.y=-(diff0.x*diff1.z-diff0.z*diff1.x);
normal.z=diff0.x*diff1.y-diff0.y*diff1.x;
double norm=sqrt(normal.x*normal.x+normal.y*normal.y+normal.z*normal.z);
//Angle of face to camera
double cos=-normal.z/norm;

//Save distance of faceIndex to current camera
local_tTIA_distances[faceIndex]=distance;

//Save angle of faceIndex to current camera
local_tTIA_angles[faceIndex]=sqrt(1.0-cos*cos);
// If other projections are found inside the radius
if (radiusSearch > 0)
{
// Extract distances for all vertices for face to camera
double d0 = cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[0]].z;
double d1 = cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[1]].z;
double d2 = cameraCloud->points[mesh_->tex_polygons[0][faceIndex].vertices[2]].z;

// Calculate largest distance and store in distance variable
double distance = std::max(d0, std::max(d1,d2));

// Compare distance to all neighbors inside radius
for (size_t i = 0; i < neighbors.size(); ++i)
Expand Down Expand Up @@ -559,9 +594,14 @@ void OdmTexturing::triangleToImageAssignment()
{
if (visibility[faceIndex])
{
hasOptimalCamera[faceIndex] = true;
tTIA_[faceIndex] = cameraIndex;
++count;
if(local_tTIA_distances[faceIndex]<tTIA_distances[faceIndex]&&local_tTIA_angles[faceIndex]<tTIA_angles[faceIndex])
{
tTIA_angles[faceIndex]=local_tTIA_angles[faceIndex];
tTIA_distances[faceIndex]=local_tTIA_distances[faceIndex];
hasOptimalCamera[faceIndex] = true;
tTIA_[faceIndex] = cameraIndex;
++count;
}
}
}

Expand Down

0 comments on commit 5b85628

Please sign in to comment.