在编译这个例子时候,会产生报错,接下来我们用具体命令进行编译,首先进入到rgbd文件夹下:
mkdir build
cd build
cmake ..
make -j4
error1:
CMakeFiles/joinMap.dir/joinMap.o: In function `main':
joinMap.cpp:(.text+0x17b): undefined reference to `cv::imread(cv::String const&, int)'
joinMap.cpp:(.text+0x256): undefined reference to `cv::imread(cv::String const&, int)'
CMakeFiles/joinMap.dir/joinMap.o: In function `cv::String::~String()':
joinMap.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
CMakeFiles/joinMap.dir/joinMap.o: In function `cv::String::operator=(cv::String const&)':
joinMap.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()'
CMakeFiles/joinMap.dir/joinMap.o: In function `cv::Mat::Mat(cv::Mat const&)':
joinMap.cpp:(.text._ZN2cv3MatC2ERKS0_[_ZN2cv3MatC5ERKS0_]+0x188): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
CMakeFiles/joinMap.dir/joinMap.o: In function `cv::Mat::~Mat()':
joinMap.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `cv::Mat::release()':
joinMap.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b): undefined reference to `cv::Mat::deallocate()'
CMakeFiles/joinMap.dir/joinMap.o: In function `cv::String::String(std::__cxx11::basic_string
joinMap.cpp:(.text._ZN2cv6StringC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN2cv6StringC5ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x5d): undefined reference to `cv::String::allocate(unsigned long)'
CMakeFiles/joinMap.dir/joinMap.o: In function `std::make_unsigned
joinMap.cpp:(.text._ZN3fmt2v86detail11to_unsignedIlEENSt13make_unsignedIT_E4typeES4_[_ZN3fmt2v86detail11to_unsignedIlEENSt13make_unsignedIT_E4typeES4_]+0x21): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `std::make_unsigned
joinMap.cpp:(.text._ZN3fmt2v86detail11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_[_ZN3fmt2v86detail11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_]+0x1f): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `fmt::v8::format_error::format_error(char const*)':
joinMap.cpp:(.text._ZN3fmt2v812format_errorC2EPKc[_ZN3fmt2v812format_errorC5EPKc]+0x26): undefined reference to `vtable for fmt::v8::format_error'
CMakeFiles/joinMap.dir/joinMap.o: In function `fmt::v8::detail::throw_format_error(char const*)':
joinMap.cpp:(.text._ZN3fmt2v86detail18throw_format_errorEPKc[_ZN3fmt2v86detail18throw_format_errorEPKc]+0x25): undefined reference to `fmt::v8::format_error::~format_error()'
joinMap.cpp:(.text._ZN3fmt2v86detail18throw_format_errorEPKc[_ZN3fmt2v86detail18throw_format_errorEPKc]+0x2c): undefined reference to `typeinfo for fmt::v8::format_error'
CMakeFiles/joinMap.dir/joinMap.o: In function `Sophus::SO3Base
joinMap.cpp:(.text._ZN6Sophus7SO3BaseINS_3SO3IdLi0EEEE9normalizeEv[_ZN6Sophus7SO3BaseINS_3SO3IdLi0EEEE9normalizeEv]+0x13a): undefined reference to `fmt::v8::vprint(fmt::v8::basic_string_view
joinMap.cpp:(.text._ZN6Sophus7SO3BaseINS_3SO3IdLi0EEEE9normalizeEv[_ZN6Sophus7SO3BaseINS_3SO3IdLi0EEEE9normalizeEv]+0x1a0): undefined reference to `fmt::v8::vprint(fmt::v8::basic_string_view
CMakeFiles/joinMap.dir/joinMap.o: In function `fmt::v8::basic_format_parse_context
joinMap.cpp:(.text._ZN3fmt2v826basic_format_parse_contextIcNS0_6detail13error_handlerEE8on_errorEPKc[_ZN3fmt2v826basic_format_parse_contextIcNS0_6detail13error_handlerEE8on_errorEPKc]+0x5): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `char const* fmt::v8::detail::parse_align
joinMap.cpp:(.text._ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_alignIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x7d): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `int fmt::v8::detail::parse_nonnegative_int
joinMap.cpp:(.text._ZN3fmt2v86detail21parse_nonnegative_intIcEEiRPKT_S5_i[_ZN3fmt2v86detail21parse_nonnegative_intIcEEiRPKT_S5_i]+0x39): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `char const* fmt::v8::detail::parse_width
joinMap.cpp:(.text._ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v86detail11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x70): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `void fmt::v8::detail::check_string_type_spec
joinMap.cpp:(.text._ZN3fmt2v86detail22check_string_type_specIcRNS1_13error_handlerEEEvT_OT0_[_ZN3fmt2v86detail22check_string_type_specIcRNS1_13error_handlerEEEvT_OT0_]+0x22): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `void fmt::v8::detail::format_value
joinMap.cpp:(.text._ZN3fmt2v86detail12format_valueIcN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEvRNS1_6bufferIT_EERKT0_NS1_10locale_refE[_ZN3fmt2v86detail12format_valueIcN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEvRNS1_6bufferIT_EERKT0_NS1_10locale_refE]+0x8a): undefined reference to `std::locale fmt::v8::detail::locale_ref::get
CMakeFiles/joinMap.dir/joinMap.o: In function `char const* fmt::v8::detail::do_parse_arg_id
joinMap.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_11parse_widthIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E13width_adapterEESE_SE_SE_SG_]+0xb5): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `char const* fmt::v8::detail::do_parse_arg_id
joinMap.cpp:(.text._ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_[_ZN3fmt2v86detail15do_parse_arg_idIcRZNS1_15parse_precisionIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SE_SE_OT0_E17precision_adapterEESE_SE_SE_SG_]+0xb5): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `int fmt::v8::detail::get_dynamic_spec
joinMap.cpp:(.text._ZN3fmt2v86detail16get_dynamic_specINS1_13width_checkerENS0_16basic_format_argINS0_20basic_format_contextINS0_8appenderEcEEEENS1_13error_handlerEEEiT0_T1_[_ZN3fmt2v86detail16get_dynamic_specINS1_13width_checkerENS0_16basic_format_argINS0_20basic_format_contextINS0_8appenderEcEEEENS1_13error_handlerEEEiT0_T1_]+0x27e): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `int fmt::v8::detail::get_dynamic_spec
joinMap.cpp:(.text._ZN3fmt2v86detail16get_dynamic_specINS1_17precision_checkerENS0_16basic_format_argINS0_20basic_format_contextINS0_8appenderEcEEEENS1_13error_handlerEEEiT0_T1_[_ZN3fmt2v86detail16get_dynamic_specINS1_17precision_checkerENS0_16basic_format_argINS0_20basic_format_contextINS0_8appenderEcEEEENS1_13error_handlerEEEiT0_T1_]+0x27e): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `void fmt::v8::detail::check_string_type_spec
joinMap.cpp:(.text._ZN3fmt2v86detail22check_string_type_specIcNS1_13error_handlerEEEvT_OT0_[_ZN3fmt2v86detail22check_string_type_specIcNS1_13error_handlerEEEvT_OT0_]+0x22): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `unsigned long long fmt::v8::detail::width_checker
joinMap.cpp:(.text._ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIiLi0EEEyT_[_ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIiLi0EEEyT_]+0x2f): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
CMakeFiles/joinMap.dir/joinMap.o: In function `unsigned long long fmt::v8::detail::width_checker
joinMap.cpp:(.text._ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIjLi0EEEyT_[_ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIjLi0EEEyT_]+0x2f): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
CMakeFiles/joinMap.dir/joinMap.o:joinMap.cpp:(.text._ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIxLi0EEEyT_[_ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIxLi0EEEyT_]+0x32): more undefined references to `fmt::v8::detail::error_handler::on_error(char const*)' follow
CMakeFiles/joinMap.dir/joinMap.o: In function `fmt::v8::appender fmt::v8::detail::write_padded<(fmt::v8::align::type)1, fmt::v8::appender, char, fmt::v8::detail::write
joinMap.cpp:(.text._ZN3fmt2v86detail12write_paddedILNS0_5align4typeE1ENS0_8appenderEcZNS1_5writeIcS5_EET0_S7_NS0_17basic_string_viewIT_EERKNS0_18basic_format_specsIS9_EEEUlS5_E_EES7_S7_RKNSB_IT1_EEmmOT2_[_ZN3fmt2v86detail12write_paddedILNS0_5align4typeE1ENS0_8appenderEcZNS1_5writeIcS5_EET0_S7_NS0_17basic_string_viewIT_EERKNS0_18basic_format_specsIS9_EEEUlS5_E_EES7_S7_RKNSB_IT1_EEmmOT2_]+0x59): undefined reference to `fmt::v8::detail::basic_data
collect2: error: ld returned 1 exit status
CMakeFiles/joinMap.dir/build.make:127: recipe for target 'joinMap' failed
make[2]: *** [joinMap] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/joinMap.dir/all' failed
make[1]: *** [CMakeFiles/joinMap.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
产生这个错误的原因是你的cmakelists文件没有写完整:
CMakeLists文件如下:
project(rgbd)
cmake_minimum_required(VERSION 3.10)
find_package(Sophus REQUIRED)
add_executable(joinMap joinMap.cpp)
include_directories(${Sophus_INCLUDE_DIRS})
#链接OpenCV库
find_package(OpenCV REQUIRED)
#添加头文件
include_directories( ${OpenCV-INCLUDE_DIRS})
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
find_package(Pangolin REQUIRED)
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
# Eigen
include_directories("/usr/local/include/eigen3")
target_link_libraries(joinMap ${Sophus_LIBRARIES} fmt)
#链接c++11
set(CMAKE_CXX_FLAGS "-std=c++11")
error2:
转换图像中: 1
转换图像中: 2
转换图像中: 3
转换图像中: 4
转换图像中: 5
点云共有0个点.
Point cloud is empty!
这个错误主要是你的c++代码里面的相关路径没有修改:
把它改为你自己的路径,进入rgbd文件夹下,Ctrl+L复制就可以了!!!
多加一个 . 改一下路径就OK了!!
具体的代码如下:
#include
#include
#include
#include // for formating strings
#include
#include
using namespace std;
typedef vector> TrajectoryType;
typedef Eigen::Matrix Vector6d;
// 在pangolin中画图,已写好,无需调整
void showPointCloud(
const vector> &pointcloud);
int main(int argc, char **argv) {
vector colorImgs, depthImgs; // 彩色图和深度图
TrajectoryType poses; // 相机位姿
ifstream fin("/home/liqiang/Desktop/slambook2/ch5/rgbd/pose.txt");
if (!fin) {
cerr << "请在有pose.txt的目录下运行此程序" << endl;
return 1;
}
for (int i = 0; i < 5; i++) {
boost::format fmt("../%s/%d.%s"); //图像文件格式
colorImgs.push_back(cv::imread((fmt % "color" % (i + 1) % "png").str()));
depthImgs.push_back(cv::imread((fmt % "depth" % (i + 1) % "pgm").str(), -1)); // 使用-1读取原始图像
double data[7] = {0};
for (auto &d:data)
fin >> d;
Sophus::SE3d pose(Eigen::Quaterniond(data[6], data[3], data[4], data[5]),
Eigen::Vector3d(data[0], data[1], data[2]));
poses.push_back(pose);
}
// 计算点云并拼接
// 相机内参
double cx = 325.5;
double cy = 253.5;
double fx = 518.0;
double fy = 519.0;
double depthScale = 1000.0;
vector> pointcloud;
pointcloud.reserve(1000000);
for (int i = 0; i < 5; i++) {
cout << "转换图像中: " << i + 1 << endl;
cv::Mat color = colorImgs[i];
cv::Mat depth = depthImgs[i];
Sophus::SE3d T = poses[i];
for (int v = 0; v < color.rows; v++)
for (int u = 0; u < color.cols; u++) {
unsigned int d = depth.ptr(v)[u]; // 深度值
if (d == 0) continue; // 为0表示没有测量到
Eigen::Vector3d point;
point[2] = double(d) / depthScale;
point[0] = (u - cx) * point[2] / fx;
point[1] = (v - cy) * point[2] / fy;
Eigen::Vector3d pointWorld = T * point;
Vector6d p;
p.head<3>() = pointWorld;
p[5] = color.data[v * color.step + u * color.channels()]; // blue
p[4] = color.data[v * color.step + u * color.channels() + 1]; // green
p[3] = color.data[v * color.step + u * color.channels() + 2]; // red
pointcloud.push_back(p);
}
}
cout << "点云共有" << pointcloud.size() << "个点." << endl;
showPointCloud(pointcloud);
return 0;
}
void showPointCloud(const vector> &pointcloud) {
if (pointcloud.empty()) {
cerr << "Point cloud is empty!" << endl;
return;
}
pangolin::CreateWindowAndBind("Point Cloud Viewer", 1024, 768);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000),
pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0)
);
pangolin::View &d_cam = pangolin::CreateDisplay()
.SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f / 768.0f)
.SetHandler(new pangolin::Handler3D(s_cam));
while (pangolin::ShouldQuit() == false) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glPointSize(2);
glBegin(GL_POINTS);
for (auto &p: pointcloud) {
glColor3d(p[3] / 255.0, p[4] / 255.0, p[5] / 255.0);
glVertex3d(p[0], p[1], p[2]);
}
glEnd();
pangolin::FinishFrame();
usleep(5000); // sleep 5 ms
}
return;
}
Ubuntu20.04的执行效果如下:
Ubuntu18.04的执行效果如下:
PS:前面我有些图有的是20.04截图的,有的是18.04截图的,两个版本错误原理都是一样 的,所以我就没细分!!!!