Xavier上使用OpenCV GPU模块对鱼眼相机进行矫正
程序员文章站
2022-04-17 18:12:20
...
Xavier上使用OpenCV GPU模块对鱼眼相机进行矫正
1. 安装cuda支持的opencv版本
由于xavier上使用jetpack刷机的opencv是不支持cuda加速的,所以我们需要重新安装支持cuda的opencv版本.
# 下载安装脚本
git clone https://github.com/jetsonhacks/buildOpenCVXavier.git
# 直接使用脚本下载源码并安装
cd buildOpenCVXavier
# <source directory> --> 安装过程中生成的中间文件保存路径, 默认为$HOME目录
# <install directory> --> opencv安装目录,默认为/usr/local目录
# 由于xavier空间不是很多,并且不好联网,所以建议提前将源码下载下来,放到固态硬盘里,然后将固态硬盘挂在到xavier上,并且设置<source directory>为硬盘目录,即在固态硬盘中保存编译过程中生产的中间文件
./buildOpenCV.sh -s <source directory> -i <install directory>
2. 重新编译vision_opencv软件包
当我们使用ROS工程接受图片数据时,需要i用到cv_bridge库,但是该库默认是不支持cuda加速的,所以我们在编译最终的相机矫正工程时,会出现如下警告信息:
该警告信息不影响编译,但是在我们运行程序时,会报如下错误:
虽然我们在CMakeLists文件中指定了链接的opencv路径为我们编译的opencv-3.4.3版本,但是程序还是会链接ROS中自带的libcv_bridge.so库,而这个库模式是基于opencv3.2生成的
所以我们需要基于我们自己安装的opencv-3.4.3重新编译vision_opencv模块:
# 创建工作空间
mkdir -p catkin_ws/src
# 下载vision_opencv
git clone https://github.com/ros-perception/vision_opencv.git
# 切换为melodic版本
cd vision_opecnv
git checkout melodic
cd ../
# 下载image_pipeline
git clone https://github.com/ros-perception/image_pipeline.git
# 切换为melodic版本
cd image_pipeline
git checkout melodic
# 安装
# 如果提示没有catkin命令,可通过如下方式安装
# sudo apt-get install python-catkin-tools
catkin build
我们可以看到,编译完成后,会在catkin_ws/install目录下生成编译结果文件
3. 将编译结果替换到ROS环境下
cd ~/catkin_ws/install
sudo cp -r * /opt/ros/melodic
# 在/etc/ld.so.conf.d/下创建opencv.conf文件,并输入(/usr/local/lib)
sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
4. 重新编译相机矫正程序
# 先删除之前编译生成的文件
cd camera_corrected_ws
rm -rf build devel
# 添加新编译的vision_opencv模块到环境变量,不执行这个操作,我们链接的lib_cvbridge.so库还是以前的
# source ~/catkin_ws/install/setup.bash
# 编译
catkin_make
# 运行程序
source devel/setup.bash
roslaunch camera_corrected camera_corrected.launch
相机矫正程序核心代码:
cv::Mat map1, map2;
cv::fisheye::initUndistortRectifyMap(camera_mat_, camera_dist_coeff_mat_, cv::Mat(), camera_mat_, cv::Size(1280, 720), CV_32FC1, map1, map2);
m_mapx = cv::cuda::GpuMat(map1);
m_mapy = cv::cuda::GpuMat(map2);
cv::Mat src_cpu = cv_ptr->image;
cv::cuda::GpuMat src(src_cpu.size(), CV_8UC4);
src.upload(src_cpu);
cv::cuda::GpuMat distortion(src_cpu.size(), CV_8UC4);
cv::Mat result;
cv::cuda::remap(src, distortion, m_mapx, m_mapy, cv::INTER_LINEAR);
distortion.download(result);
5. 矫正结果
我们可以看到,矫正后的图像输出最大能达到57HZ左右,即矫正耗时在18ms左右