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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

2929閲覧

Ubuntu環境下でビルドエラーが発生してしまう

si03

総合スコア1

OpenCV

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2021/07/01 05:11

前提・実現したいこと

intel realsense D435iを用いて、ROSで下記のsave_pcd.cppを使用しRGB画像とPCD画像の取得をしたいと思っています。

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

catkin_ws上で下記のプログラム(save_pcd.cpp)を含めた状態でcatkin_makeを行ったところ以下のようなエラーが発生してしまっています。

CMakeFiles/save_pcd.dir/src/save_pcd.cpp.o: 関数 `SavePCD::image_cb(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&)' 内: save_pcd.cpp:(.text._ZN7SavePCD8image_cbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE[_ZN7SavePCD8image_cbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE]+0x180): `cv::imshow(cv::String const&, cv::_InputArray const&)' に対する定義されていない参照です save_pcd.cpp:(.text._ZN7SavePCD8image_cbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE[_ZN7SavePCD8image_cbERKN5boost10shared_ptrIKN11sensor_msgs6Image_ISaIvEEEEE]+0x1a8): `cv::waitKey(int)' に対する定義されていない参照です collect2: error: ld returned 1 exit status realsense/CMakeFiles/save_pcd.dir/build.make:316: ターゲット '/home/student/catkin_ws/devel/lib/realsense/save_pcd' のレシピで失敗しました make[2]: *** [/home/user/catkin_ws/devel/lib/realsense/save_pcd] エラー 1 CMakeFiles/Makefile2:1978: ターゲット 'realsense/CMakeFiles/save_pcd.dir/all' のレシピで失敗しました make[1]: *** [realsense/CMakeFiles/save_pcd.dir/all] エラー 2 Makefile:138: ターゲット 'all' のレシピで失敗しました make: *** [all] エラー 2 Invoking "make -j4 -l4" failed

save_pcd.cpp

c++

