ImageJ Macro 中 while 循环的行为出现意外不一致

问题描述 投票:0回答:1

我正在编写一个 ImageJ 宏来帮助进行复杂的组织分析。该宏中的一个函数输入具有 3 个现有不重叠 ROI 的图像,等待用户手动选择新的 ROI 并通过按空格键确认其选择,然后检测用户的新 ROI 与哪些现有 ROI 重叠以确定新 ROI 的名称,然后保存 ROI 以测量其面积并将其覆盖在图像上。

例如,如果图像的 3 个现有 ROI 分别是 ROI_1、ROI_2 和 ROI_3,并且用户的新 ROI 与 ROI_2 重叠,则新 ROI 应保存为 ROI_2_NC。

下面是我的代码,适用于一个用户生成的 ROI。

while (true){ 
    if (isKeyDown("space") == true){ // user presses space after selecting an ROI

        roiManager("add");
        
        for (m = 0; m < 3; m++) { // cycle through the existing 3 ROIs in the image
            roiManager("Select", newArray(m,  roiManager("count")-1)); 
            roiManager("AND"); // look for overlaps
            if (selectionType() != -1) {
                roiManager("Deselect"); 
                lesionname = RoiManager.getName(m);
                roiManager("Select", roiManager("count")-1); // the newest ROI
                roiManager("Rename", lesionname + "_NC");
                roiManager("measure");
                Overlay.addSelection;
                break(); 
            }
            roiManager("Deselect"); // make sure we are starting again from scratch
        }
    }
    break();
    wait(100); // protects against multiple detection of single keystroke
}
print("done");

但是,我希望允许用户在此图像中选择任意数量的 ROI(每次按空格键),直到他们选择退出(按 ALT)。

我尝试在break()之前添加对ALT的要求;退出 while 循环的命令,如下(粗体新增):

while (true){ 
    if (isKeyDown("space") == true){ // user presses space after selecting an ROI

        roiManager("add");
        
        for (m = 0; m < 3; m++) { // cycle through the existing 3 ROIs in the image
            roiManager("Select", newArray(m,  roiManager("count")-1)); 
            roiManager("AND"); // look for overlaps
            if (selectionType() != -1) {
                roiManager("Deselect"); 
                lesionname = RoiManager.getName(m);
                roiManager("Select", roiManager("count")-1); // the newest ROI
                roiManager("Rename", lesionname + "_NC");
                roiManager("measure");
                Overlay.addSelection;
                break(); 
            }
            roiManager("Deselect"); // make sure we are starting again from scratch
        }
    }
        **if (isKeyDown("alt") == true) { 
        break(); // exits out of while loop
    }**
    wait(100); // protects against multiple detection of single keystroke
}
print("done");

添加允许我多次按空格键,但导致代码前面部分出现一些意外的不一致。现在,当我按空格键时,有时新选择的 ROI 会被添加多次(当发生这种情况时,只有最后添加的 ROI 会被重命名),有时新的 ROI 要么不会被测量,要么会被测量多次,或者不会被测量。不作为叠加层添加。我认为长时间按下空格键会让事情变得更糟,但我尝试将等待时间延长到 wait(1000),这并不能完全防止这些不一致的发生,并且使宏在使用时感觉非常滞后。我还尝试将 wait 命令移到代码中的更高位置(在 roiManager("add"); 步骤下或在 roiManager("measure"); 步骤之后),但这似乎也没有帮助。

根据我得到的结果类型,当我要求它连续检测空格键的使用时,感觉这些错误与代码以意想不到的方式循环有关。我认为计算机要么在按一次空格键后重复循环,要么完全跳行,但我无法弄清楚问题出在哪里,并且不太确定如何调试它。

while-loop macros imagej onkeydown imagej-macro
1个回答
0
投票

正如昨天在 Reddit 上建议的那样,您应该通过添加 setKeyDown("none") 来限制按键时间:

   if (isKeyDown("space")) {
      setKeyDown("none");
      // then here comes the action code
   }

但是您的代码中还有更多内容需要修改。

© www.soinside.com 2019 - 2024. All rights reserved.