在JPanel上显示检测到的面部

时间:2014-06-01 10:26:46

标签: java swing opencv jpanel face-detection

我正在开发一个用于检测输入图像中的面部的项目。我在Java上使用opencv。 我面临的问题如下:

  1. 检测到的面孔将放置在JLabel setIcon方法上。
  2. 首次放置面部,但对于下一个图像,不会清除前面的面部。
  3. 以下代码我试图添加和删除面

    1)添加面孔:

    jFaceLabel是JLabel数组,初始化为100 jpDetectedImage是一个JPanel,它包含JLabel(faces)

    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();
    

    问题是,第一次在JLabel上显示每个面部但连续检测到面部时,会导致旧面部重叠。 检测到的面部存储在物理路径中,并在加载检测图像时删除。

    我要求的是,从jpDetectedImage面板中删除jFaceLabel数组,并为每个连续的检测阶段分配新的内存。

    如何动态删除JPanel中的JLabel并使用新的ImageIcon再次添加它们?

1 个答案:

答案 0 :(得分:3)

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

image1

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

image2