【问题标题】:Displaying detected faces on a JPanel在 JPanel 上显示检测到的人脸
【发布时间】:2014-07-21 15:32:12
【问题描述】:

我正在开发一个从输入图像中检测人脸的项目。我正在使用带有Java的opencv。 我面临的问题如下

  1. 检测到的人脸将被放置在JLabels setIcon 方法上。
  2. 第一次放置人脸,但对于下一张图像,之前的人脸不会被清除。

以下我尝试添加和删除面孔的代码

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


【解决方案1】:

更好的方法是使用setIcon() 更新标签的图标,如here 所示。

一种不太灵活的替代方法是移除组件并验证容器,如 here 所示。

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2013-07-03
    • 2013-09-24
    • 2017-09-04
    • 1970-01-01
    • 2016-02-27
    • 2012-03-08
    • 2019-11-18
    • 2019-02-27
    相关资源
    最近更新 更多