ROS中未定义的参考误差到OpenCV图像转换器

Undefined Reference errors in ros to opencv image converter

本文关键字:OpenCV 图像 转换器 误差 参考 未定义 ROS      更新时间:2023-10-16

我正在尝试执行ROS_WIKI教程将ROS Images转换为OpenCV映像,但是当我尝试编译我的Catkin工作空间时,我会收到几页错误,这些错误都具有以下形式:<<<<<</p>

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文件来解决的,这对我不起作用。

这是一个这样一种解决方案的示例 - 它们都在周围中心,包括

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})

我的软件包.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])