You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DM脚本实现连续STEM成像时逐帧调整光栅旋转角度?

如何用DM脚本实现逐帧旋转光栅的STEM连续采集?

我需要编写DM脚本,通过DigiScan实现STEM图像连续采集,要求每帧图像的光栅旋转角度逐帧增加(比如每次增加10度)。目前已写出基础脚本,但不清楚如何修改以实现角度逐帧递增,也不确定能否在连续采集间隙修改光栅旋转角度。

现有脚本如下:

Number paramID

Number width     = 512 // pixels
Number height    = 512 // pixels
Number rotation  = 0   // degrees
Number pixelTime = 3.2 // microseconds
Number lSynch = 0

paramID = DSCreateParameters( width, height, rotation, pixelTime, lSynch )

Number signalIndex = 0
Number dataDepth = 4 // bytes
Number selected = 1
Number dataDepth // 这里重复定义了变量,需要删除

Image dsImage
Number imageID

dsImage := IntegerImage( DSGetSignalName( signalIndex ), dataDepth, 0, width, height )
dsImage.ShowImage( )
imageID = dsImage.GetImageID( )

DSSetParametersSignal( paramID, signalIndex, dataDepth, selected, imageID )

Number continuous = 0
Number synchronous = 1 - continuous
Number nFrame = 10

while( iFrame < nFrame ){ // 这里未初始化iFrame,会报错
    DSStartAcquisition( paramID, continuous, synchronous )
    DSwaitUntilFinished( )

    // How to rotate STEM images here?
}

dsImage.DeleteImage( )
DSDeleteParameters( paramID )

解决方案

可以在每帧采集完成后修改光栅旋转角度,核心是利用DSModifyParameters函数更新已创建的采集参数,具体修改步骤如下:

  1. 初始化循环变量:在循环前添加Number iFrame = 0;,避免未定义变量报错
  2. 删除重复变量定义:去掉重复的Number dataDepth行
  3. 逐帧更新旋转角度:在采集完成后,递增rotation值,再调用DSModifyParameters更新参数
  4. 可选:保留每帧图像:如果需要保留所有帧,不要复用同一个dsImage,而是每帧创建新图像或复制当前图像后再更新

修改后的完整脚本:

Number paramID

Number width     = 512 // pixels
Number height    = 512 // pixels
Number rotation  = 0   // degrees
Number pixelTime = 3.2 // microseconds
Number lSynch = 0

paramID = DSCreateParameters( width, height, rotation, pixelTime, lSynch )

Number signalIndex = 0
Number dataDepth = 4 // bytes
Number selected = 1

Image dsImage
Number imageID

dsImage := IntegerImage( DSGetSignalName( signalIndex ), dataDepth, 0, width, height )
dsImage.ShowImage( )
imageID = dsImage.GetImageID( )

DSSetParametersSignal( paramID, signalIndex, dataDepth, selected, imageID )

Number continuous = 0
Number synchronous = 1 - continuous
Number nFrame = 10
Number iFrame = 0 // 初始化循环变量

while( iFrame < nFrame ){
    DSStartAcquisition( paramID, continuous, synchronous )
    DSwaitUntilFinished( )

    // 保存当前帧(可选,避免被下一帧覆盖)
    Image currentFrame := dsImage.ImageClone()
    currentFrame.SetName( "STEM Frame " + (iFrame+1) + " (Rotation: " + rotation + "°)" )
    currentFrame.ShowImage()

    // 更新旋转角度并修改采集参数
    rotation += 10
    DSModifyParameters( paramID, width, height, rotation, pixelTime, lSynch )

    iFrame += 1
}

dsImage.DeleteImage( )
DSDeleteParameters( paramID )

关键说明

  • 修改时机:必须在DSWaitUntilFinished()之后修改参数,确保当前帧采集完成,避免干扰正在进行的采集
  • 参数更新:DSModifyParameters用于修改已通过DSCreateParameters创建的参数集,这里只需要更新rotation值,其他参数保持不变即可
  • 图像保存:如果直接复用dsImage,新采集的帧会覆盖旧帧,添加克隆步骤可以保留每帧的原始数据
  • 角度范围:注意光栅旋转角度的硬件限制,避免超出设备允许的范围(通常0-360°)

内容的提问来源于stack exchange,提问作者kachigusa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:47:29