Image subscribe and callback error
阿新 • • 發佈:2018-12-11
Scanning dependencies of target image_listen_node [ 62%] Built target imu_subscribe_node [ 50%] Building CXX object image_listen/CMakeFiles/image_listen_node.dir/src/rgb_listener.cpp.o [ 62%] Built target laser_subscribe_node [ 87%] Built target laser_avoid_node [100%] Linking CXX executable /home/nvidia/tutorial_subscriber/devel/lib/image_listen/image_listen_node CMakeFiles/image_listen_node.dir/src/rgb_listener.cpp.o: In function `callbackImage(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&)': rgb_listener.cpp:(.text+0x598): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)' rgb_listener.cpp:(.text+0x5b0): undefined reference to `cv::waitKey(int)' collect2: error: ld returned 1 exit status image_listen/CMakeFiles/image_listen_node.dir/build.make:128: recipe for target '/home/nvidia/tutorial_subscriber/devel/lib/image_listen/image_listen_node' failed make[2]: *** [/home/nvidia/tutorial_subscriber/devel/lib/image_listen/image_listen_node] Error 1 CMakeFiles/Makefile2:461: recipe for target 'image_listen/CMakeFiles/image_listen_node.dir/all' failed make[1]: *** [image_listen/CMakeFiles/image_listen_node.dir/all] Error 2 Makefile:138: recipe for target 'all' failed make: *** [all] Error 2 Invoking "make -j4 -l4" failed
code
#include <ros/ros.h> #include <image_transport/image_transport.h> #include <sensor_msgs/Image.h> #include <sensor_msgs/image_encodings.h> #include <cv_bridge/cv_bridge.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <stdio.h> void callbackImage (const sensor_msgs::ImageConstPtr & img_ptr); int cnt; int idx; int main (int argc, char** argv) { cnt = 0; idx = 0; ros::init (argc, argv, "image_retriever"); ros::NodeHandle handler; image_transport::ImageTransport it (handler); std::string topic_img = "/usb_cam/image_raw"; image_transport::Subscriber it_sub_img = it.subscribe (topic_img, 100, callbackImage); ros::spin (); return 0; } void callbackImage (const sensor_msgs::ImageConstPtr & msg_img) { cv_bridge::CvImagePtr img_ptr; try { if (sensor_msgs::image_encodings::isColor (msg_img->encoding)) { img_ptr = cv_bridge::toCvCopy (msg_img, sensor_msgs::image_encodings::BGR8); } else { img_ptr = cv_bridge::toCvCopy (msg_img, sensor_msgs::image_encodings::MONO8); } if (img_ptr->image.data) { cv::Mat image = img_ptr->image; cv::imshow ("raw", image); cv::waitKey (3); // if(cnt% 2 == 0){ char fn[30]; sprintf(fn, "rawoutput%04d.pgm", idx); std::vector<int> param; param.push_back(CV_IMWRITE_PXM_BINARY); param.push_back(1); cv::imwrite(fn, image, param); idx++; // } ROS_INFO("image data retireved!\n"); } } catch (cv_bridge::Exception &e) { ROS_ERROR("error in image data retrieval!\n"); } cnt++; }
CMakelists.txt
cmake_minimum_required(VERSION 2.8.3) project(image_listen) add_compile_options(-std=c++11) find_package(catkin REQUIRED COMPONENTS cv_bridge roscpp rospy sensor_msgs std_msgs image_transport ) ## System dependencies are found with CMake's conventions # find_package(Boost REQUIRED COMPONENTS system) find_package(Opencv) catkin_package( INCLUDE_DIRS include LIBRARIES image_listen CATKIN_DEPENDS roscpp rospy sensor_msgs std_msgs image_transport DEPENDS system_lib ) include_directories( include ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ) add_executable(${PROJECT_NAME}_node src/rgb_listener.cpp) add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} ${OpenCV_LIBS} )