Ошибка сегментации (дамп ядра) при использовании cv_bridge (ROS индиго) и OpenCV 3

Я пытаюсь создать простой проект, использующий 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 было бы очень громоздким.


person Milan    schedule 28.11.2015    source источник


Ответы (2)


Хорошо, я решил проблему (повторив то, что, как мне казалось, я уже сделал)

Что я сделал:

1. Delete both ROS and OpenCV completely (I reset my Virtual Machine)
2. Download, build and install OpenCV 3
3. [Build ROS Jade from source][1] (not sure if the version makes a difference)

Теперь мой код работает без проблем в Ubuntu.

Но угадайте, что, пытаясь сделать то же самое на Pi 2, я получаю ту же ошибку.

Итак, та же процедура:

1. Start from scratch (or make sure both OpenCV and ROS are removed completely)
2. Build and install OpenCV 3
3. Build and install ROS (only Indigo is available for the Pi afaik)

На последнем шаге мне удалось установить только версию ROS_comm (без GUI-инструментов и общих библиотек для роботов), но процедура должна быть такой же.

В заключение, кажется необходимым скомпилировать ROS из исходников с уже установленным OpenCV.

После этого я могу передавать видеофайл между Pi 2 и моей виртуальной машиной, используя ROS image_transport и cv_bridge.

Надеюсь, это поможет кому-то с той же проблемой.

person Milan    schedule 30.11.2015

У меня также была практически такая же проблема, вероятно, из-за того, что несколько версий OpenCV были связаны с моим двоичным файлом.

Мне удалось устранить ошибку сегментации, клонировав репозиторий vision_opencv в мою рабочую область сережки.

Затем мой пакет явно требует OpenCV 3:

find_package(OpenCV 3 REQUIRED)

Это перекомпилирует пакет cv_bridge с OpenCV, и полученный двоичный файл будет связан только с библиотеками OpenCV3.

person Felix    schedule 02.05.2016