opencv中的背景减法(Java)

时间:2016-05-08 07:02:14

标签: java opencv background-subtraction

我有一个Java代码,可以检测到戴着手套的手(我戴着黑色手套)并根据我的手部动作移动光标。但问题是它也检测到背景中的所有黑色物体。我想用背景减法技术来隔离我的手。我有一个名为webcam的VideoCapture手柄。在while循环中,它从视频中检索帧并将这些帧作为参数传递给其他方法以执行轮廓检测等。我还想添加背景减法方法。我查了几个答案,但我找不到任何帮助我的东西。我是否需要为此安装opencv处理库(背景减法)?如果是,我该怎么做?

我是Java和OpenCV的新手。

我发布主要方法:

public static void main(String[] args) throws InterruptedException, AWTException {

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    video v=new video();
    VideoCapture webcam=new VideoCapture(0);
    webcam.set(Videoio.CV_CAP_PROP_FRAME_HEIGHT,768);
    webcam.set(Videoio.CV_CAP_PROP_FRAME_WIDTH,1024);
    v.setframe(webcam);
    Robot r=new Robot();
    Mat frame = new Mat();
    Mat modification=new Mat();
    Point center=new Point();   
    Point finger=new Point();           
    List<Point> buffer=new LinkedList<Point>();
    List<Point> bufferfingers=new LinkedList<Point>();
    List<Point> fingers=new LinkedList<Point>();    
    long temp=0;


    while(true && !close){

        if(!webcam.isOpened() && !close){
            System.out.println("Camera Error");
        }
        else{
            List<Point> defects=new LinkedList<Point>();    
            if(!close){
                temp=System.currentTimeMillis();
                webcam.retrieve(frame);     
                modification = v.filtromorfologic(2, 7, v.filtrocolorhsv(0, 0, 0, 180, 255, 40,frame));

                defects=v.envelopdefects(frame,v.searchcontours(frame, modification, false, false, 450), false, 5); 

                if(buffer.size()<7){
                    buffer.add(v.centrpalm(frame, defects));
                }
                else
                {
                    center=v.filtrmediamobile(buffer, v.centrpalm(frame,defects));
                }

                fingers=v.fingers(frame, v.listcontours(modification, 200), center);

                if(finger.size()==1 && bufferfingers.size()<5){
                    bufferfingers.add(fingers.get(0));
                    finger=fingers.get(0);
                }
                else
                {
                    if(fingers.size()==1){
                        finger=v.filtrmediamobile(bufferfingers, fingers.get(0)); 

                    }
                }

                v.drawfingercenterpalm(frame, center, finger, fingers);



                v.mousetrack(fingers,finger,center, r,true,frame,temp);

                v.frametolabel(frame);

            }
        }

    }


}

}

我想知道如何进行背景减法方法以及在main方法中调用它的位置。

0 个答案:

没有答案