我正在尝试创建一个简单的项目,使用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并且我的包含并且不尝试发布图像时,程序运行正常,否则它会失败并显示以下输出:
所以它似乎甚至无法读取图像。
问题似乎是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会非常麻烦。
答案 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库链接。