文章目录
- 前言
- 一、视频分析环境配置
- 1.AI环境配置
- 2.开发环境配置
- 二、视频分析扩展代码
- 1.加载视频分析环境
- 2.目标检测
- 3.地理围栏分析
- 4.获取视频分析结果
前言
SuperMap iDesktopX 2024基于AI与AR技术,提供的视频分析功能,使得我们具备更强的视频感知能力,因而从视频中提取更为丰富的信息。视频分析模块提供了目标检测、车牌识别、围栏分析、轨迹提取,以及AR空间分析功能,包括缓冲区分析、空间查询、空气质量分析等,可将视频与GIS结合,在视频地图中提取更多的空间信息,并基于视频进行空间分析。以下是相关环境配置以及目标检测、地理围栏的示例代码。
一、视频分析环境配置
1.AI环境配置
在使用视频分析功能之前,需要先下载 SuperMap iDesktopX 的AI扩展包,并进行相关的环境配置,配置好环境后即可激活视频分析中的功能。具体环境配置可以参考:https://help.supermap.com/iDesktopX/zh/SpecialFeatures/ARMap/ARAnalysis/AREnvironmentConfiguration.html
2.开发环境配置
在iDea"Project Structure - Project Setting - Libraries"中引入以下依赖:
●%iDesktopX产品包%/bin/
●%iDesktopX产品包%/bundles/idesktop_bundles/
●%iDesktopX产品包%/bundles/require_bundles/
●%iDesktopX产品包%/lib/
二、视频分析扩展代码
1.加载视频分析环境
代码如下:
//加载OpenCV,用来解析视频LoadDllManager.loadDlls();//加载Python环境PythonUtilities.setPythonExecutor(new PythonDefaultExecutor());GlobalParameters.setHighPerformanceDetection(true);GlobalParameters.setSupportStartPythonProcess(false);VideoAnalystRegister.getInstance().register();//加载视频分析环境VideoPlayerPython videoPlayerPython = new VideoPlayerPython();videoPlayerPython.getVideoAnalystEnvironment();//打开空间化后的视频数据集Workspace workspace = new Workspace();String udbxPath = "F:\\Temp\\Video9SingleDatasetMultiVideo.udbx";DatasourceConnectionInfo datasourceConnectionInfo = new DatasourceConnectionInfo();datasourceConnectionInfo.setServer(udbxPath);datasourceConnectionInfo.setEngineType(EngineType.UDBX);datasourceConnectionInfo.setAlias(FileUtilities.getFileNameWithoutExtension(udbxPath));Datasource datasource = workspace.getDatasources().open(datasourceConnectionInfo);DatasetVector datasetVector = (DatasetVector) datasource.getDatasets().get("video9_1Video");//遍历视频数据集并提交为视频分析任务Recordset recordset = datasetVector.getRecordset(false,CursorType.STATIC);while (!recordset.isEOF()){VideoManager videoManager = new VideoManager(recordset);videoManager.build();recordset.moveNext();VideoAnalystExecuteEngine.getInstance().addVideoTask(new VideoTask(videoManager));}RecordsetUtilities.releaseRecordset(recordset);
2.目标检测
代码如下:
/** 目标检测代码* *///开启目标检测videoPlayerPython.getVideoAnalystEnvironment().startAnalyst(VideoAnalystFunctionKey.OBJECTION_DETECTION);VideoAnalystObjectDetection videoAnalystObjectDetection = (VideoAnalystObjectDetection) videoPlayerPython.getVideoAnalystEnvironment().getVideoAnalyst(VideoAnalystFunctionKey.OBJECTION_DETECTION);//设置房屋模型AnalystModel analystModel = AnalystModelManager.getInstance().getAnalystModel("TieTaFangWu");videoAnalystObjectDetection.getVideoAnalystParameter().setAnalystModel(analystModel);videoAnalystObjectDetection.getVideoAnalystParameter().getSupportObjectDetection().clear();//设置目标检测类型和结果绘制风格for (DetectionType detectionType : analystModel.getDetectionTypes()){videoAnalystObjectDetection.getVideoAnalystParameter().getSupportObjectDetection().put(detectionType.getStrType(), VideoAnalystUtilities.getObjectDetectionStyleByBackgroundColor(Color.GREEN));}
3.地理围栏分析
代码如下:
/** 地理围栏分析代码* *///开启围栏分析videoPlayerPython.getVideoAnalystEnvironment().startAnalyst(VideoAnalystFunctionKey.VIOLATION);//获取围栏分析实例VideoAnalystViolation videoAnalystViolation = (VideoAnalystViolation) videoPlayerPython.getVideoAnalystEnvironment().getVideoAnalyst(VideoAnalystFunctionKey.VIOLATION);VideoAnalystViolationParameter videoAnalystViolationParameter = videoAnalystViolation.getVideoAnalystParameter();//设置取证存过滤错误结果videoAnalystViolationParameter.setViolationIntersectAreaRatio(0.5);videoAnalystViolationParameter.setViolationOutputFolderPath("F:\\SuperMap\\result");videoAnalystViolationParameter.setOutputImageTimeInterval(1);//设置围栏分析规则DatasetVector selectedDataset = (DatasetVector) datasource.getDatasets().get("GengDi");videoAnalystViolationParameter.setViolationDatasetVector(selectedDataset);Geometry geometryByViolationExpression = VideoAnalystUtilities.getGeometryByViolationExpression(selectedDataset,"SmID>0");SpacialAnalystData spacialAnalystData = new SpacialAnalystData("耕地违建","SmID>0",geometryByViolationExpression,true);spacialAnalystData.setViolationJudgmentRule(ViolationJudgmentRule.INCLUDED);videoAnalystViolationParameter.getViolationData().add(spacialAnalystData);
4.获取视频分析结果
代码如下:
/** 获取视频分析结果* *///添加获取视频分析结果事件videoPlayerPython.getVideoAnalystEnvironment().addVideoAnalystResultChangedListener(new VideoAnalystResultChangedListener() {@Overridepublic void videoAnalystResultChanged(VideoAnalystResultChangedEvent videoAnalystResultChangedEvent) {//获取视频分析结果ArrayList<VideoAnalystResult> currentVideoAnalystResults = videoPlayerPython.getVideoAnalystEnvironment().getCurrentVideoAnalystResults();for (VideoAnalystResult currentVideoAnalystResult:currentVideoAnalystResults) {pushVideoAnalyst(currentVideoAnalystResult);}}});//执行分析任务VideoAnalystExecuteEngine.getInstance().addVideoPlayerPython(videoPlayerPython);VideoAnalystExecuteEngine.getInstance().run();