1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package org.openimaj.tools.imagecollection.tool;
31
32 import java.util.ArrayList;
33 import java.util.List;
34
35 import org.openimaj.image.Image;
36 import org.openimaj.tools.imagecollection.collection.ImageCollection;
37 import org.openimaj.tools.imagecollection.collection.ImageCollectionEntry;
38 import org.openimaj.tools.imagecollection.metamapper.MetaMapper;
39 import org.openimaj.tools.imagecollection.processor.ImageCollectionProcessor;
40
41 public class ImageCollectionProcessorJob <T extends Image<?,T>> implements Runnable{
42
43 public static class ProcessorJobEvent{
44 public int imagesDone;
45 public int imagesTotal;
46 public boolean validTotal;
47 }
48
49 public static interface ProcessorJobListener{
50 public void progressUpdate(ProcessorJobEvent event);
51 }
52
53 private ImageCollection<T> collection;
54 private ImageCollectionProcessor<T> processor;
55 private List<ProcessorJobListener> listeners;
56 private MetaMapper mapper;
57
58 public ImageCollectionProcessorJob(
59 ImageCollection<T> collection,
60 ImageCollectionProcessor<T> sink,
61 MetaMapper mapper
62 ){
63 this.collection = collection;
64 this.processor = sink;
65 this.listeners = new ArrayList<ProcessorJobListener>();
66 this.mapper = mapper;
67 }
68
69 public void addListener(ProcessorJobListener listener){
70 this.listeners.add(listener);
71 }
72
73 @Override
74 public void run() {
75 int done = 0;
76 try {
77 this.processor.start();
78 this.mapper.start();
79 } catch (Exception e) {
80 return;
81 }
82 for(ImageCollectionEntry<T> entry: collection){
83 try {
84 if(entry.accepted)
85 {
86 String sinkOutput = this.processor.process(entry);
87 mapper.mapItem(sinkOutput, entry);
88 }
89 ProcessorJobEvent event = new ProcessorJobEvent();
90 event.imagesDone = ++done;
91 event.imagesTotal = collection.countImages();
92 if(event.imagesTotal < 0) event.validTotal = false;
93 else event.validTotal = true;
94 fireProgressUpdate(event);
95 } catch (Exception e) {
96 }
97 }
98 try {
99 this.mapper.end();
100 this.processor.end();
101 } catch (Exception e) {
102 }
103 }
104
105
106
107 private void fireProgressUpdate(ProcessorJobEvent event) {
108 for (ProcessorJobListener listener : this.listeners) {
109 listener.progressUpdate(event);
110 }
111 }
112
113
114 }