欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包

 更新時(shí)間:2023年01月12日 15:46:39   作者:YOULANSHENGMENG  
這篇文章主要介紹了C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、前期工作創(chuàng)建工作空間

 二、創(chuàng)建工作包

創(chuàng)建完成后,文件夾的格式為:

三、準(zhǔn)備編譯文件和代碼

3.1 更換編譯文件中的內(nèi)容

將上圖中的,CMakeLists.txt文件中的內(nèi)容,替換為下面的內(nèi)容

cmake_minimum_required(VERSION 3.0.2)
project(create_bag)
 
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
 
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
# 尋找OpenCV庫
find_package( OpenCV  REQUIRED )
# 添加頭文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
 
find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  rosbag
  roscpp
  rospy
  std_msgs
)
 
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES imgtobag
#  CATKIN_DEPENDS cv_bridge rosbag roscpp rospy std_msgs
#  DEPENDS system_lib
)
 
###########
## Build ##
###########
 
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
  ${catkin_INCLUDE_DIRS}
  ${rosbag_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
)
 
add_executable(node src/torosbag.cpp)
target_link_libraries(node
  ${catkin_LIBRARIES}
  ${PCL_LIBRARIES}
  ${rosbag_LIBRARIES}
  ${OpenCV_LIBS}
)

 3.2 準(zhǔn)備主程序

leedarson@leedarson-desktop:~/catkin_ws/src/create_bag/src$ touch torosbag.cpp
創(chuàng)建一個(gè)cpp的文件夾,cpp文件中的內(nèi)容為:

#include <string>
#include <ros/console.h>
#include <rosbag/bag.h>
#include <cv_bridge/cv_bridge.h>
#include <iostream>
#include <vector>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
 
void GetFileNames(string path,vector<string>& filenames, string con);
void GetFileNamesByGlob(cv::String path,vector<cv::String>& filenames, string con);
bool read_images(string path, vector<string> &image_files);
int main(int argc, char **argv)
{
    //輸入文件和輸出文件路徑
    string base_dir = "/home/leedarson/catkin_ws/src/create_bag/data/";
    string img_dir = base_dir + "img/";
    std::cout<<"image path is"<<img_dir<<std::endl;
    string output_bag=base_dir +"Human2.bag";
    string img_format = ".jpg";//格式
    vector<string> img_names;
    //GetFileNames(img_dir, img_names,".jpg");
    read_images(img_dir, img_names);
    cout<<"圖片讀取完成"<<endl;
 
    cout<<"----"<<endl;
 
    ros::Time::init();
    rosbag::Bag bag;
    bag.open(output_bag, rosbag::bagmode::Write);
    int seq = 0;
    vector<string>::iterator it;
    for(it = img_names.begin(); it != img_names.end();it++)//todo 之后改成圖片數(shù)量的多少
    {
        string tmp = *it;
        std::cout<<"tmp path is"<<tmp<<std::endl;
        //cout<<tmp<<endl;
        //string strImgFile =  img_dir + tmp + img_format;
        string strImgFile = tmp;
        usleep(200000);//4hz
        ros::Time timestamp_ros = ros::Time::now();
        
        // --- for image ---//
        cv::Mat img = cv::imread(strImgFile);
        if (img.empty())
            cout<<"圖片為空: "<<strImgFile<<endl;
        cv_bridge::CvImage ros_image;
        sensor_msgs::ImagePtr ros_image_msg;
 
        ros_image.image = img;
        ros_image.encoding = "bgr8";
        //cout<<"debug_______"<<endl;
        //ros::Time timestamp_ros2 = ros::Time::now();
        ros_image_msg = ros_image.toImageMsg();
        ros_image_msg->header.seq = seq;
        ros_image_msg->header.stamp = timestamp_ros;
        ros_image_msg->header.frame_id = "/image_raw";
 
        bag.write("/camera/color/image_raw", ros_image_msg->header.stamp, ros_image_msg);
        cout<<"write frame: "<<seq<<endl;
        seq++;
    }
 
    cout<<"---end---"<<endl;
 
    return 0;
}
 
//con:文件格式 form:文件命名形式
void GetFileNames(string path,vector<string>& filenames, string con)
{
    DIR *pDir;
    struct dirent* ptr;
    string filename, format, name, name2;
 
    if(!(pDir = opendir(path.c_str())))
        return;
    int num=0;
    while((ptr = readdir(pDir))!=0) 
    {
        //跳過.和..文件
        if(strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0)
            continue;
        filename = ptr->d_name;
        format = filename.substr(filename.find("."), filename.length());
        //name = filename.substr(0, filename.find("."));
        name = filename.substr(0, filename.find("."));
        cout<<filename<<"\t"<<name<<"\t"<<format<<endl;
 
        if(format == con)//也可以添加對文件名的要求
        {
            filenames.push_back(name);
            
            num++;
        }        
    }
    std::cout<<"file size of:"<<filenames.size()<<"****"<<num<<std::endl;
    closedir(pDir);
}
 
