图书目录

目录

第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.1resize参数119

3.7.2geometry参数121

3.7.3thumbnail参数121

3.7.4sample参数122

3.7.5scale参数122

3.7.6filter参数122

3.7.7magnify参数123

3.7.8adaptiveresize参数123

3.7.9interpolate参数123

3.7.10interpolativeresize参数123

3.7.11distort参数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.1edge参数230

6.7.2canny参数231

6.7.3houghlines参数231

6.7.4lat参数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 RCNN303

6.17.1Fast RCNN源码安装304

6.17.2Fast RCNN运行用例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.2instrumentcontrol332

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.16VXI11377

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.6GLClib438

10.6.1GLClib源码安装439

10.6.2GLClib运行用例439

10.7GLCPlayer 440

10.7.1GLCPlayer源码安装440

10.7.2安装GLCPlayer的Windows安装包441

10.7.3GLCPlayer的主界面441

10.7.4GLCPlayer的用法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.2VINSMono467

11.2.1VINSMono源码安装467

11.2.2VINSMono使用视觉惯性里程计和姿态图数据集467

11.2.3VINSMono建图合并468

11.2.4VINSMono建图输入/输出468

11.2.5VINSMono AR演示468

11.2.6VINSMono使用相机468

11.2.7VINSMono在不同相机上的表现469

11.2.8VINSMono在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.5ORBSLAM473

11.5.1ORBSLAM源码安装474

11.5.2ORBSLAM的用法475

11.5.3ORBSLAM的设置文件475

11.5.4ORBSLAM结果失败的总结475

11.6ORBSLAM2476

11.6.1ORBSLAM2源码安装476

11.6.2ORBSLAM2的单目相机用例477

11.6.3ORBSLAM2的双目相机用例477

11.6.4ORBSLAM2的景深相机用例478

11.6.5ORBSLAM2编译ROS包478

11.6.6ORBSLAM2的ROS包的用法478

11.6.7ORBSLAM2的模式479

11.7ORBSLAM3479

11.7.1ORBSLAM3源码安装479

11.7.2ORBSLAM3配置相机480

11.7.3ORBSLAM3执行用例480

11.7.4ORBSLAM3编译ROS包480

11.7.5ORBSLAM3的ROS包的用法480

11.7.6ORBSLAM3分析运行时间481

11.7.7ORBSLAM3相机校准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.9DSSLAM483

11.9.1DSSLAM源码安装483

11.9.2DSSLAM使用TUM数据集484

11.9.3DSSLAM的目录结构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.12LSDSLAM488

11.12.1LSDSLAM源码安装488

11.12.2LSDSLAM的ROS包489

11.12.3LSDSLAM使用相机489

11.12.4LSDSLAM使用数据集489

11.12.5LSDSLAM的校准文件489

11.12.6LSDSLAM的键盘操作选项490

11.12.7LSDSLAM动态调节参数490

11.12.8LSDSLAM对优化结果的改进建议491

11.12.9LSDSLAM查看器492

11.12.10LSDSLAM查看器的键盘操作选项492

11.12.11LSDSLAM查看器动态调节参数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.15LeGOLOAM501

11.15.1LeGOLOAM源码安装501

11.15.2LeGOLOAM的外部变量502

11.15.3LeGOLOAM使用ROS包502

11.16SCLeGOLOAM503

11.16.1SCLeGOLOAM源码安装503

11.16.2SCLeGOLOAM使用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.3rtspsimpleserver556

13.3.1安装rtspsimpleserver556

13.3.2rtspsimpleserver的用法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.2rtspsimpleserver的端口配置592

13.12.3视频流属性代码设计593

13.12.4客户端提示字符串设计598

13.12.5推流应用和拉流应用共同运行599