ubuntu18.04 opencv安装
推荐链接:
https://blog.csdn.net/weixin_44180937/article/details/105382436
在进行opencv的安装过程中,需要下载两个文件,分别为opencv和opencv_contrib
注意:后者功能包不强制选择,这个包主要包含的是像一些DNN模块等功能,根据具体需求自行选择
在下载的过程中,下载失败的解决办法:
1、在github中,选择opencv_contrib时,注意选择与opencv对应的版本;
2、下载失败时,网上有很多解决办法,但是效果不好,最好是使用手机热点进行下载。
下载安装的过程参考网上其他教程,这里主要说一下遇到的问题解决方案;
1、OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决
出错原因,由于网络问题导致文件下载不全,这里需要自己进行下载,并在对应的文件里面替换,替换的路径为opencv_contrib->module->xfeatures2d->src下
需要下载的文件包括如下:
- boostdesc_bgm.i
- boostdesc_bgm_bi.i
- boostdesc_bgm_hd.i
- boostdesc_lbgm.i
- boostdesc_binboost_064.i
- boostdesc_binboost_128.i
- boostdesc_binboost_256.i
- vgg_generated_120.i
- vgg_generated_64.i
- vgg_generated_80.i
- vgg_generated_48.i
对应的下载链接为:
https://47.95.13.239/play/OpenCV/fatal_error/
如果是在网页上复制的话,一定要等页面加载完毕后复制,完整的文件是以];为结尾的,否则会报int_prame的错误。
2、在make的时候,有时候会存在文件不存在的现象,这可能是多线程编译引起的,因为我们可能使用的编译命令为make -j8,这时候我们可以尝试make进行编译
在安装完成后,可以检测python接口是否可以正常调用,在检测的过程中,发现可以正常输出版本号,但是在终端里使用命令查看版本号时,pkg-config --modversion opencv,显示缺少opencv.pc文件
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
解决办法如下:
1、首先创建opencv.pc文件,这里要注意它的路径信息:
cd /usr/local/lib
sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc
2、然后在opencv.pc中添加以下信息,注意这些信息需要与自己安装opencv时的库路径对应:
prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: opencv
Description: The opencv library
Version:4.0.1
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
~
如果是默认安装的话,只需要修改版本号即可
3、保存退出,然后将文件导入到环境变量:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
至此就配置好opencv.pc啦~,再次查看版本号就可以正常显示了!
使用ROS读取视频bag包信息的方法以及注意事项:
1、我们利用播放bag包进行视频播放,所以只需要写一个订阅节点即可,订阅的话题为bag包下的图像话题名称,查看topic的方法可以使用命令:
rosbag info 包名
2、新建ROS的工作空间,这里正常建立就可以了,附上订阅节点的代码:
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
//cv::Mat image;
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
try
{
// image = cv_bridge::toCvShare(msg, "bgr8")->image;
// cv::imshow("view", image);
// cvWaitKey(1);
cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
cvWaitKey(1);
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
}
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "image_listener");
ros::NodeHandle nh;
cv::namedWindow("view", 0);
cv::startWindowThread();
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("image_raw", 1, imageCallback);
ros::spin();
cv::destroyWindow("view");
}
重点说一下catkin_make时遇到的错误:
cam_sub.cpp:(.text+0x456): undefined reference to `cv::startWindowThread()'
cam_sub.cpp:(.text+0x735): undefined reference to `cv::destroyWindow(cv::String const&)'
collect2: error: ld returned 1 exit status
camnode/CMakeFiles/cam_sub.dir/build.make:126: recipe for target '/home/fx/Desktop/cam_test/devel/lib/camnode/cam_sub' failed
make[2]: *** [/home/fx/Desktop/cam_test/devel/lib/camnode/cam_sub] Error 1
CMakeFiles/Makefile2:1023: recipe for target 'camnode/CMakeFiles/cam_sub.dir/all' failed
make[1]: *** [camnode/CMakeFiles/cam_sub.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
这里注意要修改包下的CMakelist.txt文件
在下面加入opencv的链接,如下所示:
target_link_libraries(cam_sub
${catkin_LIBRARIES}
${OpenCV_LIBS}
)
在catkin_package和find_package中加入cv_bridge和image_transport库文件
完整的CMakelist文件如下:
cmake_minimum_required(VERSION 2.8.3)
project(camnode)
find_package(OpenCV REQUIRED)
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES my_image_transport
CATKIN_DEPENDS cv_bridge image_transport
# DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
add_executable(cam_sub
src/cam_sub.cpp
)
add_dependencies(cam_sub ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(cam_sub
${catkin_LIBRARIES}
${OpenCV_LIBS}
)
在package.xml文件中,加入依赖
<buildtool_depend>catkin</buildtool_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>image_transport</build_depend>
<build_export_depend>cv_bridge</build_export_depend>
<build_export_depend>image_transport</build_export_depend>
<build_depend>opencv2</build_depend>
<exec_depend>cv_bridge</exec_depend>
<exec_depend>image_transport</exec_depend>
大家可能使用Roboware进行工程新建,使用此编译器不需要将文件加入可执行文件中,但是一些链接库还是需要手动添加的~~