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.demos.video.videosift;
31
32 import java.awt.event.KeyEvent;
33 import java.awt.event.KeyListener;
34 import java.util.ArrayList;
35 import java.util.List;
36
37 import javax.swing.JFrame;
38 import javax.swing.SwingUtilities;
39
40 import org.openimaj.demos.video.utils.PolygonDrawingListener;
41 import org.openimaj.demos.video.utils.PolygonExtractionProcessor;
42 import org.openimaj.feature.local.matcher.consistent.ConsistentLocalFeatureMatcher2d;
43 import org.openimaj.image.FImage;
44 import org.openimaj.image.MBFImage;
45 import org.openimaj.image.colour.RGBColour;
46 import org.openimaj.image.feature.local.engine.DoGSIFTEngine;
47 import org.openimaj.image.feature.local.keypoints.Keypoint;
48 import org.openimaj.image.model.patch.HistogramPatchModel;
49 import org.openimaj.video.VideoDisplay;
50 import org.openimaj.video.VideoDisplayListener;
51 import org.openimaj.video.capture.VideoCapture;
52
53 public class VideoPatchHistogram implements KeyListener, VideoDisplayListener<MBFImage> {
54 VideoCapture capture;
55 VideoDisplay<MBFImage> videoFrame;
56 JFrame modelFrame;
57 JFrame matchFrame;
58 MBFImage modelImage;
59
60 ConsistentLocalFeatureMatcher2d<Keypoint> matcher;
61 private DoGSIFTEngine engine;
62 private PolygonDrawingListener polygonListener;
63 private boolean learnMode = false;
64 private HistogramPatchModel hmodel;
65 private boolean viewMode = false;
66 private List<MBFImage> learningFrames;
67
68 public VideoPatchHistogram() throws Exception {
69 capture = new VideoCapture(640, 480);
70 polygonListener = new PolygonDrawingListener();
71 videoFrame = VideoDisplay.createVideoDisplay(capture);
72 SwingUtilities.getRoot(videoFrame.getScreen()).addKeyListener(this);
73 videoFrame.getScreen().addMouseListener(polygonListener);
74 videoFrame.addVideoListener(this);
75 engine = new DoGSIFTEngine();
76 engine.getOptions().setDoubleInitialImage(false);
77 hmodel = new HistogramPatchModel(10,10,10);
78 this.learningFrames = new ArrayList<MBFImage>();
79 }
80
81 @Override
82 public void afterUpdate(VideoDisplay<MBFImage> display) {
83
84 }
85
86 @Override
87 public void beforeUpdate(MBFImage frame) {
88 if(learnMode){
89 System.out.println("Adding frame");
90 if(this.learningFrames.size()>5)
91 this.learningFrames.remove(0);
92 this.learningFrames.add(frame.process(new PolygonExtractionProcessor<Float[],MBFImage>(this.polygonListener.getPolygon(),RGBColour.BLACK)));
93
94 }
95 if(viewMode){
96 FImage guess = this.hmodel.classifyImage(frame).normalise();
97
98
99
100
101
102
103
104
105
106
107 frame.internalAssign(new MBFImage(new FImage[]{guess, guess, guess}));
108 }
109 this.polygonListener.drawPoints(frame);
110
111 }
112
113 @Override
114 public void keyPressed(KeyEvent key) {
115 if(key.getKeyCode() == KeyEvent.VK_SPACE) {
116 this.videoFrame.togglePause();
117 }
118 if (key.getKeyChar() == 'v' ) {
119 this.viewMode = !this.viewMode ;
120 }
121 if (key.getKeyChar() == 'c' && this.polygonListener.getPolygon().getVertices().size()>2) {
122 try {
123 if(!this.learnMode)
124 {
125 this.learnMode = true;
126 }
127 else{
128 this.polygonListener.reset();
129 this.hmodel.learnModel(this.learningFrames.toArray(new MBFImage[this.learningFrames.size()]));
130 this.learnMode = false;
131 }
132
133 } catch (Exception e) {
134 e.printStackTrace();
135 }
136 }
137 }
138
139 @Override
140 public void keyReleased(KeyEvent arg0) {
141
142
143 }
144
145 @Override
146 public void keyTyped(KeyEvent arg0) {
147
148
149 }
150 public static void main(String args[]) throws Exception{
151 new VideoPatchHistogram();
152 }
153 }