2012-02-18 20:37:22 +01:00
# include "StrobeAnalysis.h"
# include "ofMain.h"
# include "Poco/Timer.h"
# include "Poco/Thread.h"
# include "RefractiveIndex.h"
using Poco : : Timer ;
using Poco : : TimerCallback ;
using Poco : : Thread ;
void StrobeAnalysis : : setup ( int camWidth , int camHeight )
{
NUM_RUN = 1 ;
2012-02-20 19:48:43 +01:00
int acq_run_time = 20 ; // 20 seconds of acquiring per run
2012-02-18 20:37:22 +01:00
2012-02-20 19:48:43 +01:00
DELTA_T_SAVE = 10 * acq_run_time / 2 ; // for 20 seconds, we want this to be around 200 files
// or 10 times per second = every 100 ms
_frame_cnt_max = acq_run_time * ofGetFrameRate ( ) ; // e.g.: 30 frames per second * 20 seconds = 600 frames
_strobe_interval = 1500 ; //every 1 seconds, or every thirty frames 30 frames
2012-02-18 20:37:22 +01:00
// The British Health and Safety Executive recommend that a net flash rate for a bank of strobe lights does not exceed 5 flashes per second, at which only 5% of photosensitive epileptics are at risk. It also recommends that no strobing effect continue for more than 30 seconds, due to the potential for discomfort and disorientation.
create_dir ( ) ;
2012-02-20 03:40:38 +01:00
2012-02-20 19:48:43 +01:00
int anim_time = 5 ; // 5 seconds for the animation
2012-02-20 03:40:38 +01:00
_anim_cnt_max = anim_time * ofGetFrameRate ( ) ; // e.g.: 30 frames per second = 150 frames
2012-02-21 01:34:24 +01:00
_show_image = false ;
_image_shown = false ;
//for an ofxOpenCv.h image i would like to use..."
//image3.allocate(RefractiveIndex::_vid_w, RefractiveIndex::_vid_h);
image1 . setUseTexture ( false ) ;
image2 . setUseTexture ( true ) ;
2012-02-20 03:40:38 +01:00
2012-02-18 20:37:22 +01:00
}
void StrobeAnalysis : : acquire ( )
{
Timer * save_timer ;
TimerCallback < StrobeAnalysis > save_callback ( * this , & StrobeAnalysis : : save_cb ) ;
// RUN ROUTINE
for ( int i = 0 ; i < NUM_RUN ; i + + ) {
_run_cnt = i ;
_save_cnt = 0 ;
_frame_cnt = 0 ;
2012-02-19 23:34:48 +01:00
//cout << "RUN NUM = " << i;
2012-02-18 20:37:22 +01:00
save_timer = new Timer ( 0 , DELTA_T_SAVE ) ; // timing interval for saving files
save_timer - > start ( save_callback ) ;
_RUN_DONE = false ;
2012-02-20 03:40:38 +01:00
2012-02-20 19:48:43 +01:00
_frame_cnt = 0 ; _save_cnt = 0 ; _anim_cnt = 0 ; _strobe_cnt = 0 ;
2012-02-18 20:37:22 +01:00
while ( ! _RUN_DONE )
Thread : : sleep ( 3 ) ;
save_timer - > stop ( ) ;
2012-02-20 19:48:43 +01:00
_RUN_DONE = false ;
2012-02-18 20:37:22 +01:00
}
}
void StrobeAnalysis : : synthesise ( )
{
// _saved_filenames has all the file names of all the saved images
2012-02-20 19:48:43 +01:00
while ( ! _RUN_DONE )
Thread : : sleep ( 3 ) ;
2012-02-18 20:37:22 +01:00
}
2012-02-21 01:34:24 +01:00
void StrobeAnalysis : : displayresults ( )
{
for ( float i = 1 ; i < _saved_filenames . size ( ) ; i + + ) {
cout < < " _saved_filenames[i] " < < _saved_filenames [ i ] < < endl ;
while ( ! _image_shown ) {
Thread : : sleep ( 2 ) ;
//cout << "!_image_shown" << endl;
}
if ( ! image1 . loadImage ( _saved_filenames [ i ] ) ) {
//couldn't load image
cout < < " didn't load image " < < endl ;
}
if ( image1 . loadImage ( _saved_filenames [ i ] ) ) {
image1 . loadImage ( _saved_filenames [ i ] ) ;
//cout << "_show_image = true;" << endl;
_show_image = true ;
_image_shown = false ;
}
}
}
2012-02-18 20:37:22 +01:00
// this runs at frame rate = 33 ms for 30 FPS
void StrobeAnalysis : : draw ( )
{
switch ( _state ) {
case STATE_ACQUIRING :
{
2012-02-19 16:13:09 +01:00
if ( _frame_cnt < _frame_cnt_max )
{
ofEnableAlphaBlending ( ) ;
ofColor aColour ;
int _fade_in_frames = _frame_cnt_max / 10 ;
cout < < " _fade_in_frames " < < _fade_in_frames < < endl ;
2012-02-18 20:37:22 +01:00
2012-02-19 16:13:09 +01:00
if ( _frame_cnt < _fade_in_frames ) {
aColour . set ( 255 , 255 , 255 , ofMap ( _frame_cnt , 0 , _fade_in_frames , 0 , 255 ) ) ;
ofSetColor ( aColour ) ;
2012-02-18 20:37:22 +01:00
ofRect ( 0 , 0 , ofGetWidth ( ) , ofGetHeight ( ) ) ;
2012-02-19 16:13:09 +01:00
//cout << "FADE IN STROBE TIME " << endl;
}
if ( _frame_cnt > = _fade_in_frames & & _frame_cnt < ( _frame_cnt_max - _fade_in_frames ) ) {
//cout << "_frame_cnt: " << _frame_cnt << endl;
//cout << "frame_cnt % 15: " << _frame_cnt%15 << endl;
//cout << "MAIN STROBE TIME " << endl;
2012-02-20 03:40:38 +01:00
if ( int ( _frame_cnt ) % int ( ofGetFrameRate ( ) * _strobe_interval / 1000 ) < ( ofGetFrameRate ( ) * _strobe_interval / 1000 ) / 2 )
2012-02-19 16:13:09 +01:00
{
ofSetColor ( 255 , 255 , 255 ) ;
ofRect ( 0 , 0 , ofGetWidth ( ) , ofGetHeight ( ) ) ;
_strobe_cnt + + ;
_strobe_on = 1 ;
2012-02-20 03:40:38 +01:00
} else if ( int ( _frame_cnt ) % int ( ofGetFrameRate ( ) * _strobe_interval / 1000 ) > = ( ofGetFrameRate ( ) * _strobe_interval / 1000 ) / 2 )
2012-02-19 16:13:09 +01:00
{
ofSetColor ( 0 , 0 , 0 ) ;
ofRect ( 0 , 0 , ofGetWidth ( ) , ofGetHeight ( ) ) ;
_strobe_on = 0 ;
}
2012-02-18 20:37:22 +01:00
}
2012-02-19 16:13:09 +01:00
if ( _frame_cnt > = ( _frame_cnt_max - _fade_in_frames ) & & _frame_cnt < _frame_cnt_max ) {
2012-02-20 01:47:46 +01:00
aColour . set ( 255 , 255 , 255 , 255 - ofMap ( _frame_cnt - ( _frame_cnt_max - _fade_in_frames ) , 0 , _fade_in_frames , 0 , 255 ) ) ;
2012-02-19 16:13:09 +01:00
ofSetColor ( aColour ) ;
ofRect ( 0 , 0 , ofGetWidth ( ) , ofGetHeight ( ) ) ;
// cout << "FADE OUT STROBE TIME " << endl;
}
ofDisableAlphaBlending ( ) ;
} else {
2012-02-20 19:48:43 +01:00
//_state = STATE_SYNTHESISING;
_RUN_DONE = true ;
2012-02-18 20:37:22 +01:00
}
_frame_cnt + + ;
break ;
}
case STATE_SYNTHESISING :
{
// display animation of something while the synthesis in on-going...
2012-02-20 03:40:38 +01:00
cout < < " RelaxRateAnalysis = STATE_SYNTHESISING... \n " ;
// display animation of something while the synthesis in on-going...
ofEnableAlphaBlending ( ) ;
ofSetRectMode ( OF_RECTMODE_CENTER ) ;
ofPushMatrix ( ) ;
ofTranslate ( ofGetWidth ( ) / 2 , ofGetHeight ( ) / 2 ) ;
if ( _anim_cnt < _anim_cnt_max ) {
ofColor aColour ;
int rectSizeW = ofGetWidth ( ) / 4 ;
int rectSizeH = ofGetHeight ( ) / 4 ;
int _fade_in_frames = _anim_cnt_max / 2 ;
int c_anim = 10 ;
int fade ;
//ofRotate(ofMap(_anim_cnt/2.0, 0, _anim_cnt_max, 0, 360));
if ( _anim_cnt < _fade_in_frames ) {
cout < < " ShadowScapesAnalysis STATE_SYNTHESIZING = FADING IN ANIMATION... \n " ;
fade = ofMap ( _anim_cnt , 0 , _fade_in_frames , 0 , 255 ) ;
for ( int i = 0 ; i < = 15 ; i + + ) {
c_anim = 0 + 17 * i ;
aColour . set ( c_anim , c_anim , c_anim , fade ) ;
ofSetColor ( aColour ) ;
ofRect ( 0 , 0 , rectSizeW + 10 * i , rectSizeH + 10 * i ) ;
ofRect ( 0 , 0 , rectSizeW - 10 * i , rectSizeH - 10 * i ) ;
}
}
if ( _anim_cnt > = _fade_in_frames & & _anim_cnt < = ( _anim_cnt_max - _fade_in_frames ) ) {
for ( int i = 0 ; i < = 15 ; i + + ) {
c_anim = 255 ;
aColour . set ( c_anim , c_anim , c_anim , 255 ) ;
ofSetColor ( aColour ) ;
ofRect ( 0 , 0 , rectSizeW + 10 * i , rectSizeH + 10 * i ) ;
ofRect ( 0 , 0 , rectSizeW - 10 * i , rectSizeH - 10 * i ) ;
}
}
if ( _anim_cnt > ( _anim_cnt_max - _fade_in_frames ) & & _anim_cnt < = _anim_cnt_max ) {
cout < < " _anim_cnt = " < < _anim_cnt - ( _anim_cnt_max - _fade_in_frames ) < < endl ;
fade = ofMap ( _anim_cnt - ( _anim_cnt_max - _fade_in_frames ) , 0 , _fade_in_frames , 0 , 255 ) ;
cout < < " fade down = " < < fade < < endl ;
for ( int i = 0 ; i < = 15 ; i + + ) {
c_anim = ( 17 * i ) ;
aColour . set ( c_anim , c_anim , c_anim , 255 - fade ) ;
ofSetColor ( aColour ) ;
ofRect ( 0 , 0 , rectSizeW + 10 * i , rectSizeH + 10 * i ) ;
ofRect ( 0 , 0 , rectSizeW - 10 * i , rectSizeH - 10 * i ) ;
}
}
_anim_cnt + + ;
} else {
2012-02-20 19:48:43 +01:00
_RUN_DONE = true ;
//_state = STATE_DISPLAY_RESULTS;
2012-02-20 03:40:38 +01:00
_anim_cnt = 0 ;
}
ofPopMatrix ( ) ;
ofSetRectMode ( OF_RECTMODE_CORNER ) ;
ofDisableAlphaBlending ( ) ;
2012-02-18 20:37:22 +01:00
break ;
}
case STATE_DISPLAY_RESULTS :
{
2012-02-21 01:34:24 +01:00
if ( _frame_cnt > 2 )
{
_image_shown = true ;
_frame_cnt = 0 ;
}
_frame_cnt + + ;
if ( _show_image )
{
ofEnableAlphaBlending ( ) ;
ofSetColor ( 255 , 255 , 255 , 255 ) ;
image2 . setFromPixels ( image1 . getPixels ( ) , image1 . width , image1 . height , OF_IMAGE_COLOR ) ;
image2 . draw ( 0 , 0 , ofGetWidth ( ) , ofGetHeight ( ) ) ;
ofDisableAlphaBlending ( ) ;
}
2012-02-18 20:37:22 +01:00
// display results of the synthesis
2012-02-20 03:40:38 +01:00
_RUN_DONE = true ;
2012-02-18 20:37:22 +01:00
break ;
2012-02-21 01:34:24 +01:00
2012-02-18 20:37:22 +01:00
}
default :
break ;
}
}
// this runs at save_cb timer rate = DELTA_T_SAVE
void StrobeAnalysis : : save_cb ( Timer & timer )
{
2012-02-19 22:47:55 +01:00
_save_cnt + + ;
2012-02-19 21:45:28 +01:00
2012-02-20 20:24:25 +01:00
RefractiveIndex : : _vidGrabber . grabFrame ( ) ; // get a new frame from the camera
if ( RefractiveIndex : : _vidGrabber . isFrameNew ( ) )
{
RefractiveIndex : : _pixels = RefractiveIndex : : _vidGrabber . getPixelsRef ( ) ; //get ofPixels from the camera
}
2012-02-19 23:00:34 +01:00
cout < < " StrobeAnalysis::saving... \n " ;
2012-02-19 22:47:55 +01:00
2012-02-19 23:00:34 +01:00
string file_name = ofToString ( _save_cnt , 2 ) + " _ " + ofToString ( _strobe_on ) + " _ " + ofToString ( _run_cnt , 2 ) + " .jpg " ;
2012-02-18 20:37:22 +01:00
2012-02-19 23:00:34 +01:00
ofSaveImage ( RefractiveIndex : : _pixels , _whole_file_path + " / " + file_name , OF_IMAGE_QUALITY_BEST ) ;
_saved_filenames . push_back ( _whole_file_path + " / " + file_name ) ;
2012-02-18 20:37:22 +01:00
}