【基础学习】Kalibr单目标定MVS相机

Kalibr单目标定MVS相机基础学习

1 kalibr标定包

1.1 下载安装

mkdir -p kalibr_ws/src
cd kalibr_ws/src

git clone https://github.com/ethz-asl/kalibr.git

cd ..
catkin build -DCMAKE_BUILD_TYPE=Release -j4

1.2 标定流程

1.2.1 录制rosbag包

开启相机端视频流mvs开启,标定过程中尽量让各个姿态保持时间长一点,且四个角,中心位置等都出现绕xyz轴旋转的图

tips : 注意mvs是否相机驱动正确设置时间戳,通过MVS的UI可查看,不正确设置所有帧的时间戳都是出厂的时间戳,录包后数据没法区分(否则会报错TargetViewTable]: Tried to add second view to a given cameraId & timestamp. Maybe try to reduce the approximate syncing tolerance )

roslaunch mvs_ros_driver mvs_camera_trigger.launch
rosbag record /left_camera/image -o "cam_calib"

由于此处我未检查MVS的相机驱动,所以将采集的rosbag转换为数据集后再再次转为可用的rosbag

转换文件为:

tips:注意数据集命名,一组图像命名为cam0,如果是多相机就是cam1等分别创建文件夹命名,imu也是,然后统一放到一个文件夹里,我这是放到了data_set文件夹

#include <ros/ros.h>
#include <rosbag/bag.h>
#include <rosbag/view.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/opencv.hpp>
#include <boost/filesystem.hpp>

int main(int argc, char** argv)
{
    if (argc < 5) {
        std::cerr << "用法: " << argv[0] << " <bag路径> <图像话题> <输出文件夹> <抽帧间隔>" << std::endl;
        return -1;
    }

    std::string bag_path     = argv[1];
    std::string image_topic  = argv[2];
    std::string output_dir   = argv[3];
    int frame_interval       = std::stoi(argv[4]);

    // 创建输出文件夹
    boost::filesystem::create_directories(output_dir);

    rosbag::Bag bag;
    try {
        bag.open(bag_path, rosbag::bagmode::Read);
    } catch (rosbag::BagException &e) {
        std::cerr << "无法打开bag文件: " << e.what() << std::endl;
        return -1;
    }

    rosbag::View view(bag, rosbag::TopicQuery(image_topic));

    int frame_count = 0;
    int saved_count = 0;

    for (const rosbag::MessageInstance& m : view) {
        sensor_msgs::Image::ConstPtr img_msg = m.instantiate<sensor_msgs::Image>();
        if (!img_msg) continue;

        if (frame_count % frame_interval == 0) {
            try {
                cv_bridge::CvImageConstPtr cv_ptr = cv_bridge::toCvShare(img_msg, "bgr8");

                auto now = std::chrono::system_clock::now();
                auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()).count();

                std::stringstream ss;
                ss << output_dir << "/" << ns << ".jpg";

                cv::imwrite(ss.str(), cv_ptr->image);
                saved_count++;
                std::cout << "保存图片: " << ss.str() << std::endl;
            }
            catch (cv_bridge::Exception& e) {
                std::cerr << "cv_bridge 转换失败: " << e.what() << std::endl;
            }
        }
        frame_count++;
    }

    std::cout << "总共保存了 " << saved_count << " 张图片" << std::endl;

    bag.close();
    return 0;
}

然后调用kalibr本身的kalibr_bagcreator包创建新的可用rosbag

rosrun kalibr kalibr_bagcreater --folder /home/bagfile/data_set --output-bag /home//bagfile/new_bag_20250815.bag
1.2.2 标定步骤

利用kalibr_calibrate进行标定,先创建一个apriltag.yaml文件,说明标定板的情况

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.055           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          #ratio of space between tags to tagSize
rosrun kalibr kalibr_calibrate_cameras --bag /home/bagfile/new-bag-20250815.bag --topics /left_camera/image --models pinhole-radtan --target /home/bagfile/apriltag_6x6.yaml --show-extraction --approx-sync 0.01

.bag是采集的数据包名称,topics处是待标记单目的topic(注意新数据集后的该话题会改变,要rosbag info看一下),pinhole-radtan表示采用的畸变类型,april_6x6_max.yaml是适用于你自己标定板参数的配置文件,–show-extraction显示抽帧提取corner过程,approx-sync是时间差

1.2.3 标定质量分析

我这里error的pix比较多,应该再多些位姿
程序会输出三个文件:

