Я пытаюсь создать простой проект, использующий ROS (индиго, установленный в Ubuntu 14.04) и OpenCV 3.0.0 для чтения изображений из видео (веб-камера или файл) и публикации их с помощью ROS image_transport.
Чтение изображения и его отображение работают нормально, но как только я пытаюсь включить и использовать cv_bridge для преобразования и публикации изображения, оно по-прежнему отлично компилируется, но при запуске исполняемого файла происходит сбой с
Ошибка сегментации (дамп ядра)
Мой код:
#include <ctime>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "image_transport/image_transport.h"
#include "cv_bridge/cv_bridge.h"
#include <fstream>
int main(int argc, char **argv)
{
cv::Mat image;
ros::init(argc, argv, "webcam_streamer");
ros::NodeHandle nh;
ros::Rate loop_rate(500);
image_transport::ImageTransport it(nh);
image_transport::Publisher pub = it.advertise("cam_img", 10);
cv::VideoCapture cap("//home//milan//drop.avi");
if(!cap.isOpened())
{
ROS_ERROR("COULD NOT OPEN FILE!\r\n");
return 0;
}else
ROS_INFO("Read file successfully!\r\n");
while(nh.ok())
{
ROS_INFO("Reading image");
cap.read(image);
ROS_INFO("...");
if(image.empty())
break;
ROS_INFO("Success!");
cv::imshow("IMG", image);
cv::waitKey(20);
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
ROS_INFO("STOPPING CAM");
cap.release();
}
В моем CMakeLists.txt я делаю
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
cv_bridge
image_transport
)
find_package(OpenCV REQUIRED)
add_executable(stream_webcam_image src/stream_webcam_image.cpp)
target_link_libraries(stream_webcam_image ${catkin_LIBRARIES})
target_link_libraries(stream_webcam_image ${OpenCV_LIBS})
add_dependencies(stream_webcam_image stream_webcam_image_gencpp)
Когда я удаляю cv_bridge из моего CMakeLists.txt и моих включений и не пытаюсь опубликовать образ, программа работает нормально, в противном случае она завершается со следующим выводом:
Так что кажется, что он даже не успевает прочитать изображение.
Похоже, проблема в том, что ROS (в частности, cv_bridge) использует более старую версию OpenCV, которая конфликтует с версией 3, которую я установил.
Я пытался следовать этому: Последний OpenCV в ROS но ls /opt/ros/rosversion -d/lib/libopencv* -hal
не нашел текущий OpenCV в папке ROS, и я не смог найти указанную папку OpenCV вручную. Я все еще следовал инструкциям, но все та же ошибка.
Затем я нашел этот вопрос в ROS Answers, который похоже, та же проблема, но я попытался скомпилировать ROS после установки OpenCV 3, который также должен был собрать opencv_vision из исходного кода, как предполагает последний комментарий в приведенной выше ветке?
Я что-то пропустил, или есть лучшее решение этой проблемы?
Моя цель — заставить мой Raspberry Pi 2 отправлять изображения с его камеры на мой ноутбук с помощью ROS, и, поскольку Raspbian Jessie, кажется, поддерживает только OpenCV 3, я ограничен этим. Также я использую QT Creator на Ubuntu для написания своих программ для Pi, поэтому использование OpenCV 2 в Ubuntu и OpenCV 3 на Pi было бы очень громоздким.