Ubuntu环境中利用OpenCV进行相机标定

本文详细介绍了在Ubuntu系统中使用OpenCV进行相机标定的步骤,包括文件夹结构设置、CMakeLists配置、源代码编写及编译过程。作者在实际操作中遇到文件路径问题,通过修改代码解决了读取图像的路径问题,实现了相机标定程序的正确运行。文章最后对比了优化前后标定效果,指出拍照时保留周边空隙的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文初衷

查了很多博客,发现大部分都是在windows环境中利用vs来实现摄像机标定的,其中有篇博客是在Ubuntu界面下操作的,如下:
https://blog.csdn.net/u012926144/article/details/81047728
他的博客由来实际上是源于VS上的一个张正友标定法,想要了解摄像机标定一定要看看该代码,标注很清晰。
[https://blog.csdn.net/dcrmg/article/details/52939318#t4]

Ubuntu文件生成和编译如下:

参考第一篇的博客:
(1)建立文件夹 iamge 保存标定所需的图片
         src 保存程序
(2)创建文件 CMakeLists.txt,并写入

CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
PROJECT( calibration )
SET(CMAKE_CXX_COMPILER “g++”)
SET( CMAKE_BUILD_TYPE Debug )
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include )
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src )
 
现在cameraCalibration文件夹内应该有image src CmakeLists.txt

(3)在src中创建calibration.cpp,内容也就是下面提到的主程序
(4) 在src中创建CMakeLists.txt文件,内容如下:(这里在我的电脑需要将FIND_PACKAGE( OpenCV REQUIRED )移动到ADD_EXECUTABLE前面,并去掉3.4)

增加一个可执行的二进制
FIND_PACKAGE( OpenCV REQUIRED )
ADD_EXECUTABLE(calibration calibration.cpp )
增加opencv的依赖
INCLUDE_DIRECTORIES( ${OpenCV_INCLUDE_DIRS} )
TARGET_LINK_LIBRARIES( calibration ${OpenCV_LIBS})

(5)编译运行

cd ./cameraCalibration 
mkdir build
cd build
cmake … make
会生成bin文件夹,里面有可执行文件,运行后,会得到结果文件都在bin里面保存着。程序有错误的时候可以先检查路径是否正确。

但是我在实际操作过程中遇到文件路径问题`,我卡在这里一上午,都快崩溃了。

OpenCV Error: Assertion failed (nimages > 0) in calibrateCamera, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/calib3d/src/calibration.cpp, line 3357
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/calib3d/src/calibration.cpp:3357: error: (-215) nimages > 0 in function calibrateCamera

Aborted (core dumped)

查看其代码写入图片的程序段(片段):

int main() 
{
   
   
    ifstream fin("calibration.txt");             /* 标定所用图像文件的路径为避免出错最后是绝对路径 */
    ofstream fout("calibration_result.txt");  /* 保存标定结果的文件 */  
 
    // 读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化
    cout<<"开始提取角点………………"<<endl;
    int image_count = 0;  /* 图像数量 */
    Size image_size;      /* 图像的尺寸 */
    Size board_size = Size(4, 6);             /* 标定板上每行、列的角点数 */
    vector<Point2f> image_points_buf;         /* 缓存每幅图像上检测到的角点 */
    vector<vector<Point2f> > image_points_seq; /* 保存检测到的所有角点 */
    string filename;      // 图片名
    vector<string> filenames;     
 
    while (getline(fin, filename))
    {
   
   
        ++image_count;
	// 用于观察检验输出
        cout<<"image_count = "<<image_count<<endl;
        cout<<"filename: "<<filename<<endl;
        Mat imageInput = imread(filename);
        filenames.push_back(filename);
————————————————
版权声明:本文为CSDN博主「huawwenwnewn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012926144/article/details/81047728

注意到他是用ifstream实现文件读取的,这里我想到的是改用c++11新的读取方式boost::foramt,而且这种方式不需要路径文件,只要在代码中写入相对路径即可。像下面这样,第一个chessboard代表图像存放文件夹(这里你需要和src在同一个地方,然后从bin中运行),第二个chessboard代表图像的名称,i+1代表第几章图片(从1开始):

boost::format fmt("../%s/%s%d.%s");  //图像文件文件格式
Mat imageInput = cv::imread((fmt % "chessboard" % "chessboard" % (i + 1) % "jpg").str());

一定要注意这里的相对路径前面是双引号(我们新手的坑,我又踩了),后面可能还会出现错误,需要修改vector<string> filenames;vector<cv::Ma

### Ubuntu使用 DCW2 深度相机进行手眼标定方法 #### 准备工作 为了在Ubuntu使用DCW2深度相机完成手眼标定,需先确保ROS2环境已安装完毕,并且版本为Humble。操作系统应为Ubuntu 22.04 LTS。对于所使用的奥比中光DABAI_DCW双目结构光相机,需要按照官方说明配置好相应的SDK驱动程序[^1]。 #### 安装必要的依赖包 通过终端执行命令来更新软件源并安装一些基础工具: ```bash sudo apt update && sudo apt upgrade -y sudo apt install ros-humble-camera-calibration ros-humble-image-geometry python3-opencv aruco-utils ``` #### 获取与编译手眼标定所需资源 从GitHub仓库克隆专门针对手眼协调的手眼标定库至本地计算机的工作空间内,通常位于`~/ros2_ws/src/`目录下: ```bash cd ~/ros2_ws/src/ git clone https://github.com/ros-industrial-consortium/handeye_calibrator.git ``` 接着,在同一路径下初始化和构建整个项目工程: ```bash cd ~/ros2_ws colcon build --symlink-install source install/setup.bash ``` #### 进行手眼标定实验准备 启动深度相机节点以便获取图像流数据。这一步骤具体取决于之前已经成功部署好的相机驱动服务端口情况;假设一切正常,则可以通过如下指令激活设备连接状态: ```bash ros2 launch dcw_camera_node start.launch.py ``` 创建一个新的launch文件用于同时运行aruco单目检测器以及hand_eye_calibration_client客户端应用程序实例化过程中的参数设定。新建名为`calibrate_hand_eye.launch.py`的脚本放置于个人自定义package里边,内容大致如下所示(注意修改其中有关marker尺寸大小等细节部分以匹配实际标签规格): ```python from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='aruco_detect', executable='single_marker_detector', name='marker_detector', parameters=[{'marker_size': 0.08, 'camera_frame_id': 'dcw_optical_frame'}], remappings=[ ('image', '/depth/image_rect_raw'), ('camera_info', '/depth/camera_info') ] ), Node( package='handeye_calibrator', executable='client', name='hand_eye_calib_client' ) ]) ``` #### 开始手眼标定流程 当所有前期准备工作都完成后,便可以正式开启手眼校准环节了。打开新的终端窗口依次输入下面两条语句分别触发上述提到过的两个重要组件——ARUCO标记识别模块和服务请求者接口: ```bash ros2 launch your_package_name calibrate_hand_eye.launch.py ``` 此时应该能看到机器人末端执行机构携带特定图案经过摄像头视野范围内移动的画面序列变化情形。操作人员可根据提示信息调整姿态直至满足采样条件为止。期间务必保持稳定的速度和平滑的动作轨迹以免影响最终计算精度。 一旦收集到足够的样本数量之后就可以结束本轮测试进而获得一组较为理想的结果输出。这些数值能够帮助我们更好地理解两者之间的相对位置关系从而优化后续任务规划方案设计思路。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值