ros 到 opencv 图像转换器中的未定义引用错误

Undefined Reference errors in ros to opencv image converter

我正在尝试执行 ros_wiki tutorial 将 ROS 图像转换为 OpenCV 图像,但是当我尝试编译我的 catkin 工作区时,我收到几页错误,它们都具有以下形式:

CMakeFiles/image_converter.dir/scripts/image_converter.cpp.o: In function `cv::String::~String()':
image_converter.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'

我在谷歌上搜索了很多,发现了各种类似的问题,但这些问题都通过更新 CMakeLists.txt 文件和 package.xml 文件得到了解决,这对我不起作用。

Here 就是这样一种解决方案的示例 - 它们都以

为中心
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries( your_target ${OpenCV_LIBS} )

在 cmakelists 中,但我已经有了。

我的 C++ 代码:

#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
#include <iostream>

const std::string wn = "OCV_window";

class ImageConverter
{
    ros::NodeHandle nh_;
    image_transport::ImageTransport it_;
    image_transport::Subscriber image_sub_;
    image_transport::Publisher image_pub_;

    public:
    ImageConverter()
        : it_(nh_)
    {
        image_sub_ = it_.subscribe("/camera/color/image_raw", 1, &ImageConverter::imageCb, this);
        image_pub_ = it_.advertise("/image_editor/output_image", 1);

        cv::namedWindow(wn);
    }

    ~ImageConverter()
    {
        cv::destroyWindow(wn);
    }

    void imageCb(const sensor_msgs::ImageConstPtr& incoming_message)
    {
        cv_bridge::CvImagePtr cvi;
        try
        {
            cvi = cv_bridge::toCvCopy(incoming_message, sensor_msgs::image_encodings::RGB8);
        }
        catch (cv_bridge::Exception& e)
        {
            ROS_ERROR("CV_Bridge Exception: %s", e.what());
            return;
        }

        cv::imshow(wn, cvi->image);
        cv::waitKey(3);

        image_pub_.publish(cvi->toImageMsg());

    }

};

int main(int argc, char** argv)
{
    ros::init(argc,argv, "Image_Converter");
    ImageConverter ic;
    ros::spin();
    return(0);
}

我的 cmakelists 文件:

cmake_minimum_required(VERSION 2.8.3)
project(odom_reporter)

add_compile_options(-std=c++11)

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  nav_msgs
  roscpp
  rospy
  std_msgs
  message_generation
  image_transport
  cv_bridge 
  sensor_msgs
  OpenCV REQUIRED
)

 add_service_files(
   FILES
   HMD.srv
 )

catkin_package()

include_directories(
  ${OpenCV_INCLUDE_DIRS}
  ${catkin_INCLUDE_DIRS}
)

add_executable (image_converter scripts/image_converter.cpp)

target_link_libraries (image_converter ${OpenCV_LIBS})

我的 package.xml 文件:

<?xml version="1.0"?>
<package format="2">
  <name>odom_reporter</name>
  <version>0.0.0</version>
  <description>The odom_reporter package</description>

  <maintainer email="calabrnb@mail.uc.edu">Nate Calabrese</maintainer>

  <license>BSD</license>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>geometry_msgs</build_depend>
  <build_depend>nav_msgs</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>message_generation</build_depend>
  <build_depend>image_transport</build_depend>
  <build_depend>cv_bridge</build_depend>
  <build_depend>sensor_msgs</build_depend>
  <build_depend>OpenCV</build_depend>
  <build_export_depend>geometry_msgs</build_export_depend>
  <build_export_depend>nav_msgs</build_export_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <build_export_depend>message_runtime</build_export_depend>
  <build_export_depend>image_transport</build_export_depend>
  <build_export_depend>cv_bridge</build_export_depend>
  <build_export_depend>sensor_msgs</build_export_depend>
  <build_export_depend>OpenCV</build_export_depend>
  <exec_depend>geometry_msgs</exec_depend>
  <exec_depend>nav_msgs</exec_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>message_runtime</exec_depend>
  <exec_depend>image_transport</exec_depend>
  <exec_depend>cv_bridge</exec_depend>
  <exec_depend>sensor_msgs</exec_depend>
  <exec_depend>OpenCV</exec_depend>

  <export>

  </export>
</package>

应该可以,但是有一个问题:find_package()每次调用只支持查找一个包。

您目前正在尝试用它查找两个软件包,但没有找到第二个 OpenCV:

find_package(catkin REQUIRED COMPONENTS
    image_transport
    cv_bridge
    ...
)
find_package(OpenCV REQUIRED)
find_package(<package> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])