VisionMaster_提取查找圆信息并显示、dumpcpp工具踩坑

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.运行效果

可以看到一个绿色的圆圈,这就是从“圆查找”模块提取到的信息。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值