源码编译安装Open3D并解决与ROS冲突问题,最后使用一个实例进行测试
下载源码:
https://github.com/IntelVCL/Open3D.git
编译安装
util/scripts/install-deps-ubuntu.sh #会与ros冲突,会卸载掉ros,不过编译安装好后再重装ros即可
mkdir build
cd build
cmake ..
make
sudo make install
重装ros
sudo apt-get install ros-kinetic-desktop-full
源码编译安装libpng16,因为重装ros之后会自动卸载掉install-deps-ubuntu.sh安装的libpng16,而libpng16又是编译open3d的C++项目时的必备第三方库,所需要手动源码编译安装.
tar -zxvf libpng-1.6.35.tar.xz
cd libpng-1.6.35
mkdir build
cd build
cmake ..
make
sudo make install
测试用例
open3d_01.cpp
#include <iostream>
#include <memory>
#include <thread>
#include <Core/Core.h>
#include <IO/IO.h>
#include <Visualization/Visualization.h>
int main(int argc, char *argv[])
{
using namespace open3d;
SetVerbosityLevel(VerbosityLevel::VerboseAlways);
if (argc < 3) {
PrintInfo("Open3D %s\n", OPEN3D_VERSION);
PrintInfo("\n");
PrintInfo("Usage:\n");
PrintInfo(" > TestVisualizer [mesh|spin|slowspin|pointcloud|rainbow|image|depth|editing] [filename]\n");
PrintInfo(" > TestVisualizer [animation] [filename] [trajectoryfile]\n");
return 0;
}
std::string option(argv[1]);
if (option == "mesh") {
auto mesh_ptr = std::make_shared<TriangleMesh>();
if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
PrintWarning("Successfully read %s\n", argv[2]);
} else {
PrintError("Failed to read %s\n\n", argv[2]);
return 0;
}
mesh_ptr->ComputeVertexNormals();
DrawGeometries({mesh_ptr}, "Mesh", 1600, 900);
} else if (option == "spin") {
auto mesh_ptr = std::make_shared<TriangleMesh>();
if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
PrintWarning("Successfully read %s\n", argv[2]);
} else {
PrintError("Failed to read %s\n\n", argv[2]);
return 0;
}
mesh_ptr->ComputeVertexNormals();
DrawGeometriesWithAnimationCallback({mesh_ptr},
[&](Visualizer *vis) {
vis->GetViewControl().Rotate(10, 0);
std::this_thread::sleep_for(std::chrono::milliseconds(30));
return false;
}, "Spin", 1600, 900);
} else if (option == "slowspin") {
auto mesh_ptr = std::make_shared<TriangleMesh>();
if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
PrintWarning("Successfully read %s\n", argv[2]);
} else {
PrintError("Failed to read %s\n\n", argv[2]);
return 0;
}
mesh_ptr->ComputeVertexNormals();
DrawGeometriesWithKeyCallbacks({mesh_ptr},
{{GLFW_KEY_SPACE, [&](Visualizer *vis) {
vis->GetViewControl().Rotate(10, 0);
std::this_thread::sleep_for(std::chrono::milliseconds(30));
return false;
}}}, "Press Space key to spin", 1600, 900);
} else if (option == "pointcloud") {
auto cloud_ptr = std::make_shared<PointCloud>();
if (ReadPointCloud(argv[2], *cloud_ptr)) {
PrintWarning("Successfully read %s\n", argv[2]);
} else {
PrintError("Failed to read %s\n\n", argv[2]);
return 0;
}
cloud_ptr->NormalizeNormals();
DrawGeometries({cloud_ptr}, "PointCloud", 1600, 900);
} else if (option == "rainbow") {
auto cloud_ptr = std::make_shared<PointCloud>();
if (ReadPointCloud(argv[2], *cloud_ptr)) {
PrintWarning("Successfully read %s\n", argv[2]);
} else {
PrintError("Failed to read %s\n\n", argv[2]);
return 0;
}
cloud_ptr->NormalizeNormals();
cloud_ptr->colors_.resize(cloud_ptr->points_.size());
double color_index = 0.0;
double color_index_step = 0.05;
auto update_colors_func = [&cloud_ptr](double index) {
auto color_map_ptr = GetGlobalColorMap();
for (auto &c : cloud_ptr->colors_) {
c = color_map_ptr->GetColor(index);
}
};
update_colors_func(1.0);
DrawGeometriesWithAnimationCallback({cloud_ptr},
[&](Visualizer *vis) {
color_index += color_index_step;
if (color_index > 2.0) color_index -= 2.0;
update_colors_func(fabs(color_index - 1.0));
std::this_thread::sleep_for(std::chrono::milliseconds(100));
return true;
}, "Rainbow", 1600, 900);
} else if (option == "image") {
auto image_ptr = std::make_shared<Image>();
if (ReadImage(argv[2], *image_ptr)) {
PrintWarning("Successfully read %s\n", argv[2]);
} else {
PrintError("Failed to read %s\n\n", argv[2]);
return 0;
}
DrawGeometries({image_ptr}, "Image", image_ptr->width_,
image_ptr->height_);
} else if (option == "depth") {
auto image_ptr = CreateImageFromFile(argv[2]);
PinholeCameraIntrinsic camera;
camera.SetIntrinsics(640, 480, 575.0, 575.0, 319.5, 239.5);
auto pointcloud_ptr = CreatePointCloudFromDepthImage(*image_ptr,
camera);
DrawGeometries({pointcloud_ptr}, "PointCloud from Depth Image",
1920, 1080);
} else if (option == "editing") {
auto pcd = CreatePointCloudFromFile(argv[2]);
DrawGeometriesWithEditing({pcd}, "Editing", 1920, 1080);
} else if (option == "animation") {
auto mesh_ptr = std::make_shared<TriangleMesh>();
if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
PrintWarning("Successfully read %s\n", argv[2]);
} else {
PrintError("Failed to read %s\n\n", argv[2]);
return 0;
}
mesh_ptr->ComputeVertexNormals();
if (argc == 3) {
DrawGeometriesWithCustomAnimation({mesh_ptr}, "Animation", 1920,
1080);
} else {
DrawGeometriesWithCustomAnimation({mesh_ptr}, "Animation", 1600,
900, 50, 50, argv[3]);
}
}
PrintInfo("End of the test.\n");
return 1;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
add_definitions(-std=c++11)
project(TestVisualizer)
set(CMAKE_PREFIX_PATH "/usr/local/lib/cmake/Open3D")
find_package(Open3D HINTS ${CMAKE_INSTALL_PREFIX}/lib/CMake)
list(APPEND Open3D_LIBRARIES dl)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${Open3D_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Open3D_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${Open3D_EXE_LINKER_FLAGS}")
# Set OS-specific things here
add_definitions(-DUNIX)
add_compile_options(-Wno-deprecated-declarations)
add_compile_options(-Wno-unused-result)
add_definitions(-O3)
# Open3D
if (Open3D_FOUND)
message(STATUS "Found Open3D ${Open3D_VERSION}")
# link_directories must be before add_executable
link_directories(${Open3D_LIBRARY_DIRS})
add_executable(TestVisualizer "open3d_01.cpp")
target_link_libraries(TestVisualizer ${Open3D_LIBRARIES})
target_include_directories(TestVisualizer PUBLIC ${Open3D_INCLUDE_DIRS})
else ()
message(SEND_ERROR "Open3D not found")
endif ()
运行测试用例
./TestVisualizer pointcloud fragment.pcd