ROS abonniert das Image-Thema und konvertiert es in ein OpenCV-Image

Anforderung: Holen Sie sich das von der RealSense-Kamera freigegebene RGB-Bild und Tiefenbild aus dem Thema und führen Sie die anschließende Verarbeitung durch. Die cv_bridge-Klasse wird in ROS bereitgestellt, um uns bei der Konvertierung zwischen ROS- und OpenCV-Bildformaten zu unterstützen.

Der Abonnent muss ein Objekt mit image_transport definieren und dann zwei Abonnentenobjekte definieren, die zum Rückruf der RGB- bzw. Tiefenthemen verwendet werden.

	// 初始化ros节点
    ros::init(argc, argv, "RGBD");
    // 创建ros节点句柄
    ros::NodeHandle nh;
    image_transport::ImageTransport it(nh);
    // 回调函数队列长度为x,因此spinOnce每次执行完队列函数,相当于每x帧取1帧
    image_transport::Subscriber rgb_sub = it.subscribe("rgb", 1, rgbCallback);
    image_transport::Subscriber depth_sub = it.subscribe("depth", 1, depthCallback);

Wenn cv_bridge die ROS-Bildnachricht in das OpenCV-Bildformat konvertiert, wird dies über die CvImage-Klasse implementiert. Im Allgemeinen bietet cv_bridge zwei Möglichkeiten zum Konvertieren in die CvImage-Klasse: Kopieren und Teilen.

  • Die toCvCopy-Funktion kopiert Bilddaten aus der ROS-Nachricht. Unabhängig davon, wie der Inhalt der CvImage-Klasse geändert wird, sind die Quelldaten nicht betroffen
  • Die toCvShare-Funktion zeigt den zurückgegebenen OpenCV-Zeiger auf die Nachricht von ROS, wenn die Quelle und die Codierung übereinstimmen, also der gemeinsam genutzte Zeiger. Seine Besonderheit besteht darin, dass der ROS-Nachrichtentyp nicht freigegeben wird, solange Sie noch eine Kopie der zurückgegebenen CvImage-Klasse behalten.

Die in CvBridge häufig verwendeten Codierungen lauten wie folgt:

  • mono8: CV_8UC1, Graustufenbild

  • mono16: CV_16UC1, 16-Bit-Graustufenbild

  • bgr8: CV_8UC3, Farbbild mit blau-grün-roter Farbreihenfolge

  • rgb8: CV_8UC3, Farbbild mit der Farbreihenfolge Rot-Grün-Blau

  • bgra8: CV_8UC4, BGR-Farbbild mit einem Alphakanal

  • rgba8: CV_8UC4, RGB-Farbbild mit einem Alphakanal

cv_bridge::toCvShare(msg, "bgr8")Es dient dazu, die Nachricht in ein CV_8UC3-Bild zu konvertieren und dann den gemeinsamen Zeiger auf die Nachricht abzurufen, ->imageum das Bild abzurufen. Das Format ist cv::Mat. Es kann als flache Kopie verstanden werden.

rgb = cv_bridge::toCvShare(msg, "bgr8")->image;

cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8)Konvertiert auch die Nachricht in ein CV_8UC3-Bild, verweist jedoch nur auf das konvertierte Bild im cv::Mat-Format. Es kann als tiefe Kopie verstanden werden.

cv::Mat rgb;
cv::Mat depth;

// rgb图像的回调函数,当有图像消息到达rgb时,就会被调用
void rgbCallback(const sensor_msgs::ImageConstPtr& msg) {
    
    
    try {
    
               
        // ROS图像消息——>OpenCV图像
        rgb = cv_bridge::toCvShare(msg, "bgr8")->image;
        // cv::imshow("image", rgb);
        // cv::waitKey(50);
        // cout << "I have received rgb image!" << endl;
        // rgb = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8)->image;
        
    } catch(cv_bridge::Exception& e) {
    
    
        ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
    }
}

// depth深度图像的回调函数
void depthCallback(const sensor_msgs::ImageConstPtr& msg) {
    
    
    try {
    
               
        // ROS图像消息——>OpenCV图像
        depth = cv_bridge::toCvShare(msg, "mono16")->image;
        // cout << "I have received depth image!" << endl;
    } catch(cv_bridge::Exception& e) {
    
    
        ROS_ERROR("Could not convert from '%s' to 'mono16'.", msg->encoding.c_str());
    }
}

Die Leute sagen, es sei eine Pfingstrose, aber Buddha sagt, es sei ein Blumenpfeil. Menschen ins Knochenmark schießen, klaglos sterben.

Supongo que te gusta

Origin blog.csdn.net/qq_42257666/article/details/131492112
Recomendado
Clasificación