1#include <ros/ros.h> 2#include <cv_bridge/cv_bridge.h> 3#include <opencv2/highgui/highgui.hpp> 4#include <pcl_ros/io/pcd_io.h> 5#include <sensor_msgs/image_encodings.h> 6 7 8int n = -1; 9 10 11class SavePCD { 12private: 13 ros::NodeHandle _nh; 14 ros::Subscriber _sub1, _sub2; 15 pcl::PointCloud<pcl::PointXYZRGB> input_cloud; 16 int save_count; 17 18public: 19 SavePCD() : save_count(0) { 20 //* subscribe ROS topics 21 _sub1 = _nh.subscribe ("/camera/color/image_raw", 1, &SavePCD::image_cb, this); 22 ROS_INFO ("Listening for incoming data on topic /camera/rgb/image_color ..." ); 23 _sub2 = _nh.subscribe ("/camera/depth_registered/points", 1, &SavePCD::points_cb, this); 24 ROS_INFO ("Listening for incoming data on topic /camera/depth_registered/points ..." ); 25 } 26 ~SavePCD() {} 27 28 //* get points 29 void points_cb( const sensor_msgs::PointCloud2ConstPtr& cloud ){ 30 if ((cloud->width * cloud->height) == 0) 31 return; 32 pcl::fromROSMsg (*cloud, input_cloud); 33 34 //*rotated_cloud = rotation_x(input_cloud, 180);//回転 35 //pcl::fromROSMsg (*rotated_cloud, input_cloud); 36 } 37 38 //* show color img and save color img + point cloud 39 void image_cb( const sensor_msgs::ImageConstPtr& msg ){ 40 cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg); 41 42 //* show color img 43 cv::Mat color_img = cv_ptr->image; 44 std::cout << "Scene total points: " << color_img.size << "; Selected Keypoints: " << std::endl; 45 cv::cvtColor(color_img, color_img, cv::COLOR_BGR2RGB); 46 cv::imshow( "color image", color_img ); 47 cv::waitKey(10); 48 49 if ((input_cloud.width * input_cloud.height) == 0) 50 return; 51 52 53 54 std::stringstream filename1; 55 filename1 << save_count << ".png"; 56 cv::imwrite( filename1.str(), color_img ); 57 std::cout << filename1.str() << " saved." << std::endl; 58 59 std::stringstream filename2; 60 filename2 << save_count << ".pcd"; 61 pcl::io::savePCDFileBinary( filename2.str(), input_cloud ); 62 std::cout << filename2.str() << " saved." << std::endl; 63 usleep( 300000 ); 64 save_count++; 65 n++; 66 67 } 68 69}; 70 71 //rotate 72 pcl::PointCloud<pcl::PointXYZRGB> rotation_x(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud, double theta)///rotate point cloud by Y axiz 73{ 74 75 76 Eigen::Matrix3f rot_x; 77 pcl::PointCloud<pcl::PointXYZRGB> cloud_out; 78 cloud_out = *cloud; 79 double theta_x = theta * 3.1415926 / 180.0;//角度の変換 80 rot_x(0,0) = 1.0; 81 rot_x(1,0) = 0.0; 82 rot_x(2,0) = 0.0; 83 //rot_x(3,0) = 0.0; 84 rot_x(0,1) = 0.0; 85 rot_x(1,1) = cos(theta_x); 86 rot_x(2,1) = -sin(theta_x); 87 //rot_x(3,1) = 0.0; 88 rot_x(0,2) = 0.0; 89 rot_x(1,2) = sin(theta_x); 90 rot_x(2,2) = cos(theta_x); 91 //rot_x(3,2) = 0.0; 92 //rot_x(0,3) = 0.0; 93 //rot_x(1,3) = 0.0; 94 //rot_x(2,3) = 0.0; 95 //rot_x(3,3) = 1.0; 96 97 for(size_t i = 0; i < cloud->points.size(); ++i){ 98 cloud_out.points[i].x = rot_x(0,0) * cloud->points[i].x + rot_x(0,1) * cloud->points[i].y + rot_x(0,2) * cloud->points[i].z ; 99 cloud_out.points[i].y = (rot_x(1,0) * cloud->points[i].x + rot_x(1,1) * cloud->points[i].y + rot_x(1,2) * cloud->points[i].z)*1 ; 100 cloud_out.points[i].z = (rot_x(2,0) * cloud->points[i].x + rot_x(2,1) * cloud->points[i].y + rot_x(2,2) * cloud->points[i].z)*1 ; 101 } 102 103 return cloud_out; 104} 105 106int main( int argc, char** argv ){ 107 108 ros::init(argc,argv,"save_pcd"); 109 SavePCD spcd; 110 ros::spin(); 111 112 //realsensence用 上下反転 113 std::stringstream readname; 114 readname << n << ".pcd"; 115 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 116 pcl::io::loadPCDFile (readname.str(), *cloud); 117 std::cout << readname.str() << " read." << std::endl; 118 pcl::PointCloud<pcl::PointXYZRGB>::Ptr rotated_cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 119 *rotated_cloud = rotation_x(cloud, 0); 120 pcl::io::savePCDFileBinary("e.pcd", *rotated_cloud); 121 122 return 0; 123} 124

###Cmakelists.txt

Cmakelists

1cmake_minimum_required(VERSION 3.0.2) 2project(realsense) 3 4find_package(catkin REQUIRED COMPONENTS 5 cv_bridge 6 pcl_ros 7 roscpp 8) 9find_package(OpenCV REQUIRED) 10 11include 12 ${catkin_INCLUDE_DIRS} 13 ${OpenCV_INCLUDE_DIRS} 14) 15 16add_executable(save_pcd src/save_pcd.cpp) 17 18 target_link_libraries(save_pcd 19 ${catkin_LIBRARIES} 20 ${OpenCV_LIBRSRIES} 21 ) 22 23

###package.xml

package

