构建错误:未定义对"cv_bridge::CvImage::toImageMsg() const"的引用

Build error : undefined reference to `cv_bridge::CvImage::toImageMsg() const'

本文关键字:toImageMsg const 引用 CvImage 未定义 错误 cv 构建 bridge      更新时间:2023-10-16

我正在使用ROS动力学,并尝试编写一个可以读取两个视频并将其发布在两个不同主题上的程序。但是我认为我在链接OpenCV库时犯了一些错误。我遇到以下错误。

CMakeFiles/src.dir/src/src.cpp.o: In function `main':
src.cpp:(.text+0x3fd): undefined reference to `cv_bridge::CvImage::toImageMsg() const'
src.cpp:(.text+0x56d): undefined reference to `cv_bridge::CvImage::toImageMsg() const'
collect2: error: ld returned 1 exit status
MultiCamImages/CMakeFiles/src.dir/build.make:165: recipe for target 'MultiCamImages/src' failed
make[2]: *** [MultiCamImages/src] Error 1
CMakeFiles/Makefile2:1089: recipe for target 'MultiCamImages/CMakeFiles/src.dir/all' failed
make[1]: *** [MultiCamImages/CMakeFiles/src.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j4 -l4" failed

这是我的源文件:

#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char** argv){
    ros::init(argc, argv, "PublishMultiCamImages");
    ros::NodeHandle nh;
    image_transport::ImageTransport it(nh);
    image_transport::Publisher pub1 = it.advertise("/camera/image_raw1", 1);
    image_transport::Publisher pub2 = it.advertise("/camera/image_raw2", 1);
    cv::Mat im;
    cv::String Path1("/home/akanksha/COSLAM_Dataset/EA-01/grayscale/*.jpg");
    cv::String Path2("/home/akanksha/COSLAM_Dataset/EA-02/grayscale/*.jpg");
    //time = ros::Time::now();
    vector<cv::String> fn1;
    vector<cv::String> fn2;
    cv::glob(Path1,fn1, true); // recurse
    cv::glob(Path2,fn2, true);
    ros::Rate r(50);
    int l1 = fn1.size();
    int l2 = fn2.size();
    int count1 = 0, count2 = 0;
    bool flag;
    while(ros::ok()){
        flag = true;
        if(count1 < l1){
            cv::Mat image1 = cv::imread(fn1[count1]);
            sensor_msgs::ImagePtr msg1 = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image1).toImageMsg();
            pub1.publish(msg1);
            count1++;
            flag = false;
        }
        if(count2 < l2){
            cv::Mat image2 = cv::imread(fn2[count2]);
            sensor_msgs::ImagePtr msg2 = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image2).toImageMsg();
            pub2.publish(msg2);
            count2++;
            flag = false;
        }
        if(flag)
            break;
        r.sleep();
    }
    ros::shutdown();
    return 0;

}

这是我的cmakelists.txt

cmake_minimum_required(VERSION 2.8.3)
project(MultiCamImages)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  image_transport
  OpenCV
)
# find_package(OpenCV REQUIRED)
set(OpenCV_LIBS opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect)
add_executable(src src/src.cpp)
target_link_libraries(src ${catkin_LIBRARIES} ${OpenCV_LIBS})
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES MultiCamImages
#  CATKIN_DEPENDS roscpp
#  DEPENDS system_lib
)
include_directories(
  ${catkin_INCLUDE_DIRS}
)

这是我的pakage.xml

<?xml version="1.0"?>
<package>
  <name>MultiCamImages</name>
  <version>0.0.0</version>
  <description>The MultiCamImages package</description>
  <maintainer email="akanksha@todo.todo">akanksha</maintainer>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <run_depend>roscpp</run_depend>
  <build_depend>sensor_msgs</build_depend>
  <run_depend>sensor_msgs</run_depend>
  <build_depend>cv_bridge</build_depend>
  <run_depend>cv_bridge</run_depend>
</package>

如果您可以指出问题,那将是一个很大的帮助。谢谢!

看起来您看起来并不像链接CMAKE文件中的CV_Bridge。也许您想要这个:

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  roscpp
  image_transport
  OpenCV
)

实际上,约瑟夫使用openCV库进行链接的方式是不正确的,因为OpenCV不属于CV_Bridge的ROS的标准软件包。在这种情况下,您需要单独使用find_package作为OPENCV,就像这样的Boost:

find_package(OpenCV REQUIRED)
# Or you may add specific major portion of OpenCV version, e.g., OpenCV3
find_package(OpenCV 3 REQUIRED)