//cv::glob(路徑,要放置路徑下文件定義的容器,false)
/*find_first_of()和find_last_of() 
執(zhí)行簡單的模式匹配,如在字符串中查找單個(gè)字符c:函數(shù)find_first_of() 查找在字符串中第1個(gè)出現(xiàn)的字符c,而函數(shù)find_last_of()查找最后一個(gè)出現(xiàn)的c。匹配的位置是返回值。如果沒有匹配發(fā)生,則函數(shù)返回-1*/
//復(fù)制子字符串substr(所需的子字符串的起始位置,默認(rèn)值為0 , 復(fù)制的字符數(shù)目)返回值:一個(gè)子字符串,從其指定的位置開始
//按圖片名升序排列
bool read_images(string path, vector<string> &image_files)
{
    //fn存儲path目錄下所有文件的路徑名稱,如../images/0001.png
	vector<cv::String> fn;
    cv::glob(path, fn, false);
    size_t count_1 = fn.size();
    if (count_1 == 0)
    {
        cout << "file " << path << " not  exits"<<endl;
        return -1;
    }
    //v1用來存儲只剩數(shù)字的字符串
    vector<string> v1;
    for (int i = 0; i < count_1; ++i)
    {
        //cout << fn[i] << endl;
        //1.獲取不帶路徑的文件名,000001.jpg(獲取最后一個(gè)/后面的字符串)
        string::size_type iPos = fn[i].find_last_of('/') + 1;
        string filename = fn[i].substr(iPos, fn[i].length() - iPos);
        //cout << filename << endl;
        //2.獲取不帶后綴的文件名,000001
        string name = filename.substr(0, filename.rfind("."));
        //cout << name << endl;
        v1.push_back(name);
    }
    //把v1升序排列
    sort(v1.begin(), v1.end(),[](string a, string b) {return stoi(a) < stoi(b); });
    
    string v = ".jpg";
    size_t count_2 = v1.size();
    for(int j = 0; j < count_2; ++j)
    {
        string z = path + v1[j] + v;
        image_files.push_back(z);//把完整的圖片名寫回來
    }
	return true;
}

四、編譯及執(zhí)行

4.1 編譯

4.2 執(zhí)行 

1,首先打開一個(gè)終端,輸入roscore,啟動ros

 2,打開新的終端,進(jìn)入工作空間,執(zhí)行以下語句

leedarson@leedarson-desktop:~/catkin_ws$ source devel/setup.bash
leedarson@leedarson-desktop:~/catkin_ws$ rosrun create_bag node

通過以上操作就可以將文件夾中的圖像轉(zhuǎn)換為bag包。

4.3 檢測錄制的bag包的話題和信息

rostopic list

rostopic echo 

到此這篇關(guān)于C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包的文章就介紹到這了,更多相關(guān)ros圖像轉(zhuǎn)換bag包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解

    單向鏈表(單鏈表)是鏈表的一種,其特點(diǎn)是鏈表的鏈接方向是單向的,對鏈表的訪問要通過順序讀取從頭部開始。本文將為大家詳細(xì)講講單向鏈表的實(shí)現(xiàn)與使用,需要的可以參考一下
    2022-08-08
  • 十進(jìn)制與BCD碼轉(zhuǎn)換的算法詳解

    十進(jìn)制與BCD碼轉(zhuǎn)換的算法詳解

    BCD轉(zhuǎn)換成十進(jìn)制 BCD碼是指用二進(jìn)制來表示十進(jìn)制數(shù)的編碼,即用4位二進(jìn)制來表示一位十進(jìn)制數(shù),因此4位二進(jìn)制數(shù)表示最大的十進(jìn)制數(shù)9(1001),只取十六個(gè)數(shù)中的十個(gè)數(shù)(有別于8421碼)
    2021-09-09
  • C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的通信協(xié)議,與HTTP協(xié)議不同,它允許服務(wù)器主動向客戶端發(fā)送數(shù)據(jù),而不需要客戶端明確地請求,本文主要給大家介紹了C++實(shí)現(xiàn)WebSocket服務(wù)器的案例,需要的朋友可以參考下
    2024-05-05
  • C++中的命名空間詳細(xì)介紹

    C++中的命名空間詳細(xì)介紹

    大家好,本篇文章主要講的是C++中的命名空間詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C語言讀取文件流的相關(guān)函數(shù)用法簡介

    C語言讀取文件流的相關(guān)函數(shù)用法簡介

    這篇文章主要介紹了C語言讀取文件流的相關(guān)函數(shù)用法簡介,包括fread()函數(shù)和feof()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • 純C語言實(shí)現(xiàn)五子棋

    純C語言實(shí)現(xiàn)五子棋

    本文給大家分享的是去年制作的一個(gè)純C語言實(shí)現(xiàn)的五子棋的代碼,雖然沒有帶漂亮的界面,還是推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • C++構(gòu)造函數(shù)的一些注意事項(xiàng)總結(jié)

    C++構(gòu)造函數(shù)的一些注意事項(xiàng)總結(jié)

    構(gòu)造函數(shù)是創(chuàng)建類對象,并且在創(chuàng)建完成前,對類進(jìn)行初始化的特殊函數(shù),下面這篇文章主要給大家介紹了關(guān)于C++構(gòu)造函數(shù)的一些注意事項(xiàng),需要的朋友可以參考下
    2021-11-11
  • C語言實(shí)現(xiàn)順序表的基本操作的示例詳解

    C語言實(shí)現(xiàn)順序表的基本操作的示例詳解

    順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲。本文將通過示例為大家講解一下順序表的基本操作,需要的可以參考一下
    2022-11-11
  • C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲

    C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C++通過循環(huán)實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Qt實(shí)現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換

    Qt實(shí)現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09

最新評論