1<?xml version="1.0"?> 2<package format="2"> 3 <name>realsense</name> 4 <version>0.0.0</version> 5 <description>The realsense package</description> 6 7 <!-- One maintainer tag required, multiple allowed, one person per tag --> 8 <!-- Example: --> 9 <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> 10 <maintainer email="user@todo.todo">user</maintainer> 11 12 13 <!-- One license tag required, multiple allowed, one license per tag --> 14 <!-- Commonly used license strings: --> 15 <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> 16 <license>TODO</license> 17 18 19 <!-- Url tags are optional, but multiple are allowed, one per tag --> 20 <!-- Optional attribute type can be: website, bugtracker, or repository --> 21 <!-- Example: --> 22 <!-- <url type="website">http://wiki.ros.org/realsense</url> --> 23 24 25 <!-- Author tags are optional, multiple are allowed, one per tag --> 26 <!-- Authors do not have to be maintainers, but could be --> 27 <!-- Example: --> 28 <!-- <author email="jane.doe@example.com">Jane Doe</author> --> 29 30 31 <!-- The *depend tags are used to specify dependencies --> 32 <!-- Dependencies can be catkin packages or system dependencies --> 33 <!-- Examples: --> 34 <!-- Use depend as a shortcut for packages that are both build and exec dependencies --> 35 <!-- <depend>roscpp</depend> --> 36 <!-- Note that this is equivalent to the following: --> 37 <!-- <build_depend>roscpp</build_depend> --> 38 <!-- <exec_depend>roscpp</exec_depend> --> 39 <!-- Use build_depend for packages you need at compile time: --> 40 <!-- <build_depend>message_generation</build_depend> --> 41 <!-- Use build_export_depend for packages you need in order to build against this package: --> 42 <!-- <build_export_depend>message_generation</build_export_depend> --> 43 <!-- Use buildtool_depend for build tool packages: --> 44 <!-- <buildtool_depend>catkin</buildtool_depend> --> 45 <!-- Use exec_depend for packages you need at runtime: --> 46 <!-- <exec_depend>message_runtime</exec_depend> --> 47 <!-- Use test_depend for packages you need only for testing: --> 48 <!-- <test_depend>gtest</test_depend> --> 49 <!-- Use doc_depend for packages you need only for building documentation: --> 50 <!-- <doc_depend>doxygen</doc_depend> --> 51 <buildtool_depend>catkin</buildtool_depend> 52 <build_depend>cv_bridge</build_depend> 53 <build_depend>pcl_ros</build_depend> 54 <build_depend>roscpp</build_depend> 55 <build_export_depend>cv_bridge</build_export_depend> 56 <build_export_depend>pcl_ros</build_export_depend> 57 <build_export_depend>roscpp</build_export_depend> 58 <exec_depend>cv_bridge</exec_depend> 59 <exec_depend>pcl_ros</exec_depend> 60 <exec_depend>roscpp</exec_depend> 61 <build_depend>opencv2</build_depend> 62 <exec_depend>opencv2</exec_depend> 63 64 65 <!-- The export tag contains other, unspecified, tags --> 66 <export> 67 <!-- Other tools can request additional information be placed here --> 68 69 </export> 70</package>

いろいろと個人的に調べてみたのですが、なかなか解決できないので質問させていただきました。
pythonの経験は少しありますが、c++やopencvの経験はない初心者です。
また、こういったことを質問するは初めてなので質問内容などわかりにくい部分をあると思いますが、よろしくお願いいたします。

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

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

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

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

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

itagagaki

2021/07/01 07:08

${OpenCV_LIBRSRIES} の実際の値が何になっているのかが気になりますね。
si03

2021/07/01 08:23

無知で申し訳ないのですが、実際の値とはどういう意味でしょうか?
guest

回答1

0

ベストアンサー

OpenCV_LIBRSRIES ではなく OpenCV_LIBRARIES では

投稿2021/07/01 12:44

編集2021/07/01 12:45
yuki23

総合スコア1448

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

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

si03

2021/07/02 01:47

回答ありがとうございます。 誤字でのエラーでした。 恥ずかしい限りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問