ZBLOG

auto handleImgae = std::thread([&]() { while (true) { { std::unique_lock lck(m_mutex); for (auto it = receiveDataMap.begin(); it != receiveDataMap.end(); ) { double tmp_timestamp = it->first; std::vect...

要将这段代码通过ROS发布图像,你需要进行一些修改。首先,你需要包含必要的ROS头文件和消息类型。然后,你可以使用cv_bridge库将OpenCV图像转换为ROS图像消息类型(sensor_msgs/Image)。最后,创建一个图像发布者并将转换后的图像消息发布到指定话题。

下面是修改后的代码示例:

#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>

// 全局变量定义
std::mutex m_mutex;
std::vector<std::vector<bev_data>> handleDatavec;

// 图像发布函数
void publishImage(cv::Mat image, double timestamp)
{
    // 创建节点句柄
    ros::NodeHandle nh;

    // 创建一个图像发布者
    ros::Publisher image_pub = nh.advertise<sensor_msgs::Image>("/image_topic", 10);

    sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
    
    // 设置时间戳信息(可选)
    msg->header.stamp = ros::Time(timestamp); 

    // 发布图像消息
    image_pub.publish(msg);
}

int main(int argc, char** argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "image_publisher");
    
    while (true) {
        std::unique_lock<std::mutex> lck(m_mutex);
        for (auto it = receiveDataMap.begin(); it != receiveDataMap.end(); ) {
            double tmp_timestamp = it->first;
            std::vector<bev_data>& dataList = it->second;
            if (dataList.size() == dataList.at(0).total_package) 
            {
                handleDatavec.emplace_back(dataList);
                it = receiveDataMap.erase(it);
            } else {
                ++it;
            }
        }
    }

    // 显示和保存
    for (auto & vec:handleDatavec) {
        std::vector<unsigned char> imageData;  // 存储图像二进制数据
        std::sort(vec.begin(), vec.end(), compareData);
        double timestamp = 0;
        
        for (const auto& data : vec) {
            imageData.insert(imageData.end(), data.strPara, data.strPara + data.data_size);  // 将数据追加到图像二进制数据中
            timestamp = data.timestamp;
        }

        cv::Mat receivedImage = cv::imdecode(imageData, cv::IMREAD_COLOR);  // 解码图像
        
        if (receivedImage.empty()) {
            ROS_ERROR("解码图像失败");
        } else {
            publishImage(receivedImage, timestamp);  // 发布图像消息
            
            std::string file_path = path + std::to_string(timestamp) + ".jpg";
            cv::imwrite(file_path, receivedImage); // 保存接收到的图像文件

            cv::imshow("Received Image", receivedImage);  // 展示接收到的图像
            cv::waitKey(30);
            
            ros::spinOnce();  // 处理回调函数
        }
    }

    handleDatavec.clear();

    return 0;
}

请确保已在CMakeLists.txt中添加了必要的依赖项,并编译你的ROS包。

这样,当处理完一组数据后,会将接收到的图像发布到指定的ROS话题”/image_topic”上,并保存图像文件。同时,在展示图像时,使用cv::waitKey(30)来保持窗口更新和处理ROS回调函数。

希望这个修改后的代码对你有所帮助!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=10831

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?