问题描述
我想在我的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::imshow()
之后的cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::MONO8);
,因为我在更改最后一个
MONO8
的参数BGR8
起作用,imshow
可以工作。因此,我认为我可以使用BGR8
,然后稍后使用opencv函数将其更改为灰度。但是,从此错误消息中,我意识到cv_bridge仍在尝试使用opencv-3.2而不是opencv-4.4.0。请帮我弄清楚如何使用正确的opencv版本进行编译!这是我的CMakeLists.txt
和package.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的正确版本,并且上面的错误消息来自另一个软件包?我检查了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>
解决方法
我正在回答自己的问题,因为我终于找到了解决方案!根据{{3}},我发现我的自定义cv_bridge的CMakeLists.txt没有set (CMAKE_CXX_STANDARD 11)
。因此,我添加了它和catkin build
,然后尝试运行我的程序并修复了所有问题!这是我的整个CMakelist:
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}
)