【问题标题】:Accelerating hough transform algorithm in dm script using C++使用 C++ 在 dm 脚本中加速霍夫变换算法
【发布时间】:2020-06-21 16:10:29
【问题描述】:

最近我尝试在https://www.felmi-zfe.at/dm_script/ 中运行 Vincent Hou 的 Hough 变换脚本以获得图像 (1024*1024)。该脚本在我的计算机上大约需要 4 分钟。然后我尝试使用 Gatan DMSDK 中的 sampleInterface 示例将 dm 脚本转换为 C++ 文件并将其编译为 DM 插件,然后尝试再次为同一图像运行它。时间消耗仅减少了 7 秒。我对这个结果不太满意。然后我查看了生成的代码,发现霍夫变换算法的主要部分仍在 dm-script 中。没有为此生成 C++。只是生成了一些界面。

然后我尝试在 C++ 中实现 dm 脚本。但是我发现很难将 dm-script 的某些功能翻译成 C++。

第一个是如何将imgHT[ HT_Col, y0 + tho_ratio*((iRow-y0)*sint+(iCol-x0)*cost) ] += source翻译成C++代码?我试过这个:

for (uint32 iRow = 0; iRow < size; iRow++)
{
    for (uint32 iCol = 0; iCol < size; iCol++)
    {
        //imgHT[HT_Col, y0 + tho_ratio * ((iRow - y0) * sint + (iCol - x0) * cost)] += source;
    }
}

但是没有为 Gatan::DM::Image 类定义 [] 运算符。所以我对上面的代码做了评论。 所以这是我的问题:

  1. 关于如何将注释行转换为 C++ 代码的任何建议?
  2. DMSDK 中是否有办法从 Gatan::DM::Image 类获取数据或将此类转换为二维数组(指向数组的数组指针)?

【问题讨论】:

    标签: c++ dm-script


    【解决方案1】:

    这实际上不是一个 DM 脚本问题,但如果您想在 SDK 中计算一个图像数组,您必须处理原生的底层数字数组(它是一维的并且是特定数字类型的)。​​

    在 SDK 示例中可以找到典型代码,特别是在函数 void PassRealImagePtr( DM_ImageToken image_token ) 中的 DMSDK\LibrarySuite\LibrarySuite.cpp

    获取一个传入的图像令牌,从中初始化图像对象。然后在图像上创建一个数据锁以访问指向本机数据数组的指针。需要将指针转换为适当的数字类型。

    【讨论】:

    • 非常感谢!它工作并大大减少了运行时间,从原来的 ~260s (dmscript) 到 ~3s。在我尝试 DMPluginStubs.h 中的 GetPixel 和 SetPixel 函数之前,但完成计算需要更长的时间(约 10000 秒)。使用image data-locker直接在内存中操作是最快的方法!
    • 是的,这是意料之中的。编译器将无法围绕代码中的 DM::... 调用进行优化。 GetPixel() 比图像表达式(也在脚本中)更糟糕,因为它为每次调用创建和释放图像访问数据锁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多