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

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

2910閲覧

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

syo_fr

総合スコア4

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/09 06:43

編集2020/01/09 06:48

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

該当のソースコード

C++

1#include <time.h> 2#include <ros/ros.h> 3#include <ros/package.h> 4#include <image_transport/image_transport.h> 5#include <sensor_msgs/image_encodings.h> 6#include <cv_bridge/cv_bridge.h> 7#include <opencv2/imgproc/imgproc.hpp> 8#include <opencv2/highgui/highgui.hpp> 9 10const std::string OPENCV_WINDOW = "ImageWindow"; 11 12class ImageConverter 13{ 14 ros::NodeHandle nh_; 15 image_transport::Subscriber image_sub_; 16 image_transport::Publisher image_pub_ori_; 17 image_transport::Publisher image_pub_drawn_; 18 19public: 20 ImageConverter(ros::NodeHandle& nh) 21 { 22 // Subscribe to input video feed and publish output video feed 23 image_transport::ImageTransport it(nh); 24 image_sub_ = it.subscribe("/camera/image_raw", 1, 25 &ImageConverter::imageCb, this); 26 image_pub_ori_ = it.advertise("/camera/image_raw", 1); 27 image_pub_drawn_ = it.advertise("/image_converter/output_video", 1); 28 29 cv::namedWindow(OPENCV_WINDOW, CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_NORMAL); 30 }; 31 32 ~ImageConverter() 33 { 34 cv::destroyWindow(OPENCV_WINDOW); 35 }; 36 37 void publishReadImage(void) 38 { 39 std::string file_path = ros::package::getPath("test_opencv") + "/img/image1.jpg"; 40 cv::Mat color_image = cv::imread(file_path, cv::IMREAD_COLOR); 41 sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", color_image).toImageMsg(); 42 image_pub_ori_.publish(msg); 43 }; 44 45 void imageCb(const sensor_msgs::ImageConstPtr& msg) 46 { 47 cv_bridge::CvImagePtr cv_ptr; 48 cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); 49 50 //円の描画 51 cv::RNG rng(clock()); 52 int circle_r = 20; 53 int rand_x = (int)rng.uniform(0, cv_ptr->image.cols - circle_r*2); 54 int rand_y = (int)rng.uniform(0, cv_ptr->image.rows - circle_r*2); 55 cv::circle(cv_ptr->image, cv::Point(rand_x, rand_y), circle_r, CV_RGB(255, 0, 0), -1); 56 57 // GUI ウインドウのアップデート 58 cv::imshow(OPENCV_WINDOW, cv_ptr->image); 59 60 //結果の描画 61 image_pub_drawn_.publish(cv_ptr->toImageMsg()); 62 }; 63}; 64 65int main(int argc, char** argv) 66{ 67 ros::init(argc, argv, "opencv_ros"); 68 ros::NodeHandle nh; 69 ImageConverter ic(nh); 70 71 ros::Rate looprate (5); // read image at 5Hz 72 while (ros::ok()) 73 { 74 if (cv::waitKey(1) == 'q') 75 break; 76 77 ic.publishReadImage(); 78 ros::spinOnce(); 79 looprate.sleep(); 80 } 81 return 0; 82}

試したこと

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問