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, ->image
um 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.