2020
2121#include < iostream>
2222#include < csignal>
23+ #include < cmath>
2324#include < limits>
2425
2526#include < QApplication>
@@ -48,7 +49,7 @@ class FrameEvent:
4849 QEvent (QEvent::User),
4950 frame (frame) {
5051 };
51-
52+
5253 const Pointer<Frame>& getFrame () const {
5354 return frame;
5455 }
@@ -69,23 +70,23 @@ class Window:
6970 blur (false ) {
7071 setCentralWidget (&label);
7172 setStatusBar (&statusBar);
72-
73+
7374 centralWidget ()->setAttribute (Qt::WA_TransparentForMouseEvents);
7475 setMouseTracking (true );
7576 }
76-
77+
7778 void setCalibrationFrame (const Frame& calibrationFrame) {
7879 this ->calibrationFrame = calibrationFrame;
7980 }
80-
81+
8182 void setScale (double scale) {
8283 this ->scale = scale;
8384 }
84-
85+
8586 void setClose (bool close) {
8687 this ->close = close;
8788 }
88-
89+
8990 void setBlur (bool blur) {
9091 this ->blur = blur;
9192 }
@@ -95,47 +96,47 @@ class Window:
9596
9697 Frame frame;
9798 Frame calibrationFrame;
98- Frame lastCalibrationFrame;
99+ Frame lastCalibrationFrame;
99100 size_t frameId;
100-
101+
101102 Frame meanFrame;
102103 Frame varianceFrame;
103-
104+
104105 double scale;
105106 bool close;
106107 bool blur;
107-
108+
108109 void updateValue (const QPointF& position) {
109110 if (!frame.isEmpty ()) {
110111 QPointF xy = position*1.0 /scale;
111-
112- size_t x = floor (xy.x ());
112+
113+ size_t x = std:: floor (xy.x ());
113114 if (x >= frame.getWidth ())
114115 x = frame.getWidth ()-1 ;
115-
116- size_t y = floor (xy.y ());
116+
117+ size_t y = std:: floor (xy.y ());
117118 if (y >= frame.getHeight ())
118119 y = frame.getHeight ()-1 ;
119-
120+
120121 std::stringstream stream;
121122 stream << " (" << x << " , " << y << " ): " << frame (x, y);
122-
123+
123124 statusBar.showMessage (stream.str ().c_str ());
124125 }
125126 }
126-
127+
127128 bool event (QEvent* event) {
128129 if (event->type () == QEvent::User) {
129130 FrameEvent* frameEvent = (FrameEvent*)event;
130131
131132 if (close && frameEvent->getFrame ()->getType () == Frame::typeNormal) {
132133 double t = 1.0 +frameId;
133134 Frame frame_t = *frameEvent->getFrame ();
134-
135+
135136 if (frameId) {
136137 meanFrame *= (t-1.0 )/t;
137138 meanFrame += frame_t *(1.0 /t);
138-
139+
139140 varianceFrame *= (t-1.0 )/t;
140141 frame_t -= meanFrame;
141142 frame_t *= frame_t ;
@@ -146,45 +147,45 @@ class Window:
146147 meanFrame = frame_t *(1.0 /t);
147148 varianceFrame.resize (meanFrame.getWidth (), meanFrame.getHeight ());
148149 }
149-
150+
150151 ++frameId;
151152 }
152-
153+
153154 if (frameEvent->getFrame ()->getType () == Frame::typeNormal) {
154155 frame = *frameEvent->getFrame ();
155156 size_t width = frame.getWidth ();
156157 size_t height = frame.getHeight ();
157-
158+
158159 if (!calibrationFrame.isEmpty ())
159160 frame -= calibrationFrame;
160161 else if (!lastCalibrationFrame.isEmpty ())
161162 frame -= lastCalibrationFrame;
162163
163164 float epsilon = std::numeric_limits<float >::epsilon ();
164-
165+
165166 if (!varianceFrame.isEmpty ()) {
166167 for (size_t x = 0 ; x < width; ++x)
167168 for (size_t y = 0 ; y < height; ++y)
168169 if (varianceFrame (x, y) < epsilon)
169170 frame.close (x, y);
170171 }
171-
172+
172173 frame.normalize ();
173174 if (blur)
174175 frame.gaussianBlur ();
175-
176+
176177 QImage image (width, height, QImage::Format_RGB888);
177178 for (size_t x = 0 ; x < width; ++x)
178179 for (size_t y = 0 ; y < height; ++y) {
179180 float value = frame (x, y)*255.0 ;
180181 image.setPixel (x, y, qRgb (value, value, value));
181182 }
182-
183+
183184 label.setPixmap (QPixmap::fromImage (
184185 image.scaled (image.size ()*scale)));
185186 setFixedSize (label.pixmap ()->width (), label.pixmap ()->height ()+
186187 statusBar.height ());
187-
188+
188189 if (underMouse ())
189190 updateValue (centralWidget ()->mapFromGlobal (QCursor::pos ()));
190191 }
@@ -194,7 +195,7 @@ class Window:
194195 else
195196 QMainWindow::event (event);
196197 }
197-
198+
198199 void mouseMoveEvent (QMouseEvent* event) {
199200 updateValue (centralWidget ()->mapFromGlobal (event->globalPos ()));
200201 }
@@ -208,20 +209,20 @@ class Worker:
208209 device (device),
209210 interruptRequested (false ) {
210211 }
211-
212+
212213 void interrupt () {
213214 interruptRequested = true ;
214215 wait ();
215216 }
216217protected:
217218 Pointer<Device> device;
218-
219+
219220 bool interruptRequested;
220-
221+
221222 void run () {
222223 while (!interruptRequested) {
223224 Pointer<Frame> frame = new Frame ();
224-
225+
225226 device->capture (*frame);
226227
227228 if (parent ()) {
@@ -257,7 +258,7 @@ int main(int argc, char **argv) {
257258 SeekThermal::Usb::Context context;
258259 Pointer<Interface> interface =
259260 context.getInterface (application[0 ].getValue ());
260-
261+
261262 Pointer<Device> device;
262263 if (application[" device" ].getValue ().empty ())
263264 device = interface->discoverDevice ();
@@ -269,11 +270,11 @@ int main(int argc, char **argv) {
269270 application[" timeout" ].getValue <size_t >()*1e-3 );
270271 device->setInterface (interface);
271272 device->connect ();
272-
273+
273274 device->initialize ();
274275
275276 signal (SIGINT, signaled);
276-
277+
277278 QApplication qApplication (argc, argv);
278279 Window window;
279280 window.setScale (application[" scale" ].getValue <double >());
@@ -286,12 +287,12 @@ int main(int argc, char **argv) {
286287 calibrationFrame.load (application[" calibration" ].getValue ());
287288 window.setCalibrationFrame (calibrationFrame);
288289 }
289-
290+
290291 window.show ();
291292 worker.start ();
292293 qApplication.exec ();
293294 worker.interrupt ();
294-
295+
295296 device->disconnect ();
296297 }
297298 else {
0 commit comments