【发布时间】:2014-07-21 15:32:12
【问题描述】:
我正在开发一个从输入图像中检测人脸的项目。我正在使用带有Java的opencv。 我面临的问题如下
- 检测到的人脸将被放置在
JLabelssetIcon方法上。 - 第一次放置人脸,但对于下一张图像,之前的人脸不会被清除。
以下我尝试添加和删除面孔的代码
1) 添加人脸:
jFaceLabel 是初始化为大小 100 的 JLabel 数组 jpDetectedImage 是一个 JPanel,其中包含 JLabels(人脸)
jFaceLabel = new JLabel[100];
for(int index=0;index<ImageHandler.noOfDetections;index++){
jFaceLabel[index] = new JLabel();
jFaceLabel[index].setIcon(new ImageIcon("C://Users//Public//Pictures//Sample Pictures//TestPics//temp//"+index+".jpg"));
//jFaceLabel[index].setIcon(face);
int x = this.jpDetectedImage.getX() + (index%2) * 64 + 10 * ((index%2)+1);
int y = this.jpDetectedImage.getY() + (index/2) * 64 + 10 * ((index/2)+1);
jFaceLabel[index].setBounds(x, y, 64, 64);
this.jpDetectedImage.add(jFaceLabel[index]);
if(index>8 && (index%2==0)){
this.jpDetectedImage.setPreferredSize(new Dimension(
this.jpDetectedImage.getPreferredSize().width,
this.jpDetectedImage.getPreferredSize().height + 74
));
}
System.out.println("Placed : "+tempPath+"//"+index+".jpg");
}
jpDetectedImage.repaint();
2) 去除人脸:
for(int j=0;j<ImageHandler.noOfDetections;j++){
jFaceLabel[j].getParent().remove(jFaceLabel[j]);
}
this.jpDetectedImage.repaint();
问题是,第一次每个人脸都显示在 JLabels 上但连续检测人脸时,会导致旧人脸重叠。 检测到的人脸存储在物理路径中,并在加载检测图像时被删除。
我需要的是从 jpDetectedImage 面板中删除 jFaceLabel 数组,并为每个连续的检测阶段分配新的内存。
如何从 JPanel 中动态删除 JLabel 并使用新的 ImageIcon 再次添加它们?
【问题讨论】:
-
1) 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。 2)见Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是的。)(继续...)
-
(续...) 3) Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。 4) “请帮帮我!”请不要忘记提问。你的问题是什么?
-
“如何从 JPanel 中动态删除 JLabels 并使用新的 ImageIcon 再次添加它们?” 不要那样做。致电
setIcon或使用CardLayout。 -
@AndrewThompson 我尝试做同样的事情,但前一张脸没有被删除(尽管它被物理删除了)
标签: java swing opencv jpanel face-detection