我正在编写一个 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"); 步骤之后),但这似乎也没有帮助。
根据我得到的结果类型,当我要求它连续检测空格键的使用时,感觉这些错误与代码以意想不到的方式循环有关。我认为计算机要么在按一次空格键后重复循环,要么完全跳行,但我无法弄清楚问题出在哪里,并且不太确定如何调试它。
正如昨天在 Reddit 上建议的那样,您应该通过添加 setKeyDown("none") 来限制按键时间:
if (isKeyDown("space")) {
setKeyDown("none");
// then here comes the action code
}
但是您的代码中还有更多内容需要修改。