cv_bridge中的編碼模式與實現


image_encodings.cpp文件是關於圖像編碼模式的源文件,其中規定了RGB的圖像以及深度圖的編碼模式

該編碼文件image_encodings.cpp所依賴的頭文件圖

命令空間  sensor_msgs::image_encodings 下的函數

Functions

int  bitDepth (const std::string &encoding)
bool  hasAlpha (const std::string &encoding)
bool  isBayer (const std::string &encoding)
bool  isColor (const std::string &encoding)
bool  isMono (const std::string &encoding)
int  numChannels (const std::string &encoding)

Variables

const std::string  BGR8 = "bgr8"
const std::string  MONO16 = "mono16"
const std::string  MONO8 = "mono8"
const std::string  TYPE_16SC1 = "16SC1"
const std::string  TYPE_16UC1 = "16UC1"
const std::string  TYPE_32FC1 = "32FC1"
const std::string  TYPE_32SC1 = "32SC1"
const std::string  TYPE_64FC1 = "64FC1"
const std::string  TYPE_8SC1 = "8SC1"
const std::string  TYPE_8UC1 = "8UC1"
那么關於深度圖的編碼的方式 有如下:TYPE_8UC1 TYPE_64FC1 等等
// B = bits (8, 16, 32,64), T = type (U, S, F)
#define CHECK_BIT_DEPTH(B, T) if (encoding == TYPE_##B##T##C1 || encoding == TYPE_##B##T##C2 ||  encoding == TYPE_##B##T##C3 ||
 encoding == TYPE_##B##T##C4)    return B;
比如使用這樣編碼方式,對kinect獲得的深度進行顯示,程序如下
#include <ros/ros.h>                           //ros 的頭文件
#include <image_transport/image_transport.h>   //image_transport
#include <cv_bridge/cv_bridge.h>              //cv_bridge
#include <sensor_msgs/image_encodings.h>    //圖像編碼格式
#include <opencv2/imgproc/imgproc.hpp>      //圖像處理
#include <opencv2/highgui/highgui.hpp>       //opencv GUI

static const std::string OPENCV_WINDOW = "Image window";   //申明一個GUI 的顯示的字符串

class ImageConverter    //申明一個圖像轉換的類
{
  ros::NodeHandle nh_;        //實例化一個節點
  image_transport::ImageTransport it_;
  image_transport::Subscriber image_sub_;     //訂閱節點
  image_transport::Publisher image_pub_;      //發布節點
  
public:
  ImageConverter()
    : it_(nh_)
  {
    // Subscrive to input video feed and publish output video feed
    image_sub_ = it_.subscribe("/camera/depth/image_raw", 1, &ImageConverter::imageCb, this);
    image_pub_ = it_.advertise("/image_converter/output_video", 1);

    cv::namedWindow(OPENCV_WINDOW);
  }

  ~ImageConverter()
  {
    cv::destroyWindow(OPENCV_WINDOW);
  }

  void imageCb(const sensor_msgs::ImageConstPtr& msg)   //回調函數
  {
    cv_bridge::CvImagePtr cv_ptr;  //申明一個CvImagePtr
    try
    {
      cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::TYPE_32FC1);
    }
    catch (cv_bridge::Exception& e)
    {
      ROS_ERROR("cv_bridge exception: %s", e.what());
      return;
    }
//轉化為opencv的格式之后就可以對圖像進行操作了
    // Draw an example circle on the video stream
    if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
      cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));  //畫圓

    // Update GUI Window
    cv::imshow(OPENCV_WINDOW, cv_ptr->image);
    cv::waitKey(3);
    
    // Output modified video stream
    image_pub_.publish(cv_ptr->toImageMsg());
  }
};

int main(int argc, char** argv)
{
  ros::init(argc, argv, "image_converter");
  ImageConverter ic;
  ros::spin();
  return 0;
}

最主要的就是編碼的方式的正確即可實現深度圖的顯示


從中我們可以看得處深度圖使用cv_bridge進行轉換與RGB圖之間的轉換為OPENCV可處理的結構基本上類似,但是最重要的就是編碼的模式的正確,所以這是非常關鍵的
為了使用深度圖與RGB的圖生成點雲,所以我們需要對深度圖使用正確的編碼模式,具體的代碼我就不再展示了,
那么我們可以看一下,對於不同的編碼模式生成點雲之間的區別


看起來就好像斷層了一樣,但是如果配合正確的編碼的模式效果就不是這樣的了,所以在使用cv_bridge的時候選擇正確的編碼模式是非常重要的,
暫時就更新到這里了,如果有問題可以直接評論,或者關注微信公眾號,或者加入QQ交流群與更多的人交流

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM