3 Commits

Author SHA1 Message Date
Jamie Allen 327830a581 beginning to integrate dviid's code 2012-04-08 20:18:44 +02:00
Jamie Allen 877123a2db changes to colorsingleanalysis
colorsingleanalysis has some initial vectorisation code
2012-04-06 17:13:39 +02:00
Jamie Allen feedecfe04 implementing colorsingleanalysis
a start at the new colorsingleanalysis design...
2012-04-06 16:29:54 +02:00
13 changed files with 291 additions and 234 deletions
+1 -1
View File
@@ -38,7 +38,7 @@
</analysis_time> </analysis_time>
<relaxrate> <relaxrate>
<treshold>51</treshold> <threshold>51</threshold>
<maxblobs>25</maxblobs> <maxblobs>25</maxblobs>
</relaxrate> </relaxrate>
+12
View File
@@ -27,8 +27,10 @@
#define ISTATE_TRANSITION 0xCCCC #define ISTATE_TRANSITION 0xCCCC
#define ISTATE_END 0xDDDD #define ISTATE_END 0xDDDD
int _state = ISTATE_UNDEF; int _state = ISTATE_UNDEF;
int RefractiveIndex::_mode;
ofPixels RefractiveIndex::_pixels; ofPixels RefractiveIndex::_pixels;
ofVideoGrabber RefractiveIndex::_vidGrabber; ofVideoGrabber RefractiveIndex::_vidGrabber;
int RefractiveIndex::_vid_w, RefractiveIndex::_vid_h, RefractiveIndex::_vid_id; int RefractiveIndex::_vid_w, RefractiveIndex::_vid_h, RefractiveIndex::_vid_id;
@@ -50,6 +52,10 @@ void RefractiveIndex::setup()
XML.loadFile("config.refindx"); XML.loadFile("config.refindx");
} }
// <mode>
string m = XML.getValue("config:mode", "analysing");
_mode = (m == "analysing" ? MODE_ANALYSING : (m == "drawing" ? MODE_DRAWING : MODE_ANALYSING));
// <camera> // <camera>
_vid_id = XML.getValue("config:camera:id", CAMERA_ID); _vid_id = XML.getValue("config:camera:id", CAMERA_ID);
cout << "_vid_id: " << _vid_id << endl; cout << "_vid_id: " << _vid_id << endl;
@@ -82,8 +88,10 @@ void RefractiveIndex::setup()
cout << "* cam width = " << _vid_w << endl; cout << "* cam width = " << _vid_w << endl;
cout << "* cam height = " << _vid_h << endl; cout << "* cam height = " << _vid_h << endl;
if(_mode == MODE_ANALYSING) {
_vid_stream_open = false; _vid_stream_open = false;
setup_camera(); setup_camera();
}
cout << "RRRRRREADY!" << endl; cout << "RRRRRREADY!" << endl;
@@ -173,9 +181,13 @@ void RefractiveIndex::state_analysis()
break; break;
case ISTATE_STOP: case ISTATE_STOP:
stop_analysis(); // blocking stop_analysis(); // blocking
if(_mode == MODE_DRAWING)
_state = ISTATE_UNDEF;
else
_state = ISTATE_TRANSITION; _state = ISTATE_TRANSITION;
break; break;
case ISTATE_END: case ISTATE_END:
if(_mode == MODE_ANALYSING)
stop_camera(); stop_camera();
::exit(1); ::exit(1);
break; break;
+5
View File
@@ -11,6 +11,9 @@
#include "ofxOpenCv.h" #include "ofxOpenCv.h"
#include "ofxXmlSettings.h" #include "ofxXmlSettings.h"
#define MODE_DRAWING 0xEEFF
#define MODE_ANALYSING 0xFFEE
class RefractiveIndex : public ofBaseApp class RefractiveIndex : public ofBaseApp
{ {
public: public:
@@ -55,6 +58,8 @@ public:
// acquisition // acquisition
static ofPixels _pixels; static ofPixels _pixels;
static ofVideoGrabber _vidGrabber; static ofVideoGrabber _vidGrabber;
static int _mode;
vector<string> videoSourceList; vector<string> videoSourceList;
static int _vid_w, _vid_h, _vid_id; static int _vid_w, _vid_h, _vid_id;
static bool _vid_stream_open; static bool _vid_stream_open;
-5
View File
@@ -14,10 +14,6 @@ void AbstractAnalysis::do_synthesize() {
_saved_filenames_analysis.clear(); _saved_filenames_analysis.clear();
_saved_filenames_synthesis.clear(); _saved_filenames_synthesis.clear();
if(_state == STATE_STOP) goto exit;
_state = STATE_ALLOCATE;
allocate();
if(_state == STATE_STOP) goto exit;
_state = STATE_ACQUIRING; _state = STATE_ACQUIRING;
acquire(); acquire();
if(_state == STATE_STOP) goto exit; if(_state == STATE_STOP) goto exit;
@@ -26,7 +22,6 @@ void AbstractAnalysis::do_synthesize() {
if(_state == STATE_STOP) goto exit; if(_state == STATE_STOP) goto exit;
_state = STATE_DISPLAY_RESULTS; _state = STATE_DISPLAY_RESULTS;
displayresults(); displayresults();
_state = STATE_CLEANUP;
cleanup(); cleanup();
} }
+1 -7
View File
@@ -13,13 +13,10 @@
#define ANALYSIS_PATH "analysis/" #define ANALYSIS_PATH "analysis/"
#define SYNTHESIS_PATH "synthesis/" #define SYNTHESIS_PATH "synthesis/"
#define STATE_ALLOCATE 0x0010
#define STATE_CLEANUP 0x0001
#define STATE_ACQUIRING 0x1111 #define STATE_ACQUIRING 0x1111
#define STATE_SYNTHESISING 0x2222 #define STATE_SYNTHESISING 0x2222
#define STATE_DISPLAY_RESULTS 0x3333 #define STATE_DISPLAY_RESULTS 0x3333
#define STATE_STOP 0xDEADBEEF #define STATE_STOP 0xDEADBEEF
#define STATE_DEF 0x0000
class AbstractAnalysis { class AbstractAnalysis {
@@ -52,10 +49,7 @@ protected:
// display the results from disk // display the results from disk
virtual void displayresults() = 0; virtual void displayresults() = 0;
// allocate all images // display the results from disk
virtual void allocate() {;}
// deallocate all images
virtual void cleanup() {;} virtual void cleanup() {;}
-2
View File
@@ -246,8 +246,6 @@ void ColorMultiAnalysis::draw()
//cout << "FADING IN..." << endl; //cout << "FADING IN..." << endl;
} }
if (_frame_cnt >= _fade_in_frames && _frame_cnt < _frame_cnt_max-_fade_in_frames){ if (_frame_cnt >= _fade_in_frames && _frame_cnt < _frame_cnt_max-_fade_in_frames){
aColor.setHsb(c, 255, 255); aColor.setHsb(c, 255, 255);
+155 -8
View File
@@ -124,7 +124,6 @@ void ColorSingleAnalysis::acquire()
save_timer->stop(); save_timer->stop();
// } // }
} }
@@ -137,11 +136,103 @@ void ColorSingleAnalysis::synthesise()
for(float i=1;i<_saved_filenames_analysis.size()-1;i++){ for(float i=1;i<_saved_filenames_analysis.size()-1;i++){
//cout << "ColorSingleAnalysis::synthesis FOR LOOP...\n"; //cout << "ColorSingleAnalysis::synthesis FOR LOOP...\n";
//cout << "_saved_filenames_analysis[i]" << _saved_filenames_analysis[i] << endl; //cout << "_saved_filenames_analysis[i]" << _saved_filenames_analysis[i] << endl;
if(_state == STATE_STOP) return; if(_state == STATE_STOP) return;
image1.loadImage("Mar_02_19_00_47_2/194_9.72_1.jpg");
image1.resize(image1.width/20, image1.height/20);
int width = image1.width;
int height = image1.height;
// get the pixels from the image
imagePixels = image1.getPixels();
// ------------------- create the vector field ------------------------------------
vectorCount = width * height;
// create a 2d vector field
vectorField = new ofVec2f[vectorCount];
// set all values in vector field to 0.0
for(int i=0; i<vectorCount; i++){
vectorField[i].x = 0.0;
vectorField[i].y = 0.0;
}
// ------------------- calculate the vectors ------------------------------------
// loop through all of the pixels
for(int x=1; x< width-1; x++){
for(int y=1; y< height-1; y++){
char areaPixels[9];
// loop through the area pixels
for(int i=-1; i<=1; i++){
for(int j=-1; j<=1; j++){
// determine where to read from in the area (not optimized)
int readPos = ((y + j) * width + (x + i)) * 3;
unsigned char R = imagePixels[readPos];
unsigned char G = imagePixels[readPos+1];
unsigned char B = imagePixels[readPos+2];
unsigned char BR = (0.299 * R) + (.587 * G) + (.114 * B);
int writePos = (j+1) * 3 + (i + 1);
areaPixels[writePos] = BR;
}
}
float dX = (areaPixels[0] + areaPixels[3] + areaPixels[6])/3 - (areaPixels[2] + areaPixels[5] + areaPixels[8])/3;
float dY = (areaPixels[0] + areaPixels[1] + areaPixels[2])/3 - (areaPixels[6] + areaPixels[7] + areaPixels[8])/3;
int vectorPos = y * width + x;
//printf("dx %f\n", dX);
vectorField[vectorPos].x = dX;
vectorField[vectorPos].y = dY;
//vectorField[vectorPos].x = -dY;
//vectorField[vectorPos].y = dX;
}
}
// ------------------- normalize the vectors ------------------------------------
// variables for the maximum magnitude (absolute) in x and y
float maxMagX = 1.0;
float maxMagY = 1.0;
// loop through the vector field to find the maximum x and y values
for(int i=0; i< vectorCount; i++){
if(fabs(vectorField[i].x) > maxMagX) maxMagX = fabs(vectorField[i].x);
if(fabs(vectorField[i].y) > maxMagY) maxMagY = fabs(vectorField[i].y);
}
// loop through the vector field to normalize the values
for(int i=0; i< vectorCount; i++){
vectorField[i].x /= maxMagX;
vectorField[i].y /= maxMagY;
}
// COMMENTING OUT THE FILLER SYNTH ALGORITHM
/*
if(!image1.loadImage(_saved_filenames_analysis[i])){ if(!image1.loadImage(_saved_filenames_analysis[i])){
//couldn't load image //couldn't load image
cout << "didn't load image" << endl; cout << "didn't load image" << endl;
@@ -180,7 +271,7 @@ void ColorSingleAnalysis::synthesise()
//ofImage image; //ofImage image;
//image.allocate(cvColorImage1.width, cvColorImage1.height, OF_IMAGE_COLOR); //image.allocate(cvColorImage1.width, cvColorImage1.height, OF_IMAGE_COLOR);
//*** This needs to be here for OSX of we get a BAD ACCESS ERROR. DOES IT BREAK WINDOWS? ***// // This needs to be here for OSX of we get a BAD ACCESS ERROR. DOES IT BREAK WINDOWS?
//image.setUseTexture(false); //image.setUseTexture(false);
//image.setFromPixels(cvColorImage1.getPixels(), cvColorImage1.width, cvColorImage1.height,OF_IMAGE_COLOR); //image.setFromPixels(cvColorImage1.getPixels(), cvColorImage1.width, cvColorImage1.height,OF_IMAGE_COLOR);
@@ -194,7 +285,10 @@ void ColorSingleAnalysis::synthesise()
_synth_save_cnt++; _synth_save_cnt++;
// } // }
} }
*/
} }
// _saved_filenames_synthesis has processed all the files in the analysis images folder // _saved_filenames_synthesis has processed all the files in the analysis images folder
@@ -203,8 +297,23 @@ void ColorSingleAnalysis::synthesise()
} }
//
void ColorSingleAnalysis::displayresults() void ColorSingleAnalysis::displayresults()
{ {
if(_state == STATE_STOP) return;
_show_image = true;
_image_shown = false;
//cout << "_saved_filenames_analysis[i] - " << _saved_filenames_synthesis[i] << endl;
while(!_image_shown){
Thread::sleep(2);
//cout << "!_image_shown" << endl;
}
/*
for(float i=1;i<_saved_filenames_synthesis.size();i++){ for(float i=1;i<_saved_filenames_synthesis.size();i++){
if(_state == STATE_STOP) return; if(_state == STATE_STOP) return;
@@ -228,6 +337,7 @@ void ColorSingleAnalysis::displayresults()
_image_shown = false; _image_shown = false;
} }
} }
*/
} }
@@ -238,8 +348,6 @@ void ColorSingleAnalysis::draw()
switch (_state) { switch (_state) {
case STATE_ACQUIRING: case STATE_ACQUIRING:
{ {
if (_frame_cnt < _frame_cnt_max) if (_frame_cnt < _frame_cnt_max)
{ {
@@ -385,8 +493,48 @@ void ColorSingleAnalysis::draw()
case STATE_DISPLAY_RESULTS: case STATE_DISPLAY_RESULTS:
{ {
//cout << "STATE_DISPLAY_RESULTS...\n" << endl; cout << "case STATE_DISPLAY_RESULTS = true" << endl;
int width = image1.width;
int height = image1.height;
float spacing = 10;
if (_frame_cnt > 2000)
{
_image_shown = true;
_frame_cnt=0;
}
_frame_cnt++;
if (_show_image)
{
cout << "_show_image = true" << endl;
for(int x=0; x<width; x++){
float xPos = (float) x * spacing + 5;
for(int y=0; y<height; y++){
float yPos = (float)y * spacing + 5;
glPushMatrix();
ofLine(xPos, yPos, xPos+(vectorField[y*width+x].x*spacing), yPos+(vectorField[y*width+x].y*spacing));
glPopMatrix();
}
}
//this is where we save the full-frame software output to file... after the vectors, etc. are rendered...
//saveImageSynthesis(file_name, &cvColorImage1, OF_IMAGE_COLOR);
}
_RUN_DONE = true;
break;
/*
//cout << "STATE_DISPLAY_RESULTS...\n" << endl;
if (_frame_cnt > 2) if (_frame_cnt > 2)
{ {
@@ -412,10 +560,9 @@ void ColorSingleAnalysis::draw()
// display results of the synthesis // display results of the synthesis
_RUN_DONE = true; _RUN_DONE = true;
break; break;
*/
} }
default: default:
break; break;
} }
+3
View File
@@ -65,5 +65,8 @@ protected:
//this is the temporary container to allow us to convert and save out greyscale images //this is the temporary container to allow us to convert and save out greyscale images
ofxCvColorImage cvConvertorImage; ofxCvColorImage cvConvertorImage;
unsigned char * imagePixels;
int vectorCount;
ofVec2f * vectorField;
}; };
+4 -4
View File
@@ -12,7 +12,7 @@ using Poco::Thread;
#define NUMBER_RUNS 1 #define NUMBER_RUNS 1
#define ACQUIRE_TIME 20 #define ACQUIRE_TIME 20
#define TRESHOLD 80 #define THRESHOLD 80
#define MAXBLOBS 15 #define MAXBLOBS 15
void RelaxRateAnalysis::setup(int camWidth, int camHeight) void RelaxRateAnalysis::setup(int camWidth, int camHeight)
@@ -25,8 +25,8 @@ void RelaxRateAnalysis::setup(int camWidth, int camHeight)
acq_run_time = RefractiveIndex::XML.getValue("config:analysis_time:acquiretime_relaxrate", ACQUIRE_TIME); acq_run_time = RefractiveIndex::XML.getValue("config:analysis_time:acquiretime_relaxrate", ACQUIRE_TIME);
cout << "ACQUIRE_TIME RelaxRateAnalysis " << acq_run_time << endl; cout << "ACQUIRE_TIME RelaxRateAnalysis " << acq_run_time << endl;
_treshold = RefractiveIndex::XML.getValue("config:relaxrate:treshold", TRESHOLD); _threshold = RefractiveIndex::XML.getValue("config:relaxrate:threshold", THRESHOLD);
cout << "TRESHOLD RelaxRateAnalysis " << _treshold << endl; cout << "THRESHOLD RelaxRateAnalysis " << _threshold << endl;
_maxblobs = RefractiveIndex::XML.getValue("config:relaxrate:maxblobs", MAXBLOBS); _maxblobs = RefractiveIndex::XML.getValue("config:relaxrate:maxblobs", MAXBLOBS);
cout << "MAXBLOBS RelaxRateAnalysis " << _maxblobs << endl; cout << "MAXBLOBS RelaxRateAnalysis " << _maxblobs << endl;
@@ -116,7 +116,7 @@ void RelaxRateAnalysis::synthesise()
cvColorImage1.setFromPixels(image1.getPixels(), image1.width, image1.height); cvColorImage1.setFromPixels(image1.getPixels(), image1.width, image1.height);
cvColorImage1.convertToGrayscalePlanarImage(cvGrayDiff1, 1); cvColorImage1.convertToGrayscalePlanarImage(cvGrayDiff1, 1);
cvGrayDiff1.threshold(_treshold); cvGrayDiff1.threshold(_threshold);
rfiCvContourFinder* cf = new rfiCvContourFinder(); rfiCvContourFinder* cf = new rfiCvContourFinder();
+1 -1
View File
@@ -39,7 +39,7 @@ protected:
int _run_cnt, _save_cnt, _synth_save_cnt, _anim_cnt; int _run_cnt, _save_cnt, _synth_save_cnt, _anim_cnt;
float c, _frame_cnt, _frame_cnt_max, _anim_cnt_max; float c, _frame_cnt, _frame_cnt_max, _anim_cnt_max;
int _treshold; int _threshold;
int _maxblobs; int _maxblobs;
bool _show_image, _image_shown; bool _show_image, _image_shown;
+2 -96
View File
@@ -51,7 +51,6 @@ void ShadowScapesAnalysis::setup(int camWidth, int camHeight)
_show_image = false; _show_image = false;
_image_shown = false; _image_shown = false;
/*
image1.clear(); image1.clear();
image2.clear(); image2.clear();
image3.clear(); image3.clear();
@@ -98,7 +97,6 @@ void ShadowScapesAnalysis::setup(int camWidth, int camHeight)
cvGrayDiff2.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h); cvGrayDiff2.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
cvConvertorImage.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h); cvConvertorImage.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
*/
} }
@@ -226,116 +224,24 @@ void ShadowScapesAnalysis::displayresults()
if(!image3.loadImage(_saved_filenames_synthesis[i])){ if(!image3.loadImage(_saved_filenames_synthesis[i])){
//couldn't load image //couldn't load image
cout << "didn't load image" << endl; cout << "didn't load image" << endl;
} else {
_show_image = true;
_image_shown = false;
} }
/*
if(image3.loadImage(_saved_filenames_synthesis[i])){ if(image3.loadImage(_saved_filenames_synthesis[i])){
//image3.loadImage(_saved_filenames_synthesis[i]); image3.loadImage(_saved_filenames_synthesis[i]);
//cout << "_show_image = true;" << endl; //cout << "_show_image = true;" << endl;
_show_image = true; _show_image = true;
_image_shown = false; _image_shown = false;
} }
*/
} }
} }
void ShadowScapesAnalysis::allocate()
{
_RUN_DONE = false;
image1.clear();
image3.clear();
image4.clear();
image5.clear();
image1.setUseTexture(false);
image3.setUseTexture(false);
image4.setUseTexture(false);
image5.setUseTexture(false);
image1.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h, OF_IMAGE_COLOR);
image3.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h, OF_IMAGE_COLOR);
image4.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h, OF_IMAGE_COLOR);
image5.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h, OF_IMAGE_COLOR);
while(!_RUN_DONE && _state != STATE_STOP)
Thread::sleep(3);
}
void ShadowScapesAnalysis::cleanup()
{
_RUN_DONE = false;
image1.clear();
image3.clear();
image4.clear();
image5.clear();
while(!_RUN_DONE && _state != STATE_STOP)
Thread::sleep(3);
}
// the animation draw - and the output draw // the animation draw - and the output draw
void ShadowScapesAnalysis::draw() void ShadowScapesAnalysis::draw()
{ {
switch (_state) { switch (_state) {
case STATE_ALLOCATE:
{
image2.clear();
image2.setUseTexture(true);
image2.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h, OF_IMAGE_COLOR);
cvColorImage1.clear();
cvGrayImage1.clear();
cvGrayDiff1.clear();
cvColorImage2.clear();
cvGrayImage2.clear();
cvGrayDiff2.clear();
cvConvertorImage.clear();
cvColorImage1.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
cvGrayImage1.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
cvGrayDiff1.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
cvColorImage2.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
cvGrayImage2.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
cvGrayDiff2.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
cvConvertorImage.allocate(RefractiveIndex::_vid_w,RefractiveIndex::_vid_h);
_state = STATE_DEF;
_RUN_DONE = true;
break;
}
case STATE_CLEANUP:
{
image2.clear();
cvColorImage1.clear();
cvGrayImage1.clear();
cvGrayDiff1.clear();
cvColorImage2.clear();
cvGrayImage2.clear();
cvGrayDiff2.clear();
_state = STATE_DEF;
_RUN_DONE = true;
break;
}
case STATE_ACQUIRING: case STATE_ACQUIRING:
{ {
_line += _step; _line += _step;
-3
View File
@@ -26,9 +26,6 @@ public:
void synthesise(); void synthesise();
void displayresults(); void displayresults();
void allocate();
void cleanup();
void draw(); void draw();
void save_cb(Poco::Timer& timer); void save_cb(Poco::Timer& timer);