public BlobTracker(int srcWidth, int srcHeight) { super(srcWidth, srcHeight); blur = new Blur(); String mapFileName = ElProps.THE_PROPS.getProperty("regionMap", "regionMap.png"); regionMap = new RegionMap(mapFileName); // grayImage = new BufferedImage(w,h,BufferedImage.TYPE_USHORT_GRAY); grayImage = IplImage.create(w, h, IPL_DEPTH_8U, 1); // scaledImage = new BufferedImage(w,h,BufferedImage.TYPE_USHORT_GRAY); diffImage = IplImage.create(w, h, IPL_DEPTH_8U, 1); blurImage = IplImage.create(w, h, IPL_DEPTH_8U, 1); threshImage = IplImage.create(w, h, IPL_DEPTH_8U, 1); background = new BackgroundImage(.001, 15); blobs = new Blobs(srcWidth, srcHeight, regionMap); tracker = new Tracker[regionMap.size()]; for (int i = 0; i < regionMap.size(); i++) { tracker[i] = new Tracker(ElProps.THE_PROPS, regionMap.getRegion(i)); tracker[i].start(); } }
@Override public IplImage process(IplImage img) { /* if(convertFromColor) { imageConversion.convertFromRGB(img, grayImage); } else { imageConversion.convertFromGray(img, grayImage); } */ blur.apply(grayImage, blurImage); IplImage bkImage = background.update(blurImage); if (bkImage == null) return null; ImageDifference.apply(bkImage, blurImage, diffImage); thresh.apply(diffImage, threshImage); synchronized (blobs) { Vector<Blob> allBlobs = new Vector<Blob>(newFrameBlobs.size()); // probably should come up with some kind of double (or triple buffer) for this rather than // re-allocating vectors every frame blobs.detectBlobs(threshImage2.getData()); for (int i = 0; i < regionMap.size(); i++) { Vector<Blob> detected = blobs.getDetectedBlobs(i); Vector<Blob> newBlobs = new Vector<Blob>(detected.size()); newBlobs.addAll(detected); allBlobs.addAll(detected); tracker[i].queueBlobs(newBlobs); } newFrameBlobs = allBlobs; } switch (mode) { case raw: return img; case background: return bkImage; case diff: return diffImage; case thresh: case running: return threshImage2; default: return img; } }