1.搭建VM方案如下
2.代码如下
#include"pch.h"
#include<QAxWidget>
#include<QApplication>
using namespace VisionMasterSDK;
using namespace VisionMasterSDK::VmSolution;
using namespace VisionMasterSDK::VmProcedure;
using namespace VisionMasterSDK::ImageSourceModule;
using namespace VisionMasterSDK::IMVSCircleFindModu;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//初始化COM组件,VmRenderControlWinform
QAxWidget *widget = widget = new QAxWidget;
widget->setControl("{313241a6-62f9-464b-bede-f514827e2f4b}");
//这里有坑,在方案之前调用没问题,如果在后面调用就要在获取图像源之后,具体可测试
widget->dynamicCall("GetObjectPointer()");
//获取解决方案
IVmSolution *solution = LoadSolution("G:/Temp/VMQTTest/solution.sol", "");
if(solution)
{
//运行一次方案
solution->Run();
//得到图像源模块
ImageSourceModuleTool *sorceTool = (ImageSourceModuleTool *)(*solution)["流程1.图像源1"];
//获取圆查找
IMVSCircleFindModuTool *circleTool = (IMVSCircleFindModuTool *)(*solution)["流程1.圆查找1"];
if(sorceTool && circleTool)
{
//获取图像源结果
ImageSourceResults *result = sorceTool->GetResult();
CircleFindResults *circleRes = circleTool->GetResult();
if(result && circleRes)
{
//得到图像信息
ImageBaseData baseData = result->GetImageData();
qlonglong pData = (qlonglong)(&baseData);
widget->dynamicCall("SetImageSourceData(qlonglong)", pData);
//获取圆信息,此处有坑
CircleEx circleInfo;
circleInfo.CenterX = circleRes->GetCircleCenter().fX;
circleInfo.CenterY = circleRes->GetCircleCenter().fY;
circleInfo.MajorRadius = circleRes->GetCircleRadius();
circleInfo.MinorRadius = circleRes->GetCircleRadius();
int argb = 0;
argb += 100 << 16;
argb += 200 << 8;
argb += 150;
circleInfo.Color = argb;
circleInfo.FillColor = argb;
circleInfo.Opacity = 1;
circleInfo.StrokeThickness = 1;
//这里函数原型怎么来的,可以从dumpcpp工具生成.h和.cpp文件
qlonglong pCircleData = (qlonglong)(&circleInfo);
widget->dynamicCall("SetCircle(qlonglong)", pCircleData);
//这里用VM的组件显示图像
widget->show();
}
}
DestroySolutionInstance(solution);
}
return a.exec();
}
3.踩坑
CircleEx circleInfo;
这个结构体所在的头文件是VmControlBaseInfo.h,但是这个头文件不在海康安装目录
D:\HIKVISION\VM4.2.0\VisionMaster4.2.0\Development\V4.x\Includes
这个头文件所在目录有3个
D:\HIKVISION\VM4.2.0\VisionMaster4.2.0\Development\V4.x\ComControls\Includes\QT
D:\HIKVISION\VM4.2.0\VisionMaster4.2.0\Development\V4.x\ComControls\Includes\VS2013
D:\HIKVISION\VM4.2.0\VisionMaster4.2.0\Development\V4.x\ComControls\Includes\VS2017
所以添加头文件一定要注意
4.函数原型是怎么来的
//初始化COM组件,VmRenderControlWinform
QAxWidget *widget = widget = new QAxWidget;
widget->setControl("{313241a6-62f9-464b-bede-f514827e2f4b}");
这里使用qaxwidget加载了一个显示组件,对应的VmRenderControlWinform.dll
widget->dynamicCall("GetObjectPointer()");
widget->dynamicCall("SetImageSourceData(qlonglong)", pData);
widget->dynamicCall("SetCircle(qlonglong)", pCircleData);
这写函数原型是使用dumpcpp.exe工具从VmRenderControlWinform.dll中获取的
5.使用Qt自带的dumpcpp.exe工具
D:\QT\Qt5.14.2\5.14.2\msvc2017_64\bin 一般在这个文件里有dumpcpp.exe
把dumpcpp.exe复制到某个文件夹,比如G:\123
然后在VM安装目录D:\HIKVISION\VM4.2.0\VisionMaster4.2.0\Development\V4.x\ComControls\Libraries\win64
找到VmRenderControlWinform.tlb文件
同样复制到G:\123
此时打开命令行工具,进入文件夹G:\123
输入命令 dumpcpp VmRenderControlWinform.tlb
生成vmrendercontrolwinform.h vmrendercontrolwinform.cpp文件
打开vmrendercontrolwinform.h会找到
/*
Method GetObjectPointer
*/
inline qlonglong GetObjectPointer();
/*
Method SetCircle
*/
inline void SetCircle(qlonglong pCircle);
/*
Method SetImageSourceData
*/
inline void SetImageSourceData(qlonglong pImgData);
这就是前面dynamicCall()使用的函数原型。
6.运行效果
可以看到一个绿色的圆圈,这就是从“圆查找”模块提取到的信息。