簡體   English   中英

ROS問題:如何用opencv4正確編譯自定義cv_bridge

[英]ROS question: How to compile custom cv_bridge with opencv4 correctly

我想在我的 ROS 程序中使用 opencv-4.4.0,我發現要做到這一點,我必須使用當前 opencv 版本從源代碼編譯 cv_bridge,因為從 ROS 發布的 cv_bridge 僅支持 opencv3。 經過一番搜索,我發現這個我認為是定制的與 opencv4 兼容:

https://github.com/fizyr-forks/vision_opencv/tree/opencv4

在我的程序中構建和更改包含路徑后,出現此錯誤:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp, line 9716
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp:9716: error: (-215) scn == 3 || scn == 4 in function cvtColor  

此錯誤來自cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::MONO8); cv::imshow() ); 這並不重要,因為我發現在將最后一個參數MONO8更改為BGR8imshow能夠工作。 所以我想我可以使用BGR8 ,然后使用 opencv function 將其更改為灰度。 但是,從這個錯誤消息中,我意識到 cv_bridge 仍在嘗試使用 opencv-3.2 而不是 opencv-4.4.0。 請幫我弄清楚如何用正確的 opencv 版本編譯它! 這是我的CMakeLists.txtpackage.xml 我對它們進行了一些更改,因為原始文件對我來說不能正常工作(就像我的一樣)。
如果它們難以閱讀,我很抱歉。
CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) project(cv_bridge)

find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)
 
if(NOT ANDROID)   find_package(PythonLibs)  
if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
     find_package(Boost REQUIRED python)   else()
     find_package(Boost REQUIRED python3)   endif() else() find_package(Boost REQUIRED) endif()
 
find_package(OpenCV 4.4.0 REQUIRED   COMPONENTS
     opencv_core
     opencv_imgproc
     opencv_imgcodecs   CONFIG ) set(OpenCV_DIR=/usr/local/lib/cmake/opencv4)
 
catkin_package(   INCLUDE_DIRS include   LIBRARIES ${PROJECT_NAME}  
CATKIN_DEPENDS rosconsole sensor_msgs   DEPENDS OpenCV   CFG_EXTRAS
cv_bridge-extras.cmake )

catkin_python_setup()

include_directories(include ${Boost_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

if(NOT ANDROID) add_subdirectory(python) endif() add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)   add_subdirectory(test) endif()

install(   DIRECTORY include/${PROJECT_NAME}/   DESTINATION
${CATKIN_PACKAGE_INCLUDE_DESTINATION} )  

package.xml:

<package format="2">   <name>cv_bridge</name>  
<version>1.13.0</version>   <description>
    This contains CvBridge, which converts between ROS
    Image messages and OpenCV images.   </description>   <author>Patrick Mihelich</author>   <author>James Bowman</author>  
<maintainer email="vincent.rabaud@gmail.com">Vincent
Rabaud</maintainer>   <license>BSD</license>   <url
type="website">http://www.ros.org/wiki/cv_bridge</url>   <url
type="repository">https://github.com/ros-perception/vision_opencv</url>
<urlI'm sorry if it's hard to read.
type="bugtracker">https://github.com/ros-perception/vision_opencv/issues</url>

  <export>
    <rosdoc config="rosdoc.yaml" />   </export>

  <buildtool_depend>catkin</buildtool_depend>

<build_depend>boost</build_depend>  
<build_depend>opencv2</build_depend>  
<build_depend>python</build_depend>  
<build_depend>python-opencv</build_depend>  
<build_depend>rosconsole</build_depend>  
<build_depend>sensor_msgs</build_depend>

  <exec_depend>boost</exec_depend>  
<exec_depend>opencv2</exec_depend>   <exec_depend>python</exec_depend>
<exec_depend>python-opencv</exec_depend>  
<exec_depend>rosconsole</exec_depend>  
<build_export_depend>opencv2</build_export_depend>  
<build_export_depend>sensor_msgs</build_export_depend>

  <test_depend>rostest</test_depend>  
<test_depend>python-numpy</test_depend>

  <doc_depend>dvipng</doc_depend> </package>  

更新:

我插入一行代碼打印出 cv_bridge.cpp 中的 opencv 版本。 結果是4.4.0。 這是否意味着它使用的是正確版本的 opencv 並且上面的錯誤消息來自另一個 package? 我檢查了 cv_bridge 和我自己的程序,它們都使用 opencv 4.4.0,包括在內。 我真的沒主意了。 這是我包括的內容:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include </home/robotics/catkin_ws/src/vision_opencv-opencv4/cv_bridge/include/cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv4/opencv2/imgproc/imgproc.hpp>
#include <opencv4/opencv2/highgui/highgui.hpp>
#include <iostream>

我正在回答我自己的問題,因為我終於找到了解決方案! 根據這篇文章,我發現我的自定義 cv_bridge 的 CMakeLists.txt 沒有set (CMAKE_CXX_STANDARD 11) 所以我添加了它並catkin build了catkin,然后嘗試了我的程序並修復了所有問題:這是我的整個CMakelists:

cmake_minimum_required(VERSION 2.8)
set (CMAKE_CXX_STANDARD 11)
project(cv_bridge)

find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)

if(NOT ANDROID)
  find_package(PythonLibs)
  if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
    find_package(Boost REQUIRED python)
  else()
    find_package(Boost REQUIRED python3)
  endif()
else()
find_package(Boost REQUIRED)
endif()

set(CV_MAJOR_VERSION=4.4.0)
set(OpenCV_DIR=/usr/local/lib/cmake/opencv4)
find_package(OpenCV 4.4.0 REQUIRED
  COMPONENTS
    core
    imgproc
    imgcodecs
  CONFIG
)


catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS rosconsole sensor_msgs
  DEPENDS OpenCV
  CFG_EXTRAS cv_bridge-extras.cmake
)

catkin_python_setup()

include_directories(include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

if(NOT ANDROID)
add_subdirectory(python)
endif()
add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)
  add_subdirectory(test)
endif()

# install the include folder
install(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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