通过Cmake创建动态库xxx.so

在根目录下创建一个package,这里命名为cmake_pra,同时在该目录下创建以下packages,如下图所示:

这里写图片描述

其中CMakelists内容如下:

cmake_minimum_required(VERSION 2.8) //camke版本
PROJECT(DEPTHLIB) // 工程名
ADD_SUBDIRECTORY(lib) //编译输出位置,生成的库所在的文件目录,这里是build/lib,也可以改为其他的

在lib文件夹下我们创建:CMakeLists.txt depth.cpp depth.h rgb.cpp rgb.h5个文件,需要生成2个动态库。

其中depth.h代码如下:

#ifndef DEPTH_H
#define DEPTH_H
#include 
#include 

#include  //声明opencv的头文件
#include 

#include  //声明pcl头文件
#include 

typedef pcl::PointXYZRGBA PointT; 
typedef pcl::PointCloud PointCloud;

struct CAMERA_INTRINSIC_PARAMETERS //定义相机内参的数据结构
{
  double cx,cy,fx,fy,scale;
};

cv::Point3f point2dTo3d(cv::Point3f&point,CAMERA_INTRINSIC_PARAMETERS &camera); //将像素点转成空间点的函数(需要点相机模型的基础)
PointCloud::Ptr image2PointCloud(cv::Mat &rgb,cv::Mat &depth,CAMERA_INTRINSIC_PARAMETERS &camera);//将像素点装成点云(需要点相机模型和点云的基础)
#endif

其中depth.cpp代码如下:

#include "depth.h"//引用头文件

PointCloud::Ptr image2PointCloud(cv::Mat &rgb,cv::Mat &depth,CAMERA_INTRINSIC_PARAMETERS &camera)//函数实现
{
  PointCloud::Ptr cloud(new PointCloud);//定义一个cloud智能指针
  for(int i=0;i (i)[j];
      if(d==0)
        continue;
        PointT p;
      p.z=double(d)/camera.scale;
      p.x=(j-camera.cx)/p.z;
      p.y=(i-camera.cy)/p.z;

      p.r=rgb.ptr (j)[3*i];
      p.g=rgb.ptr (j)[3*i+1];
      p.b=rgb.ptr (j)[3*i+2];
      cloud->points.push_back(p);//将所有的点都装进points容器中
    }
  cloud->height=1;
  cloud->width=cloud->points.size();
  cloud->is_dense=false;
  return cloud;
}
cv::Point3f point2dTo3d(cv::Point3f& point,CAMERA_INTRINSIC_PARAMETERS &camera)//函数实现
{
  cv::Point3f p; // 3D 点
   p.z = double( point.z ) / camera.scale;
   p.x = ( point.x - camera.cx) * p.z / camera.fx;
   p.y = ( point.y - camera.cy) * p.z / camera.fy;
   return p;
}

其中CMakeLists.txt代码如下:

cmake_minimum_required(VERSION 2.8.3)//cmake版本
project(DEPTHLIB)//工程名字

find_package(PCL REQUIRED)
find_package(OpenCV REQUIRED)  //相关的库
include_directories(
  ${catkin_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
) //包含的路径

SET(LIBDEPTH_SRC depth.cpp)
ADD_LIBRARY(depth SHARED ${LIBDEPTH_SRC}) //生成动态库

SET(LIBRGB_SRC rgb.cpp)
ADD_LIBRARY(rgb SHARED ${LIBRGB_SRC})

然后进到/cmake_pra/build

cmake ..
make

通过Cmake创建动态库xxx.so_第1张图片

得到动态库如下所示:

这里写图片描述

如果想要安装到 /usr/lib等目录下,则可以选择在lib/CMaklists里面添加下面俩行代码:

INSTALL(TARGETS depth LIBRARY DESTINATION lib)
INSTALL(FILES depth.h DESTINATION include/depth)

然后再

cmake ..

make

sudo make install

则搞定,可以直接调用了!!!

你可能感兴趣的:(Ubuntu)