使用cv_bridge(ROS indigo)和OpenCV 3

时间:2015-11-28 12:45:08

标签: opencv image-processing segmentation-fault raspbian ros

我正在尝试创建一个简单的项目,使用ROS(安装在Ubuntu 14.04上的indigo)和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)

当我从我的CMakeLists.txt中移除cv_bridge并且我的包含并且不尝试发布图像时,程序运行正常,否则它会失败并显示以下输出: Program output

所以它似乎甚至无法读取图像。

问题似乎是ROS(特别是cv_bridge)使用的旧版OpenCV与我安装的版本3冲突。

我试图遵循这个: Latest OpenCV in ROS 但是 ls /opt/ros/rosversion -d/lib/libopencv* -hal 没有在ROS文件夹中找到当前的OpenCV,我无法手动找到指定的OpenCV文件夹。 我仍然遵循这些步骤,但仍然是同样的错误。

然后我发现this question on ROS Answers 这似乎是同样的问题,但我尝试在安装OpenCV 3之后编译ROS,它也应该从源代码构建opencv_vision,如上面线程中的最后一条评论所暗示的那样?

我是否遗漏了某些内容,或者是否有更好的解决方案?

我的目标是让我的Raspberry Pi 2使用ROS将相机中的图像发送到我的笔记本电脑,而Raspbian Jessie似乎只支持OpenCV 3,我仅限于此。另外我在Ubuntu上使用QT Creator为Pi编写我的程序,所以在Ubuntu中使用OpenCV 2和在Pi上使用OpenCV 3会非常麻烦。

2 个答案:

答案 0 :(得分:4)

好吧,我解决了问题(通过重复我以为我已经做过的事情)

我做了什么:

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工具和机器人通用库),但程序应该是相同的。

总而言之,似乎有必要从已安装OpenCV的源代码编译ROS。

在此之后,我能够使用ROS的image_transport和cv_bridge在Pi 2和我的虚拟机之间传输视频文件。

希望这可以帮助有同样问题的人。

答案 1 :(得分:1)

我也遇到了同样的问题,可能是因为OpenCV的多个版本与我的二进制文件有关。

我能够通过将vision_opencv存储库克隆到我的catkin工作区来解决段错误。

然后,我的包明确要求OpenCV 3:

find_package(OpenCV 3 REQUIRED)

这将使用OpenCV重新编译cv_bridge包,并且生成的二进制文件仅与OpenCV3库链接。