问题
在如标题所示配置下运行开源代码时,opencv中的某些函数无法正常使用,例如imshow无法显示灰度图像,distanceTransform报错等,使用时会报如下错误
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
这是因为ROS自带的opencv版本为3.2.0,在安装opencv4后导致使用不同版本的opencv报错,需要给ROS指定统一版本的opencv,解决方法是修改cv_bridge配置文件,使ROS去调用自己安装的opencv版本。
参考: http://www.bubuko.com/infodetail-3737196.html.
修改cv_bridge文件
可以直接去看这个大佬:https://blog.csdn.net/bigdog_1027/article/details/79092263.
首先找到cv_brige文件,使用gedit打开
cd /opt/ros/melodic/share/cv_bridge/cmake/
sudo gedit cv_bridgeConfig.cmake
将此处指定的头文件目录改到自己安装的头文件目录下
之后再将指定库文件也修改为自己安装的opencv库文件
与头文件直接写入目录的方式不同,库文件是将文件本身写入到配置文件中,库文件有很多,只需写入几个核心常用的即可,后续用到其他的可以添加。
修改完cv_bridge配置文件后,在CMakeLists文件中使用find_package找到cv_bridge,就可以在工程中使用自己的opencv版本。
find_package(
…
cv_bridge
…
)
还可以通过修改cv_bridge-extras.cmake文件使编译时输出正确的版本号和路径(具体原因参考上方链接),修改与否对使用opencv无影响。
同样是在 /opt/ros/melodic/share/cv_bridge/cmake/ 下打开,修改文件中内容:
万分感谢
https://blog.csdn.net/bigdog_1027/article/details/79092263.
http://www.bubuko.com/infodetail-3737196.html.