目录 第1章绪论1 第2章模型与背景画面52.1定义二维模型5 2.1.1matgeom5 2.1.2矩形6 2.1.3圆形7 2.1.4圆弧7 2.1.5椭圆9 2.1.6椭圆弧9 2.2定义三维模型11 2.2.1胶囊体11 2.2.2立体圆形11 2.2.3立体圆弧12 2.2.4圆柱体12 2.2.5球体14 2.2.6立体椭圆14 2.2.7椭球体15 2.2.8圆环面15 2.2.9圆顶面17 2.2.10正方体17 2.2.11长方体17 2.3盒子模型19 2.4制作复杂的模型20 2.4.1制作二维机器人模型20 2.4.2制作三维机器人模型27 2.5以图片格式保存模型35 2.6FFmpeg36 2.6.1安装FFmpeg37 2.6.2FFmpeg支持的命令37 2.7播放真实的背景画面37 2.7.1ffplay命令的主要选项38 2.7.2ffplay命令的键盘操作选项40 2.7.3ffmpeg命令的用例41 2.8模型图片背景透明化42 2.8.1SVG格式42 2.8.2SVG格式的不透明度属性42 2.8.3SVG格式的点属性43 2.8.4SVG格式的svg片段元素43 2.8.5SVG格式的多边形元素43 2.8.6SVG格式的组合对象元素43 2.8.7Octave保存的SVG图片的结构44 2.8.8通过Octave修改SVG图片背景的透明度45 2.8.9GIF格式46 2.8.10GIF格式的背景透明效果46 2.9ImageMagick47 2.9.1安装ImageMagick47 2.9.2安装magick47 2.9.3ImageMagick的用例47 2.9.4制作透明背景的GIF图片48 2.10读取或写入图像48 2.10.1读取图像48 2.10.2写入图像49 2.10.3设置或返回读取图像的路径50 2.10.4返回图像信息50 2.10.5管理支持的图像格式51 2.10.6Octave默认支持处理的图像格式53 2.11显示图像54 2.11.1以基础方式显示图像54 2.11.2将图像矩阵显示为图像54 2.11.3以缩放模式显示图像54 2.12转换图像类型55 2.12.1将图像转换为double格式55 2.12.2将灰度图像或黑白图像转换为索引图像55 2.12.3将索引图像转换为灰度图像或黑白图像56 2.12.4将RGB图像转换为索引图像56 2.12.5将索引图像转换为RGB图像56 2.13将模型放置于真实的背景画面上56 2.13.1预览AR画面57 2.13.2背景画面为视频时的处理方法57 2.13.3加快视频的处理速度57 2.14放置模型应用58 2.14.1放置模型应用原型设计58 2.14.2放置模型应用视图代码设计58 2.14.3放置模型应用属性代码设计62 2.14.4放置模型应用回调函数代码设计69 2.14.5选择图像文件74 2.14.6将视频解压为图片78 2.14.7生成输出文件名或文件夹79 2.14.8初始化轴对象81 2.14.9设置轴对象的宽高比82 2.14.10生成预览图片或视频83 2.14.11更新AR画面的预览效果90 2.14.12实际采用的视频预处理方式和处理方式92 2.15日志功能94 2.15.1日志的原理94 2.15.2日志级别94 2.15.3日志格式95 2.15.4日志持久化96 2.15.5实例化日志对象96 2.15.6日志类97 2.15.7在放置模型应用中使用日志类101 第3章位姿103 3.1位姿在不同坐标系下的数学表述103 3.1.1球面角103 3.1.2球面坐标103 3.1.3欧拉角103 3.1.4RPY角104 3.2计算几何相关知识104 3.2.1两点求角度104 3.2.2三点求角度104 3.3力学相关知识104 3.3.1质点104 3.3.2质点系104 3.3.3质心104 3.3.4质心运动定理105 3.3.5刚体105 3.4旋转矩阵105 3.4.1旋转矩阵的用法105 3.4.2欧拉角与旋转矩阵的变换106 3.4.3根据旋转角度创建旋转矩阵107 3.4.4根据旋转矩阵计算转轴或旋转角度107 3.5仿射变换108 3.5.1平移变换108 3.5.2缩放变换108 3.5.3剪切变换108 3.5.4旋转变换109 3.5.5仿射变换矩阵的尺寸描述109 3.6Octave的空间变换函数110 3.6.1安装image工具箱110 3.6.2实例化仿射变换对象110 3.6.3根据仿射变换对象进行仿射变换112 3.6.4根据仿射变换对象进行仿射变换的逆变换112 3.6.5推断仿射变换矩阵112 3.6.6裁剪图像函数114 3.6.7缩放图像函数114 3.6.8旋转图像函数115 3.6.9快速旋转和缩放图像函数116 3.6.10透视变换函数116 3.6.11高斯金字塔函数117 3.6.12重新映射图像函数117 3.6.13剪切变换函数118 3.6.14平移变换函数119 3.7ImageMagick的空间变换命令119 3.7.1resize参数119 3.7.2geometry参数121 3.7.3thumbnail参数121 3.7.4sample参数122 3.7.5scale参数122 3.7.6filter参数122 3.7.7magnify参数123 3.7.8adaptiveresize参数123 3.7.9interpolate参数123 3.7.10interpolativeresize参数123 3.7.11distort参数123 3.7.12+distort参数131 3.8通过GUI控制模型的位姿132 3.8.1控制模型的位姿应用原型设计132 3.8.2控制模型的位姿应用视图代码设计133 3.8.3控制模型的位姿应用回调函数代码设计139 3.8.4位姿的默认值142 第4章投影144 4.1平行投影和透视投影144 4.2建立模型的边界盒145 4.2.1判断边界145 4.2.2hggroup146 4.2.3图形对象定位148 4.2.4根据边界点的位置绘制边界盒150 4.2.5自动确定模型的边界150 4.2.6在模型类中添加绘制边界盒功能157 4.3将二维模型投影为三维模型160 4.4Octave的相机概念164 4.4.1相机位置165 4.4.2相机目标165 4.4.3相机视角165 4.4.4轴对象的方向166 4.5更改三维模型的投影效果167 4.5.1视点变换167 4.5.2观察点变换167 4.6通过GUI控制模型的投影效果167 4.6.1控制投影效果应用原型设计168 4.6.2控制投影效果应用视图代码设计168 4.6.3更新模型文件的预览效果172 4.6.4显示当前的选项值174 4.6.5修改当前的选项值176 4.6.6保存模型文件的预览效果179 第5章畸变182 5.1图像畸变182 5.1.1径向畸变182 5.1.2桶形畸变和枕形畸变182 5.1.3切向畸变183 5.2Hugin183 5.2.1安装Hugin183 5.2.2Hugin镜头校准的默认状态184 5.2.3Hugin镜头校准的镜头类型184 5.2.4Hugin镜头校准的图片要求185 5.2.5Hugin镜头校准的必选参数185 5.2.6Hugin镜头校准的可选参数185 5.2.7Hugin镜头校准的常见错误185 5.2.8Hugin镜头校准的预览功能185 5.2.9Hugin保存镜头186 5.3kalibr188 5.3.1kalibr在Docker之下安装并校准相机188 5.3.2kalibr源码安装并校准相机189 5.3.3kalibr以ROS包的格式收集数据190 5.3.4kalibr校准多个相机190 5.3.5kalibr校准带IMU的相机191 5.3.6kalibr校准多个IMU193 5.3.7kalibr校准滚动快门相机194 5.3.8kalibr对优化校准结果的改进建议194 5.3.9kalibr使用数据集校准194 5.3.10kalibr支持的相机模型194 5.3.11kalibr支持的畸变模型195 5.3.12kalibr支持的校准目标195 5.3.13kalibr设置相机焦点196 5.3.14kalibr校准验证器197 5.3.15kalibr配合ROS 2使用197 5.4畸变的校准197 5.4.1用现成的参数校准畸变197 5.4.2用Hugin校准畸变198 5.5畸变的矫正200 5.5.1用校准参数矫正畸变200 5.5.2用坐标映射矫正畸变202 5.6通过GUI控制矫正效果205 5.6.1控制矫正效果应用原型设计205 5.6.2控制矫正效果应用视图代码设计206 5.6.3控制矫正效果应用回调函数代码设计211 5.6.4校准参数的默认值214 第6章计算机视觉216 6.1Canny边缘检测216 6.2Hough直线检测217 6.3自适应局部图像阈值处理218 6.4SIFT算法218 6.4.1高斯金字塔218 6.4.2高斯尺度空间219 6.4.3DoG空间219 6.4.4SIFT特征点定位220 6.4.5SIFT特征点方向220 6.4.6SIFT特征匹配221 6.5SURF算法221 6.5.1SURF算法和SIFT算法的区别221 6.5.2积分图像222 6.5.3构造Hessian矩阵222 6.5.4用盒子滤波器代替高斯滤波器223 6.5.5SURF特征点定位223 6.5.6SURF特征点方向分配223 6.5.7SURF特征匹配224 6.6生成图像处理时需要的特殊矩阵224 6.6.1生成均值滤波器224 6.6.2生成圆形区域均值滤波器225 6.6.3生成高斯滤波器226 6.6.4生成高斯拉普拉斯算子227 6.6.5生成拉普拉斯算子228 6.6.6生成锐化算子228 6.6.7生成运动模糊算子229 6.6.8生成Sobel算子229 6.6.9生成Prewitt算子230 6.6.10生成Kirsch算子230 6.7ImageMagick的计算机视觉变换命令230 6.7.1edge参数230 6.7.2canny参数231 6.7.3houghlines参数231 6.7.4lat参数231 6.8文件扩展名为oct的程序231 6.8.1编译oct程序232 6.8.2编译oct程序时支持的可选参数232 6.8.3编译oct程序时支持的环境变量234 6.9PCL库235 6.9.1安装PCL库235 6.9.2PCL库的点的类型236 6.9.3在Octave中使用PCL库238 6.10点云模型239 6.10.1点云模型的概念239 6.10.2点云模型的存储格式239 6.10.3读取PCD模型240 6.10.4写入PCD模型241 6.10.5PCD模型可视化242 6.10.6OpenNI点云捕捉247 6.10.7点云分割248 6.11通过GUI控制计算机视觉变换效果252 6.11.1控制计算机视觉变换效果应用原型设计252 6.11.2控制计算机视觉变换效果应用视图代码设计256 6.11.3控制计算机视觉变换效果应用回调函数代码设计262 6.11.4计算机视觉变换参数的默认值266 6.11.5显示当前修改的参数267 6.11.6计算机视觉变换的关联关系269 6.11.7计算机视觉变换的流程272 6.12OctoMap279 6.12.1OctoMap源码安装280 6.12.2OctoMap通过vcpkg安装280 6.12.3octomap ROS包的用法281 6.12.4octomap_rviz_plugins281 6.13Caffe281 6.13.1Caffe源码安装281 6.13.2Caffe使用Docker安装283 6.13.3Caffe训练MNIST模型283 6.13.4Caffe训练ImageNet模型287 6.14SOLD2288 6.14.1SOLD2源码安装288 6.14.2SOLD2使用pip安装288 6.14.3SOLD2训练模型288 6.14.4SOLD2使用模型289 6.15YOLOv5290 6.15.1YOLOv5源码安装290 6.15.2YOLOv5推断290 6.15.3YOLOv5使用detect.py推断291 6.15.4在其他应用中使用YOLOv5291 6.15.5YOLOv5数据集训练292 6.16YOLOv8292 6.16.1YOLOv8源码安装292 6.16.2YOLOv8的模式293 6.16.3YOLOv8的CLI模式293 6.16.4YOLOv8的Python模式298 6.16.5YOLOv8的三大组件300 6.17Fast RCNN303 6.17.1Fast RCNN源码安装304 6.17.2Fast RCNN运行用例304 第7章硬件选型与AR算法306 7.1相机选型306 7.1.1单目相机和双目相机306 7.1.2景深相机307 7.1.3全景相机307 7.1.4柱面全景相机308 7.1.5网络摄像头308 7.2镜头选型308 7.2.1变焦镜头和定焦镜头308 7.2.2正圆镜头和椭圆镜头309 7.2.3不同焦段的镜头309 7.2.4不同视角的镜头309 7.2.5标准镜头309 7.2.6广角镜头309 7.2.7长焦镜头310 7.2.8鱼眼镜头310 7.2.9微距镜头310 7.2.10移轴镜头310 7.2.11折返镜头310 7.3IMU选型311 7.3.13轴IMU311 7.3.26轴IMU311 7.3.39轴IMU312 7.3.4不同精度的IMU312 7.3.5不同封装的IMU312 7.4激光雷达选型312 7.4.1不同线数的激光雷达313 7.4.2不同记录光能方式的激光雷达313 7.4.3不同工作条件的激光雷达313 7.5声呐选型313 7.5.1不同频率的声呐313 7.5.2不同记录声波方式的声呐314 7.5.3不同扫描方式的声呐314 7.5.4数字成像声呐315 7.5.5数字剖面声呐315 7.6机器人选型315 7.6.1常用的机器人315 7.6.2不同连接方式的机器人315 7.6.3不同移动性的机器人316 7.6.4不同控制方式的机器人316 7.6.5不同几何结构的机器人316 7.6.6不同智能程度的机器人316 7.6.7不同用途的机器人316 7.7AR算法中的景深317 7.8点云处理算法317 7.8.1点云反射317 7.8.2点云降噪317 7.8.3点云分类318 7.8.4体素滤波器318 7.9里程计算法319 7.9.1不同传感器的里程计319 7.9.2不同参考图像或参考点的里程计320 7.9.3里程计的传感器融合320 7.10建图算法320 7.10.1状态估计320 7.10.2回环检测321 7.10.3在线建图321 7.10.4离线建图322 7.11路径规划算法322 7.11.1A算法322 7.11.2Dijkstra算法322 7.11.3RRT算法322 7.11.4D算法322 第8章倾斜摄影323 8.1倾斜摄影技术的特点323 8.2倾斜摄影的图像特点324 8.3倾斜摄影方式325 8.4倾斜摄影的遮挡关系325 8.5倾斜摄影的相机326 8.6倾斜摄影的相机选型329 第9章SLAM算法入门331 9.1SLAM算法的流程331 9.2instrumentcontrol332 9.2.1常用函数332 9.2.2通用函数335 9.2.3GPIB335 9.2.4I2C339 9.2.5MODBUS341 9.2.6并口344 9.2.7串口346 9.2.8新版串口352 9.2.9SPI357 9.2.10TCP360 9.2.11TCP客户端363 9.2.12TCP服务器端365 9.2.13UDP367 9.2.14UDP端口371 9.2.15USBTMC375 9.2.16VXI11377 9.3SLAM算法的分类379 9.3.1不同硬件的SLAM算法379 9.3.2二维SLAM和三维SLAM380 9.3.3紧耦合SLAM和松耦合SLAM380 9.3.4室内SLAM和室外SLAM381 9.3.5不同微调方式的SLAM381 9.4SLAM算法实战381 第10章SLAM算法的常用库393 10.1Protobuf393 10.1.1Protobuf源码安装393 10.1.2Protobuf通过DNF软件源安装394 10.1.3Protobuf用法394 10.2g2o396 10.2.1g2o源码安装397 10.2.2g2o的文件格式398 10.2.3g2o的基本用法398 10.2.4g2o运行用例400 10.2.5g2o的拟合命令404 10.2.6g2o的输出命令409 10.2.7g2o的转换命令411 10.2.8g2o制造数据411 10.2.9g2o的模拟器命令416 10.2.10g2o的优化命令418 10.2.11g2o的校准命令421 10.2.12g2o的GUI命令422 10.3g2opy427 10.3.1g2opy源码安装427 10.3.2g2opy用法428 10.4ROS428 10.4.1ROS 1源码安装428 10.4.2ROS 2源码安装429 10.4.3使用Docker安装ROS 1430 10.4.4使用Docker安装ROS 2430 10.4.5离线访问rosdistro431 10.4.6ROS包初始化环境变量432 10.4.7ROS 1版本更新432 10.4.8ROS 2版本更新433 10.4.9ROS的发行版434 10.5rviz434 10.5.1rviz初始化环境变量434 10.5.2rviz主界面操作435 10.5.3rviz支持的界面类型435 10.5.4rviz的配置文件436 10.5.5rviz在预览时支持的鼠标操作437 10.5.6rviz的键盘操作选项438 10.5.7rviz管理插件438 10.6GLClib438 10.6.1GLClib源码安装439 10.6.2GLClib运行用例439 10.7GLCPlayer 440 10.7.1GLCPlayer源码安装440 10.7.2安装GLCPlayer的Windows安装包441 10.7.3GLCPlayer的主界面441 10.7.4GLCPlayer的用法445 10.8Pangolin451 10.8.1Pangolin支持的主要特性451 10.8.2Pangolin源码安装451 10.9TEASER++452 10.9.1TEASER++源码安装452 10.9.2TEASER++运行用例454 10.10Ceres解算器454 10.10.1Ceres解算器源码安装454 10.10.2Ceres解算器通过DNF软件源安装456 10.10.3Ceres解算器通过vcpkg安装456 10.10.4Ceres解算器使用BAL数据集456 10.11Kindr456 10.11.1Kindr源码安装456 10.11.2Kindr使用catkin安装457 10.11.3Kindr二次开发457 10.11.4Kindr编译文档458 10.12Sophus458 10.12.1Sophus源码安装458 10.12.2Sophus安装Python的包应用458 10.12.3Sophus的C++常用函数和方法459 10.12.4Sophus的Python常用函数和方法459 第11章开源的SLAM算法实现462 11.1OKVIS462 11.1.1OKVIS源码安装462 11.1.2OKVIS运行用例464 11.1.3OKVIS的输出数据464 11.1.4OKVIS的配置文件464 11.1.5OKVIS对校准相机的要求466 11.1.6OKVIS二次开发466 11.2VINSMono467 11.2.1VINSMono源码安装467 11.2.2VINSMono使用视觉惯性里程计和姿态图数据集467 11.2.3VINSMono建图合并468 11.2.4VINSMono建图输入/输出468 11.2.5VINSMono AR演示468 11.2.6VINSMono使用相机468 11.2.7VINSMono在不同相机上的表现469 11.2.8VINSMono在Docker之下安装469 11.3ROVIO469 11.3.1ROVIO源码安装470 11.3.2ROVIO相机内参470 11.3.3ROVIO的配置文件471 11.3.4ROVIO通过校准方式获取相机内参471 11.4MSCKF_VIO471 11.4.1MSCKF_VIO源码安装471 11.4.2MSCKF_VIO校准472 11.4.3MSCKF_VIO使用数据集472 11.4.4MSCKF_VIO的ROS节点473 11.5ORBSLAM473 11.5.1ORBSLAM源码安装474 11.5.2ORBSLAM的用法475 11.5.3ORBSLAM的设置文件475 11.5.4ORBSLAM结果失败的总结475 11.6ORBSLAM2476 11.6.1ORBSLAM2源码安装476 11.6.2ORBSLAM2的单目相机用例477 11.6.3ORBSLAM2的双目相机用例477 11.6.4ORBSLAM2的景深相机用例478 11.6.5ORBSLAM2编译ROS包478 11.6.6ORBSLAM2的ROS包的用法478 11.6.7ORBSLAM2的模式479 11.7ORBSLAM3479 11.7.1ORBSLAM3源码安装479 11.7.2ORBSLAM3配置相机480 11.7.3ORBSLAM3执行用例480 11.7.4ORBSLAM3编译ROS包480 11.7.5ORBSLAM3的ROS包的用法480 11.7.6ORBSLAM3分析运行时间481 11.7.7ORBSLAM3相机校准481 11.8Cube SLAM481 11.8.1Cube SLAM的模式481 11.8.2Cube SLAM源码安装482 11.8.3Cube SLAM的ROS包的用法482 11.8.4Cube SLAM的注意事项483 11.9DSSLAM483 11.9.1DSSLAM源码安装483 11.9.2DSSLAM使用TUM数据集484 11.9.3DSSLAM的目录结构484 11.10DynaSLAM484 11.10.1DynaSLAM源码安装485 11.10.2DynaSLAM使用景深相机和TUM数据集485 11.10.3DynaSLAM使用双目相机和KITTI数据集486 11.10.4DynaSLAM使用单目相机和TUM数据集486 11.10.5DynaSLAM使用单目相机和KITTI数据集486 11.11DXSLAM486 11.11.1DXSLAM源码安装486 11.11.2DXSLAM使用TUM数据集487 11.11.3DXSLAM配置相机487 11.11.4DXSLAM的模式488 11.12LSDSLAM488 11.12.1LSDSLAM源码安装488 11.12.2LSDSLAM的ROS包489 11.12.3LSDSLAM使用相机489 11.12.4LSDSLAM使用数据集489 11.12.5LSDSLAM的校准文件489 11.12.6LSDSLAM的键盘操作选项490 11.12.7LSDSLAM动态调节参数490 11.12.8LSDSLAM对优化结果的改进建议491 11.12.9LSDSLAM查看器492 11.12.10LSDSLAM查看器的键盘操作选项492 11.12.11LSDSLAM查看器动态调节参数493 11.13GTSAM494 11.13.1GTSAM源码安装494 11.13.2GTSAM的用法496 11.13.3GTSAM的包应用496 11.13.4GTSAM的包应用运行用例497 11.13.5GTSAM对提升性能的改进建议498 11.14Limo498 11.14.1Limo源码安装499 11.14.2Limo在Docker之下安装499 11.14.3Limo在Docker之下安装语义分割功能500 11.14.4Limo的核心库500 11.14.5Limo使用数据集500 11.15LeGOLOAM501 11.15.1LeGOLOAM源码安装501 11.15.2LeGOLOAM的外部变量502 11.15.3LeGOLOAM使用ROS包502 11.16SCLeGOLOAM503 11.16.1SCLeGOLOAM源码安装503 11.16.2SCLeGOLOAM使用ROS包503 11.17MULLS503 11.17.1MULLS源码安装504 11.17.2MULLS运行用例505 11.17.3MULLS使用数据集506 11.17.4MULLS的键盘操作选项506 11.17.5MULLS的SLAM参数508 11.17.6MULLS保存结果的首选项511 第12章贴图512 12.1补丁对象512 12.1.1由单个多边形构成的补丁对象512 12.1.2由多个多边形构成的补丁对象513 12.1.3使用多个补丁对象绘图513 12.2面对象514 12.2.1由单个面构成的面对象514 12.2.2由多个面构成的面对象515 12.2.3使用多个面对象绘图516 12.3颜色图517 12.3.1Octave的内置颜色图517 12.3.2查看颜色图518 12.3.3查看色谱519 12.3.4颜色调节520 12.3.5颜色设计521 12.4颜色图插值523 12.4.1interp1()函数523 12.4.2interp1()函数支持的插值方式523 12.4.3其他的一维插值函数524 12.5颜色图重采样525 12.5.1颜色图向下采样525 12.5.2颜色图向上采样526 12.6颜色条526 12.6.1显示颜色条526 12.6.2指定颜色条的绘制位置526 12.6.3删除颜色条527 12.7按坐标上色528 12.7.1fill3()函数528 12.7.2fill3()函数支持的其他参数529 12.7.3按坐标上色和其他对象的关系529 12.8使用颜色图上色529 12.9网格和网格面529 12.9.1创建网格530 12.9.2绘制网格面534 12.9.3特殊的网格面536 12.9.4网格面和其他对象的关系536 12.10光照效果536 12.10.1构造光源对象536 12.10.2光源对象的数量限制537 12.10.3光源对象对其他对象的影响538 12.10.4光照效果对比538 12.10.5构造相机光源对象542 12.10.6内置的相机光源方向542 12.10.7精确的相机光源方向543 12.10.8指定相机光源的风格543 12.11材质543 12.11.1材质的尺度544 12.11.2Octave的内置材质544 12.11.3修改材质544 12.11.4材质设计545 12.12贴图实战案例545 第13章推流和拉流551 13.1推流时使用的网络协议551 13.1.1HTTP551 13.1.2RTMP551 13.1.3RTSP552 13.1.4RTP552 13.1.5TCP553 13.1.6UDP553 13.2Nginx553 13.2.1带插件编译并安装Nginx554 13.2.2启动和停止Nginx555 13.2.3安装HLS库555 13.2.4Nginx的RTMP配置556 13.3rtspsimpleserver556 13.3.1安装rtspsimpleserver556 13.3.2rtspsimpleserver的用法557 13.4使用FFmpeg推流558 13.4.1FFmpeg推流媒体文件558 13.4.2FFmpeg转流558 13.4.3FFmpeg支持的网络协议559 13.4.4FFmpeg指定编译选项559 13.4.5FFmpeg编译第三方库559 13.5libx264编码器561 13.6推流的分类561 13.6.1点对点推流561 13.6.2广播式推流562 13.7常用的拉流客户端562 13.7.1VLC562 13.7.2mplayer562 13.7.3mpv563 13.8推流工具类563 13.8.1推流工具类的构造方法563 13.8.2拼接推流命令565 13.8.3获取推流命令569 13.8.4发送推流命令569 13.9推流CLI应用571 13.10推流GUI应用573 13.10.1推流应用原型设计573 13.10.2推流应用视图代码设计574 13.10.3启动推流或停止推流577 13.10.4推流应用和推流工具类的配合逻辑581 13.10.5推流应用的优化逻辑583 13.11拉流应用585 13.11.1拉流应用原型设计585 13.11.2拉流应用视图代码设计586 13.11.3拉流应用回调函数代码设计589 13.12一体化部署592 13.12.1部署方案592 13.12.2rtspsimpleserver的端口配置592 13.12.3视频流属性代码设计593 13.12.4客户端提示字符串设计598 13.12.5推流应用和拉流应用共同运行599