[英]Segmentation fault (core dumped) when using cv_bridge(ROS indigo) and OpenCV 3
我正在嘗試制作一個簡單的項目,使用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沖突。
我試着遵循這個: ROS中的最新OpenCV,但是ls /opt/ros/rosversion -d/lib/libopencv* -hal
在ROS文件夾中找不到當前的OpenCV,我無法手動找到指定的OpenCV文件夾。 我仍然按照步驟,但仍然是同樣的錯誤。
然后我在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會非常麻煩。
好吧,我解決了問題(通過重復我以為我已經做過的事情)
我做了什么:
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和我的虛擬機之間傳輸視頻文件。
希望這可以幫助有同樣問題的人。
我也有同樣的問題,可能是因為OpenCV的多個版本與我的二進制文件鏈接。
我能夠通過將vision_opencv存儲庫克隆到我的catkin工作區來解決segfault問題。
然后,我的包明確要求OpenCV 3:
find_package(OpenCV 3 REQUIRED)
這將使用OpenCV重新編譯cv_bridge包,並且生成的二進制文件僅與OpenCV3庫鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.