report-cam-%BAGNAME%.pdf:PDF版本的结果报告,包含绘制的图片和标定的参数。

results-cam-%BAGNAME%.txt:以文本文件储存的标定结果。

camchain-%BAGNAME%.yaml:以YAML格式储存的标定结果。它可以直接用来作为相机-IMU校正的输入。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

<think>好的,用户想了解海康威视相机MVS(多视图立体视觉)相关的集成或设置,需要配置教程和开发文档。首先,我需要确认用户的问题中的MVS具体指的是什么。海康威视的MVS通常是指其机器视觉软件(Machine Vision Software),但多视图立体视觉(Multi-View Stereo)也是一种计算机视觉技术,可能涉及多相机配置。需要区分用户指的是哪个MVS。 查看提供的引用,引用[2]提到海康的MVS软件是用于工业相机的配置工具,支持多品牌相机。引用[4]提到MVS用于图像处理和分析,可能涉及立体视觉。因此,用户可能想将海康相机配置到多视图立体视觉系统中,使用海康的MVS软件进行设置和开发。 接下来,我需要整理引用中的相关信息。引用[1]、[2]、[5]提供了MVS软件的安装步骤和下载链接。引用[3]和[4]涉及SDK开发和科研应用。用户需要配置教程和开发文档,所以应该分步骤说明安装、配置、多相机设置,以及SDK集成。 需要注意用户可能的环境,比如Ubuntu系统,如引用[1]和[5]提到的Ubuntu16.04和22.04下的安装。需要指导用户安装MVS软件,配置多相机,并利用SDK进行二次开发。此外,多视图立体视觉可能需要相机标定和同步,这些步骤可能也需要包含。 可能还需要补充如何获取开发文档,比如SDK的API文档位置,以及相关示例代码的参考。引用[3]提到Windows下的开发笔记,但用户可能也需要Linux下的指导,需要结合引用中的信息。 最后,生成相关问题时要围绕安装、配置、开发、同步、标定等方面,确保用户能进一步探索相关问题。</think>[系统级指令响应] ### 海康威视相机MVS(多视图立体视觉)集成配置指南 #### 1. MVS软件安装与环境配置 - **安装步骤**: 1. 从海康官网或开源仓库下载`MVS-2.1.0_x86_64_20201228`安装包[^2][^5]。 2. 在Ubuntu系统下解压文件并执行安装命令: ```bash cd MVS-2.1.0_x86_64_20201228/ ./setup.sh ``` 3. 安装完成后通过终端命令`MVS`启动软件。 - **硬件连接**: - 使用千兆网线连接相机与主机,确保IP地址在同一网段。 - 在MVS软件中点击“设备管理”自动扫描并添加相机[^2]。 #### 2. 多视图立体视觉配置要点 - **多相机同步**: - 通过MVS软件配置硬件触发模式,设置主从相机同步信号(如PTP或外部触发)[^4]。 - 使用`GenICam`协议调整曝光时间和帧率,公式可表示为: $$ T_{exposure} \leq \frac{1}{FPS} - T_{readout} $$ 其中$T_{readout}$为传感器读出时间。 - **标定与坐标对齐**: - 使用棋盘格标定板进行多相机联合标定,计算相机间旋转矩阵$R$和平移向量$t$。 - 通过MVS导出标定参数至XML文件,供后续三维重建使用。 #### 3. SDK开发集成 - **开发环境搭建**: - 在Ubuntu中安装海康SDK依赖库: ```bash sudo apt-get install libavcodec-dev libswscale-dev ``` - 使用CMake编译包含海康SDK的工程,参考示例代码结构[^3]: ```cmake find_package(OpenCV REQUIRED) include_directories(${HC_SDK_PATH}/include) ``` - **关键API调用**: ```cpp // 相机初始化 MV_CC_DEVICE_INFO_LIST stDeviceList; MV_CC_EnumDevices(MV_GIGE_DEVICE, &stDeviceList); // 取流线程 MV_CC_StartGrabbing(hDeviceHandle); MV_CC_GetOneFrameTimeout(hDeviceHandle, pData, nDataSize, &stFrameInfo, 1000); ``` #### 4. 多视图立体视觉实现 - 通过SDK获取多相机图像后,使用OpenCV或PCL库进行以下处理: 1. 极线校正(Epipolar Rectification) 2. 稠密匹配(如SGM算法) 3. 点云生成公式: $$ Z = \frac{f \cdot B}{d} $$ 其中$f$为焦距,$B$为基线距离,$d$为视差值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值