簡體   English   中英

使用cv_bridge(ROS indigo)和OpenCV 3時出現分段錯誤(核心轉儲)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM