2015-11-28 20 views
3

我試圖讓使用ROS一個簡單的項目(靛藍,安裝在Ubuntu 14.04)和OpenCV 3.0.0從視頻讀取的圖像(當攝像頭或文件)並使用ROS的image_transport發佈。分割故障(核心轉儲)使用cv_bridge(ROS靛藍)和OpenCV 3

讀取圖像,並顯示它工作正常,但只要我努力,包括和使用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 ROSls /opt/ros/rosversion -d/lib/libopencv* -hal 沒有發現在ROS文件夾中當前OpenCV的,我不能手動找到指定的OpenCV的文件夾。 我仍然按照步驟操作,但仍然出現相同的錯誤。

後來我發現this question on ROS Answers 這似乎是同樣的問題,但我想已經安裝了OpenCV的3,這也應該建立從源頭opencv_vision後編譯ROS,如上面的線表明在過去有何評論?

我錯過了什麼,或者有沒有更好的辦法解決這個問題?

我的目標是讓我的Raspberry Pi 2使用ROS將圖像從它的相機發送到我的筆記本電腦,而Raspbian Jessie似乎只支持OpenCV 3,我僅限於此。另外我使用Qt Creator的Ubuntu上寫我的皮程序,所以使用的皮在Ubuntu的OpenCV 2和OpenCV 3將是非常麻煩的。

回答

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

我也有基本相同的問題,可能是由於多個版本的OpenCV與我的二進制文件鏈接。

我能夠通過將vision_opencv存儲庫克隆到我的catkin工作區來解決段錯誤。

然後,我的包明確要求OpenCV的3:

find_package(OpenCV 3 REQUIRED) 

這將重新編譯cv_bridge包OpenCV中,並將得到的二進制文件只是針對OpenCV3庫鏈接。