質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

ROS上でC++とOpenCVのコンパイルエラーを解決したい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 565

syo_fr

score 4

ROS上でC++でOpenCVを使おうとしていますが、コンパイルがうまくできません。環境はUbuntu16.04です。原因を教えていただけると恐縮です

発生している問題・エラーメッセージ

shogo@shogo-virtual-machine:~/catkin_ws$ catkin_make
Base path: /home/shogo/catkin_ws
Source space: /home/shogo/catkin_ws/src
Build space: /home/shogo/catkin_ws/build
Devel space: /home/shogo/catkin_ws/devel
Install space: /home/shogo/catkin_ws/install
####
#### Running command: "make cmake_check_build_system" in "/home/shogo/catkin_ws/build"
####
####
#### Running command: "make -j1 -l1" in "/home/shogo/catkin_ws/build"
####
[ 50%] Built target test_opencv
[ 75%] Linking CXX executable /home/shogo/catkin_ws/devel/lib/test_opencv/opencv_ros
CMakeFiles/opencv_ros.dir/src/opencv_ros.cpp.o: 関数 `ImageConverter::ImageConverter(ros::NodeHandle&)' 内:
opencv_ros.cpp:(.text._ZN14ImageConverterC2ERN3ros10NodeHandleE[_ZN14ImageConverterC5ERN3ros10NodeHandleE]+0xdd): `image_transport::ImageTransport::ImageTransport(ros::NodeHandle const&)' に対する定義されていない参照です
opencv_ros.cpp:(.text._ZN14ImageConverterC2ERN3ros10NodeHandleE[_ZN14ImageConverterC5ERN3ros10NodeHandleE]+0x383): `image_transport::ImageTransport::advertise(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, bool)' に対する定義されていない参照です
opencv_ros.cpp:(.text._ZN14ImageConverterC2ERN3ros10NodeHandleE[_ZN14ImageConverterC5ERN3ros10NodeHandleE]+0x422): `image_transport::ImageTransport::advertise(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, bool)' に対する定義されていない参照です
opencv_ros.cpp:(.text._ZN14ImageConverterC2ERN3ros10NodeHandleE[_ZN14ImageConverterC5ERN3ros10NodeHandleE]+0x4b5): `image_transport::ImageTransport::~ImageTransport()' に対する定義されていない参照です
opencv_ros.cpp:(.text._ZN14ImageConverterC2ERN3ros10NodeHandleE[_ZN14ImageConverterC5ERN3ros10NodeHandleE]+0x681): `image_transport::ImageTransport::~ImageTransport()' に対する定義されていない参照です
CMakeFiles/opencv_ros.dir/src/opencv_ros.cpp.o: 関数 `ImageConverter::publishReadImage()' 内:
opencv_ros.cpp:(.text._ZN14ImageConverter16publishReadImageEv[_ZN14ImageConverter16publishReadImageEv]+0x168): `cv_bridge::CvImage::toImageMsg() const' に対する定義されていない参照です
opencv_ros.cpp:(.text._ZN14ImageConverter16publishReadImageEv[_ZN14ImageConverter16publishReadImageEv]+0x1e6): `image_transport::Publisher::publish(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&) const' に対する定義されていない参照です
CMakeFiles/opencv_ros.dir/src/opencv_ros.cpp.o: 関数 `ImageConverter::imageCb(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&)' 内:
opencv_ros.cpp:(.text._ZN14ImageConverter7imageCbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE[_ZN14ImageConverter7imageCbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE]+0x52): `cv_bridge::toCvCopy(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' に対する定義されていない参照です
opencv_ros.cpp:(.text._ZN14ImageConverter7imageCbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE[_ZN14ImageConverter7imageCbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE]+0x24e): `cv_bridge::CvImage::toImageMsg() const' に対する定義されていない参照です
opencv_ros.cpp:(.text._ZN14ImageConverter7imageCbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE[_ZN14ImageConverter7imageCbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE]+0x28a): `image_transport::Publisher::publish(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&) const' に対する定義されていない参照です
CMakeFiles/opencv_ros.dir/src/opencv_ros.cpp.o: 関数 `image_transport::Subscriber image_transport::ImageTransport::subscribe<ImageConverter>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, void (ImageConverter::*)(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&), ImageConverter*, image_transport::TransportHints const&)' 内:
opencv_ros.cpp:(.text._ZN15image_transport14ImageTransport9subscribeI14ImageConverterEENS_10SubscriberERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjMT_FvRKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEEEPSC_RKNS_14TransportHintsE[_ZN15image_transport14ImageTransport9subscribeI14ImageConverterEENS_10SubscriberERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjMT_FvRKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEEEPSC_RKNS_14TransportHintsE]+0xdd): `image_transport::ImageTransport::subscribe(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, boost::function<void (boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&)> const&, boost::shared_ptr<void> const&, image_transport::TransportHints const&)' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
test_opencv/CMakeFiles/opencv_ros.dir/build.make:163: ターゲット '/home/shogo/catkin_ws/devel/lib/test_opencv/opencv_ros' のレシピで失敗しました
make[2]: *** [/home/shogo/catkin_ws/devel/lib/test_opencv/opencv_ros] エラー 1
CMakeFiles/Makefile2:914: ターゲット 'test_opencv/CMakeFiles/opencv_ros.dir/all' のレシピで失敗しました
make[1]: *** [test_opencv/CMakeFiles/opencv_ros.dir/all] エラー 2
Makefile:138: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2
Invoking "make -j1 -l1" failed

該当のソースコード

#include <time.h>
#include <ros/ros.h>
#include <ros/package.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

const std::string OPENCV_WINDOW = "ImageWindow";

class ImageConverter
{
    ros::NodeHandle nh_;
    image_transport::Subscriber image_sub_;
    image_transport::Publisher image_pub_ori_;
    image_transport::Publisher image_pub_drawn_;

public:
    ImageConverter(ros::NodeHandle& nh)
    {
        // Subscribe to input video feed and publish output video feed
        image_transport::ImageTransport it(nh);
        image_sub_ = it.subscribe("/camera/image_raw", 1,
                &ImageConverter::imageCb, this);
        image_pub_ori_ = it.advertise("/camera/image_raw", 1);
        image_pub_drawn_ = it.advertise("/image_converter/output_video", 1);

        cv::namedWindow(OPENCV_WINDOW, CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_NORMAL);
    };

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

    void publishReadImage(void)
    {
        std::string file_path = ros::package::getPath("test_opencv") + "/img/image1.jpg";
        cv::Mat color_image = cv::imread(file_path, cv::IMREAD_COLOR);
        sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", color_image).toImageMsg();
        image_pub_ori_.publish(msg);
    };

    void imageCb(const sensor_msgs::ImageConstPtr& msg)
    {
        cv_bridge::CvImagePtr cv_ptr;
        cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);

        //円の描画
        cv::RNG rng(clock());
        int circle_r = 20;
        int rand_x = (int)rng.uniform(0, cv_ptr->image.cols - circle_r*2);
        int rand_y = (int)rng.uniform(0, cv_ptr->image.rows - circle_r*2);
        cv::circle(cv_ptr->image, cv::Point(rand_x, rand_y), circle_r, CV_RGB(255, 0, 0), -1);

        // GUI ウインドウのアップデート
        cv::imshow(OPENCV_WINDOW, cv_ptr->image);

        //結果の描画
        image_pub_drawn_.publish(cv_ptr->toImageMsg());
    };
};

int main(int argc, char** argv)
{
    ros::init(argc, argv, "opencv_ros");
    ros::NodeHandle nh;
    ImageConverter ic(nh);

    ros::Rate looprate (5);   // read image at 5Hz
    while (ros::ok())
    {
        if (cv::waitKey(1) == 'q')
            break;

        ic.publishReadImage();
        ros::spinOnce();
        looprate.sleep();
    }
    return 0;
}

試したこと

Cmakeでコンパイルをしようとしましたがうまくいきませんでした
CmakeListsも載せておきます

cmake_minimum_required(VERSION 2.8.3)
project(test_opencv)

find_package(catkin REQUIRED COMPONENTS
  cv_bridge image_transport roscpp rospy sensor_msgs std_msgs
)

find_package(OpenCV REQUIRED)

catkin_package(
  INCLUDE_DIRS 
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS cv_bridge image_transport roscpp rospy sensor_msgs std_msgs
  DEPENDS
)

include_directories(include ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})

add_executable(test_opencv src/test_opencv.cpp)
target_link_libraries(test_opencv ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

add_executable(opencv_ros src/opencv_ros.cpp)
target_link_libraries(opencv_ros ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

add_executable(test_get_input src/test_get_input.cpp)
target_link_libraries(test_get_input ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

add_executable(test_edge_detection src/test_edge_detection.cpp)
target_link_libraries(test_edge_detection ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

add_executable(test_feature_detection src/test_feature_detection.cpp)
target_link_libraries(test_feature_detection ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

add_executable(test_feature_detection_matching src/test_feature_detection_matching.cpp)
target_link_libraries(test_feature_detection_matching ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

add_executable(test_svm src/test_svm.cpp)
target_link_libraries(test_svm ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

#############
## Install ##
#############
foreach(dir launch img rviz)
  install(DIRECTORY ${dir}/
    DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/${dir})
endforeach(dir)


#############
## Testing ##
#############
if (CATKIN_ENABLE_TESTING)
  find_package(roslaunch REQUIRED)
  roslaunch_add_file_check(launch)
endif()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る