使用 C++ 在 dm 脚本中加速霍夫变换算法
Accelerating hough transform algorithm in dm script using C++
最近我尝试运行 Vincent Hou 的https://www.felmi-zfe.at/dm_script/ 霍夫变换脚本用于图像(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 class 没有定义 [] 运算符。所以我对上面的代码做了注释。
所以这是我的问题:
- 对于如何将注释行转换为 C++ 代码有什么建议吗?
- DMSDK有没有办法从Gatan::DM::Imageclass获取数据,或者把这个class转成二维数组(指向数组的数组指针)?
这实际上不是 DM 脚本问题,但如果您想在 SDK 中计算图像数组,则必须处理本机的底层数字数组(它是 1D 和特定数字类型。)
在 SDK 示例中可以找到这方面的典型代码,特别是在函数 void PassRealImagePtr( DM_ImageToken image_token )
中的 DMSDK\LibrarySuite\LibrarySuite.cpp
获取传入的图像令牌,从中初始化图像对象。然后在图像上创建一个数据锁,以访问指向本机数据数组的指针。需要将指针转换为适当的数字类型。
最近我尝试运行 Vincent Hou 的https://www.felmi-zfe.at/dm_script/ 霍夫变换脚本用于图像(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 class 没有定义 [] 运算符。所以我对上面的代码做了注释。 所以这是我的问题:
- 对于如何将注释行转换为 C++ 代码有什么建议吗?
- DMSDK有没有办法从Gatan::DM::Imageclass获取数据,或者把这个class转成二维数组(指向数组的数组指针)?
这实际上不是 DM 脚本问题,但如果您想在 SDK 中计算图像数组,则必须处理本机的底层数字数组(它是 1D 和特定数字类型。)
在 SDK 示例中可以找到这方面的典型代码,特别是在函数 void PassRealImagePtr( DM_ImageToken image_token )
DMSDK\LibrarySuite\LibrarySuite.cpp
获取传入的图像令牌,从中初始化图像对象。然后在图像上创建一个数据锁,以访问指向本机数据数组的指针。需要将指针转换为适当的数字类型。