Added fatal errors on cv exceptions caused by possible multiple installed opencv versions

This commit is contained in:
matlabbe
2026-04-18 14:45:56 -07:00
parent 3bc26e1a41
commit 45c586c379
7 changed files with 251 additions and 154 deletions
+155 -114
View File
@@ -191,39 +191,45 @@ void toCvShare(const rtabmap_msgs::msg::RGBDImage::ConstSharedPtr & image, cv_br
void toCvShare(const rtabmap_msgs::msg::RGBDImage & image, const std::shared_ptr<void const>& trackedObject, cv_bridge::CvImageConstPtr & rgb, cv_bridge::CvImageConstPtr & depth)
{
if(!image.rgb.data.empty())
try
{
rgb = cv_bridge::toCvShare(image.rgb, trackedObject);
}
else if(!image.rgb_compressed.data.empty())
{
rgb = cv_bridge::toCvCopy(image.rgb_compressed);
}
else
{
// empty
rgb = std::make_shared<cv_bridge::CvImage>();
}
if(!image.depth.data.empty())
{
depth = cv_bridge::toCvShare(image.depth, trackedObject);
}
else if(!image.depth_compressed.data.empty())
{
if(image.depth_compressed.format.compare("jpg")==0)
if(!image.rgb.data.empty())
{
depth = cv_bridge::toCvCopy(image.depth_compressed);
rgb = cv_bridge::toCvShare(image.rgb, trackedObject);
}
else if(!image.rgb_compressed.data.empty())
{
rgb = cv_bridge::toCvCopy(image.rgb_compressed);
}
else
{
cv_bridge::CvImagePtr ptr = std::make_shared<cv_bridge::CvImage>();
ptr->header = image.depth_compressed.header;
ptr->image = rtabmap::uncompressImage(image.depth_compressed.data);
UASSERT(ptr->image.empty() || ptr->image.type() == CV_32FC1 || ptr->image.type() == CV_16UC1);
ptr->encoding = ptr->image.empty()?"":ptr->image.type() == CV_32FC1?sensor_msgs::image_encodings::TYPE_32FC1:sensor_msgs::image_encodings::TYPE_16UC1;
depth = ptr;
// empty
rgb = std::make_shared<cv_bridge::CvImage>();
}
if(!image.depth.data.empty())
{
depth = cv_bridge::toCvShare(image.depth, trackedObject);
}
else if(!image.depth_compressed.data.empty())
{
if(image.depth_compressed.format.compare("jpg")==0)
{
depth = cv_bridge::toCvCopy(image.depth_compressed);
}
else
{
cv_bridge::CvImagePtr ptr = std::make_shared<cv_bridge::CvImage>();
ptr->header = image.depth_compressed.header;
ptr->image = rtabmap::uncompressImage(image.depth_compressed.data);
UASSERT(ptr->image.empty() || ptr->image.type() == CV_32FC1 || ptr->image.type() == CV_16UC1);
ptr->encoding = ptr->image.empty()?"":ptr->image.type() == CV_32FC1?sensor_msgs::image_encodings::TYPE_32FC1:sensor_msgs::image_encodings::TYPE_16UC1;
depth = ptr;
}
}
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting rgbd image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
}
@@ -348,27 +354,32 @@ rtabmap::SensorData rgbdImageFromROS(const rtabmap_msgs::msg::RGBDImage::ConstSh
}
cv::Mat left, right;
if(imageRectLeft->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
imageRectLeft->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
left = imageRectLeft->image;
try {
if( imageRectLeft->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
imageRectLeft->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
left = imageRectLeft->image;
}
else if(imageRectLeft->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
left = cv_bridge::cvtColor(imageRectLeft, "mono8")->image;
}
else
{
left = cv_bridge::cvtColor(imageRectLeft, "bgr8")->image;
}
if( imageRectRight->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
imageRectRight->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
right = imageRectRight->image;
}
else
{
right = cv_bridge::cvtColor(imageRectRight, "mono8")->image;
}
}
else if(imageRectLeft->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
left = cv_bridge::cvtColor(imageRectLeft, "mono8")->image;
}
else
{
left = cv_bridge::cvtColor(imageRectLeft, "bgr8")->image;
}
if(imageRectRight->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
imageRectRight->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
right = imageRectRight->image;
}
else
{
right = cv_bridge::cvtColor(imageRectRight, "mono8")->image;
catch(cv::Exception& e) {
UFATAL("Fatal error while converting images (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
//
@@ -420,19 +431,24 @@ rtabmap::SensorData rgbdImageFromROS(const rtabmap_msgs::msg::RGBDImage::ConstSh
}
cv_bridge::CvImageConstPtr ptrImage = imageMsg;
if(imageMsg->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0 ||
imageMsg->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
imageMsg->encoding.compare(sensor_msgs::image_encodings::BGR8) == 0)
{
// do nothing
try {
if(imageMsg->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0 ||
imageMsg->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
imageMsg->encoding.compare(sensor_msgs::image_encodings::BGR8) == 0)
{
// do nothing
}
else if(imageMsg->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
ptrImage = cv_bridge::cvtColor(imageMsg, "mono8");
}
else
{
ptrImage = cv_bridge::cvtColor(imageMsg, "bgr8");
}
}
else if(imageMsg->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
ptrImage = cv_bridge::cvtColor(imageMsg, "mono8");
}
else
{
ptrImage = cv_bridge::cvtColor(imageMsg, "bgr8");
catch(cv::Exception& e) {
UFATAL("Fatal error while converting image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
cv_bridge::CvImageConstPtr ptrDepth = depthMsg;
@@ -1136,18 +1152,23 @@ rtabmap::SensorData sensorDataFromROS(const rtabmap_msgs::msg::SensorData & msg)
}
else
{
if(leftRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
leftRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
left = leftRawPtr->image.clone();
try {
if( leftRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
leftRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
left = leftRawPtr->image.clone();
}
else if(leftRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
left = cv_bridge::cvtColor(leftRawPtr, "mono8")->image;
}
else
{
left = cv_bridge::cvtColor(leftRawPtr, "bgr8")->image;
}
}
else if(leftRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
left = cv_bridge::cvtColor(leftRawPtr, "mono8")->image;
}
else
{
left = cv_bridge::cvtColor(leftRawPtr, "bgr8")->image;
catch(cv::Exception& e) {
UFATAL("Fatal error while converting left image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
}
}
@@ -1169,18 +1190,23 @@ rtabmap::SensorData sensorDataFromROS(const rtabmap_msgs::msg::SensorData & msg)
}
else
{
if(rightRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
rightRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
(!isStereo &&
(rightRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0||
rightRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_16UC1) == 0 ||
rightRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_32FC1) == 0)))
{
right = rightRawPtr->image.clone();
try{
if( rightRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
rightRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
(!isStereo &&
(rightRawPtr->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0||
rightRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_16UC1) == 0 ||
rightRawPtr->encoding.compare(sensor_msgs::image_encodings::TYPE_32FC1) == 0)))
{
right = rightRawPtr->image.clone();
}
else
{
right = cv_bridge::cvtColor(rightRawPtr, "mono8")->image;
}
}
else
{
right = cv_bridge::cvtColor(rightRawPtr, "mono8")->image;
catch(cv::Exception& e) {
UFATAL("Fatal error while converting right image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
}
}
@@ -2197,19 +2223,24 @@ bool convertRGBDMsgs(
if(!imageMsgs.empty())
{
cv_bridge::CvImageConstPtr ptrImage = imageMsgs[i];
if(imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0 ||
imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::BGR8) == 0)
{
// do nothing
try {
if(imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0 ||
imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::BGR8) == 0)
{
// do nothing
}
else if(imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
ptrImage = cv_bridge::cvtColor(imageMsgs[i], "mono8");
}
else
{
ptrImage = cv_bridge::cvtColor(imageMsgs[i], "bgr8");
}
}
else if(imageMsgs[i]->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
ptrImage = cv_bridge::cvtColor(imageMsgs[i], "mono8");
}
else
{
ptrImage = cv_bridge::cvtColor(imageMsgs[i], "bgr8");
catch(cv::Exception& e) {
UFATAL("Fatal error while converting image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
// initialize
@@ -2260,7 +2291,12 @@ bool convertRGBDMsgs(
}
else
{
ptrImage = cv_bridge::cvtColor(depthMsgs[i], "mono8");
try{
ptrImage = cv_bridge::cvtColor(depthMsgs[i], "mono8");
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
}
// initialize
@@ -2460,27 +2496,32 @@ bool convertStereoMsg(
return false;
}
if(leftImageMsg->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
leftImageMsg->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
left = leftImageMsg->image.clone();
try{
if( leftImageMsg->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
leftImageMsg->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
left = leftImageMsg->image.clone();
}
else if(leftImageMsg->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
left = cv_bridge::cvtColor(leftImageMsg, "mono8")->image;
}
else
{
left = cv_bridge::cvtColor(leftImageMsg, "bgr8")->image;
}
if( rightImageMsg->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
rightImageMsg->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
right = rightImageMsg->image.clone();
}
else
{
right = cv_bridge::cvtColor(rightImageMsg, "mono8")->image;
}
}
else if(leftImageMsg->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
left = cv_bridge::cvtColor(leftImageMsg, "mono8")->image;
}
else
{
left = cv_bridge::cvtColor(leftImageMsg, "bgr8")->image;
}
if(rightImageMsg->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1) == 0 ||
rightImageMsg->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0)
{
right = rightImageMsg->image.clone();
}
else
{
right = cv_bridge::cvtColor(rightImageMsg, "mono8")->image;
catch(cv::Exception& e) {
UFATAL("Fatal error while converting images (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
rtabmap::Transform localTransform = getTransform(frameId, leftImageMsg->header.frame_id, leftImageMsg->header.stamp, listener, waitForTransform);
+7 -2
View File
@@ -595,8 +595,13 @@ void RGBDOdometry::callback(
std::vector<cv_bridge::CvImageConstPtr> imageMsgs(1);
std::vector<cv_bridge::CvImageConstPtr> depthMsgs(1);
std::vector<sensor_msgs::msg::CameraInfo> infoMsgs;
imageMsgs[0] = cv_bridge::toCvShare(image);
depthMsgs[0] = cv_bridge::toCvShare(depth);
try{
imageMsgs[0] = cv_bridge::toCvShare(image);
depthMsgs[0] = cv_bridge::toCvShare(depth);
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting images (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
infoMsgs.push_back(*cameraInfo);
double stampDiff = fabs(rtabmap_conversions::timestampFromROS(image->header.stamp) - rtabmap_conversions::timestampFromROS(depth->header.stamp));
@@ -684,8 +684,13 @@ void StereoOdometry::callback(
std::vector<cv_bridge::CvImageConstPtr> rightMsgs(1);
std::vector<sensor_msgs::msg::CameraInfo> leftInfoMsgs;
std::vector<sensor_msgs::msg::CameraInfo> rightInfoMsgs;
leftMsgs[0] = cv_bridge::toCvShare(imageRectLeft);
rightMsgs[0] = cv_bridge::toCvShare(imageRectRight);
try{
leftMsgs[0] = cv_bridge::toCvShare(imageRectLeft);
rightMsgs[0] = cv_bridge::toCvShare(imageRectRight);
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting images (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
leftInfoMsgs.push_back(*cameraInfoLeft);
rightInfoMsgs.push_back(*cameraInfoRight);
+8 -2
View File
@@ -215,8 +215,14 @@ void RGBDSync::callback(
cv::Mat rgbMat;
cv::Mat depthMat;
cv_bridge::CvImageConstPtr imagePtr = cv_bridge::toCvShare(image);
cv_bridge::CvImageConstPtr imageDepthPtr = cv_bridge::toCvShare(depth);
cv_bridge::CvImageConstPtr imagePtr, imageDepthPtr;
try {
imagePtr = cv_bridge::toCvShare(image);
imageDepthPtr = cv_bridge::toCvShare(depth);
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting images (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
rgbMat = imagePtr->image;
depthMat = imageDepthPtr->image;
+14 -2
View File
@@ -185,10 +185,22 @@ void StereoSync::callback(
rtabmap_msgs::msg::RGBDImage::UniquePtr msgCompressed(new rtabmap_msgs::msg::RGBDImage);
*msgCompressed = *msg;
cv_bridge::CvImageConstPtr imagePtr = cv_bridge::toCvShare(imageLeft);
cv_bridge::CvImageConstPtr imagePtr;
try {
imagePtr = cv_bridge::toCvShare(imageLeft);
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting left image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
imagePtr->toCompressedImageMsg(msgCompressed->rgb_compressed, cv_bridge::JPG);
cv_bridge::CvImageConstPtr imageDepthPtr = cv_bridge::toCvShare(imageRight);
cv_bridge::CvImageConstPtr imageDepthPtr;
try {
imageDepthPtr = cv_bridge::toCvShare(imageRight);
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting right image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
imageDepthPtr->toCompressedImageMsg(msgCompressed->depth_compressed, cv_bridge::JPG);
rgbdImageCompressedPub_->publish(std::move(msgCompressed));
@@ -189,7 +189,13 @@ void PointCloudXYZ::callback(
{
rclcpp::Time time = now();
cv_bridge::CvImageConstPtr imageDepthPtr = cv_bridge::toCvShare(depthMsg);
cv_bridge::CvImageConstPtr imageDepthPtr;
try{
imageDepthPtr = cv_bridge::toCvShare(depthMsg);
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting depth image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
rtabmap::CameraModel model = rtabmap_conversions::cameraModelFromROS(*cameraInfo);
@@ -240,21 +240,32 @@ void PointCloudXYZRGB::depthCallback(
rclcpp::Time time = now();
cv_bridge::CvImageConstPtr imagePtr;
if(image->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0)
{
imagePtr = cv_bridge::toCvShare(image);
try {
if(image->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0)
{
imagePtr = cv_bridge::toCvShare(image);
}
else if(image->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
image->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
imagePtr = cv_bridge::toCvShare(image, "mono8");
}
else
{
imagePtr = cv_bridge::toCvShare(image, "bgr8");
}
}
else if(image->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
image->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
imagePtr = cv_bridge::toCvShare(image, "mono8");
}
else
{
imagePtr = cv_bridge::toCvShare(image, "bgr8");
catch(cv::Exception& e) {
UFATAL("Fatal error while converting RGB image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
cv_bridge::CvImageConstPtr imageDepthPtr = cv_bridge::toCvShare(imageDepth);
cv_bridge::CvImageConstPtr imageDepthPtr;
try {
imageDepthPtr = cv_bridge::toCvShare(imageDepth);
}
catch(cv::Exception& e) {
UFATAL("Fatal error while converting Depth image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
rtabmap::CameraModel model = rtabmap_conversions::cameraModelFromROS(*cameraInfo);
@@ -318,18 +329,24 @@ void PointCloudXYZRGB::disparityCallback(
const sensor_msgs::msg::CameraInfo::ConstSharedPtr cameraInfo)
{
cv_bridge::CvImageConstPtr imagePtr;
if(image->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0)
{
imagePtr = cv_bridge::toCvShare(image);
try {
if(image->encoding.compare(sensor_msgs::image_encodings::TYPE_8UC1)==0)
{
imagePtr = cv_bridge::toCvShare(image);
}
else if(image->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
image->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
imagePtr = cv_bridge::toCvShare(image, "mono8");
}
else
{
imagePtr = cv_bridge::toCvShare(image, "bgr8");
}
}
else if(image->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
image->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
imagePtr = cv_bridge::toCvShare(image, "mono8");
}
else
{
imagePtr = cv_bridge::toCvShare(image, "bgr8");
catch(cv::Exception& e) {
UFATAL("Fatal error while converting RGB image (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
return;
}
if(imageDisparity->image.encoding.compare(sensor_msgs::image_encodings::TYPE_32FC1) !=0 &&
@@ -404,16 +421,21 @@ void PointCloudXYZRGB::stereoCallback(
rclcpp::Time time = now();
cv_bridge::CvImageConstPtr ptrLeftImage, ptrRightImage;
if(imageLeft->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
imageLeft->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
ptrLeftImage = cv_bridge::toCvShare(imageLeft, "mono8");
try {
if(imageLeft->encoding.compare(sensor_msgs::image_encodings::MONO8) == 0 ||
imageLeft->encoding.compare(sensor_msgs::image_encodings::MONO16) == 0)
{
ptrLeftImage = cv_bridge::toCvShare(imageLeft, "mono8");
}
else
{
ptrLeftImage = cv_bridge::toCvShare(imageLeft, "bgr8");
}
ptrRightImage = cv_bridge::toCvShare(imageRight, "mono8");
}
else
{
ptrLeftImage = cv_bridge::toCvShare(imageLeft, "bgr8");
catch(cv::Exception& e) {
UFATAL("Fatal error converting images (do you have multiple opencv versions? if so, make sure cv_bridge is loading the right opencv libraries on runtime): %s", e.what());
}
ptrRightImage = cv_bridge::toCvShare(imageRight, "mono8");
if(roiRatios_[0]!=0.0f || roiRatios_[1]!=0.0f || roiRatios_[2]!=0.0f || roiRatios_[3]!=0.0f)
{