基于的demo和所需工具https://pan.baidu.com/s/1ZgROxGq9dG4x24rBOVjrbQ?pwd=t78h 提取码: t78h
- ubuntu16.04
- opencv3.3.1
- g++ 5.4.0
环境配置
ROS安装
参考博客ubuntu16.04安装ROS(总结最实用的)-CSDN博客,整个安装过程顺利进行
Opencv环境安装
opencv环境安装的难点在于:demo下需要用到aruco.hpp库,仅编译安装opencv是不行的,另外需要和opencv_contrib-3.x,opencv安装仅包含通用的库文件,而opencv_contrib-3.x这个文件是许多的扩展库组成,这些扩展库可能是一些新算法库、过于具体而非通用的功能库、额外的计算机视觉库、社区贡献的库文件等。两个文件联合编译是难点所在。有必要说明一下笔者在编译过程中遇到的阻碍。编译流程参考博客Ubuntu 16.04 安装opencv 3.4.7-CSDN博客,编译过程中遇到的问题如下
参考流程选择的opencv版本3.4.7,笔者结合下载了opencv_contri-3.4,两者联合编译的过程会出现一些错误,最后也都可以解决,但是最后的编译结果在于aruco.hpp始终找不到(默认安装在/usr/local/include/opencv2 中)。于是笔者选择了opencv-3.3.1以及opencv_contrib-3.3.1(工具包内包含)
执行到第三步camke前的文件结构如下(此处只列出新建或改动过的文件)
/home/××
├── opencv-3.3.1
│ ├── 3rdparty
└── ippicv/ #编译报错时将ippicv_2019***.tgz放进去并将ippicv.cmake47行进行修改
│ ├── build
└── opencv_contrib-3.3.1
进入build目录执行(只要文件结构一致,直接复制执行即可,都是使用的相对路径)
cmake ../ -DWITH_CUDA=OFF -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_DOCS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_XIMGPROC=ON -DTRAINCASCADE=ON -DOPENCV_GENERATE_PKGCONFIG=ON -DGEN_OPENCV_PYTHON2=ON -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3.1/modules
最后在/usr/local/include/opencv2能够找到我们想要的库即可。
摄像头测试
此过程要保证摄像头在ubuntu下能够正常的运行,才有后文的标定、二维码检测、姿态测量的后文。这一步骤我经历了如下挫折
- 使用C++写一个demo编译运行(工具包cameratest.cpp),此时需要注意的是相机已经连到ubuntu且ubuntu能够正确的识别、相机的数据格式、帧率需要明确,代码编译
g++ -o cameratest cameratest.cpp `pkg-config --cflags --libs opencv`
- 虚拟机界面->虚拟机->可移动设备->摄像头确实连接到虚拟机(我的摄像头没驱动,很容易连上,如果连上未识别很可能就是需要驱动)
- 安装v4l2工具并运行v4l2-ctl --device=/dev/video0 --list-formats-ext查看相机的Index、像素类别、Size、分辨率等,程序里面需要用到,特别是Index需要按照自己的要求进行修稿
- 另一种方法是使用ubuntu里边的相机测试工具cheese进行相机测试,用之前先安装,直接运行cheese即可,这种方法更简单粗暴,如果cheese检测不到摄像头,十有八九是摄像头未连接到虚拟机或者虚拟机未识别出摄像头(驱动有问题),仔细排查
- 上述两个步骤能运行但是均显示不出图像,显示窗口一片黑,这就不是摄像头的问题,经过仔细的排查发现是虚拟机usb设备管理的问题,在虚拟机设置中进行设置如下。“显示所有USB输入设备最好也勾选(开机状态看不到,得先关机)”
最后cheese能够正常识别,测试摄像头的C++程序也就正常跑通了。
标定、运行
摄像头标定
- ROS环境启动,新建一个终端运行
roscore
- ROS下安装标定工具
sudo apt-get install ros-kinetic-usb-cam
(其中kinetic参数根据所装的ros版本而定),可以用rospack find usb_cam
测试是否安装完成,有返回值说明安装完成,/opt/ros/kinetic/share/usb_cam
- 棋盘格准备,https://calib.io/pages/camera-calibration-pattern-generator是一个在线生成棋盘格的链接界面如下
- 开始标定,两段程序在两个终端运行,第一个运行完毕后运行第二个
#此代码运行/opt/ros/kinetic/share/usb_cam/launch/usb_cam-test.launch脚本,可自行按需修改
roslaunch usb_cam usb_cam-test.launch
#上述脚本运行后运行下面的标定工具
rosrun camera_calibration cameracalibrator.py --size 10x7 --square 0.012 image:=/usb_cam/image_raw
上述两个脚本是基于ROS的消息订阅机制运行的,第一段代码的作用是捕获摄像头的视频流,并通过主题iamge_raw
进行发布,运行第一行代码后可以新开一个终端运行rostopic list
查看主题名,用rostopic info /usb_cam/image_raw
查看此主题的发布者和订阅者