implementing colorsingleanalysis

a start at the new colorsingleanalysis design...
This commit is contained in:
Jamie Allen 2012-04-06 16:29:54 +02:00
parent daec77d2be
commit feedecfe04
7 changed files with 197 additions and 68 deletions

View File

@ -1,45 +1,45 @@
<!-- THIS FILE NEEDS TO GO IN THE APPLICATION /data/ folder --> <!-- THIS FILE NEEDS TO GO IN THE APPLICATION /data/ folder -->
<config> <config>
<camera> <camera>
<id>1</id> <id>1</id>
<width>640</width> <width>640</width>
<height>480</height> <height>480</height>
</camera> </camera>
<display> <display>
<fps>30</fps> <fps>30</fps>
</display> </display>
<locale> <locale>
<name>SWANSEA</name> <name>SWANSEA</name>
</locale> </locale>
<analysis_NUM_RUN> <analysis_NUM_RUN>
<NUM_RUN_shadowscapes> 3 </NUM_RUN_shadowscapes> <NUM_RUN_shadowscapes> 3 </NUM_RUN_shadowscapes>
<NUM_RUN_relaxrate> 3 </NUM_RUN_relaxrate> <NUM_RUN_relaxrate> 3 </NUM_RUN_relaxrate>
<NUM_RUN_iresponse> 3 </NUM_RUN_iresponse> <NUM_RUN_iresponse> 3 </NUM_RUN_iresponse>
<NUM_RUN_shapefromshading> 3 </NUM_RUN_shapefromshading> <NUM_RUN_shapefromshading> 3 </NUM_RUN_shapefromshading>
<NUM_RUN_strobe> 5 </NUM_RUN_strobe> <NUM_RUN_strobe> 5 </NUM_RUN_strobe>
<NUM_RUN_camnoise> 5 </NUM_RUN_camnoise> <NUM_RUN_camnoise> 5 </NUM_RUN_camnoise>
<NUM_RUN_colorsingle> 5 </NUM_RUN_colorsingle> <NUM_RUN_colorsingle> 5 </NUM_RUN_colorsingle>
<NUM_RUN_colormulti> 5 </NUM_RUN_colormulti> <NUM_RUN_colormulti> 5 </NUM_RUN_colormulti>
<NUM_RUN_diffnoise> 3 </NUM_RUN_diffnoise> <NUM_RUN_diffnoise> 3 </NUM_RUN_diffnoise>
</analysis_NUM_RUN> </analysis_NUM_RUN>
<analysis_time>
<acquiretime_shadowscapes> 30 </acquiretime_shadowscapes>
<acquiretime_relaxrate> 30 </acquiretime_relaxrate>
<acquiretime_iresponse> 30 </acquiretime_iresponse>
<acquiretime_shapefromshading> 30 </acquiretime_shapefromshading>
<acquiretime_strobe> 30 </acquiretime_strobe>
<acquiretime_camnoise> 30 </acquiretime_camnoise>
<acquiretime_colorsingle> 40 </acquiretime_colorsingle>
<acquiretime_colormulti> 40 </acquiretime_colormulti>
<acquiretime_diffnoise> 30 </acquiretime_diffnoise>
</analysis_time>
<relaxrate>
<threshold>51</threshold>
<maxblobs>25</maxblobs>
</relaxrate>
<analysis_time>
<acquiretime_shadowscapes> 30 </acquiretime_shadowscapes>
<acquiretime_relaxrate> 30 </acquiretime_relaxrate>
<acquiretime_iresponse> 30 </acquiretime_iresponse>
<acquiretime_shapefromshading> 30 </acquiretime_shapefromshading>
<acquiretime_strobe> 30 </acquiretime_strobe>
<acquiretime_camnoise> 30 </acquiretime_camnoise>
<acquiretime_colorsingle> 40 </acquiretime_colorsingle>
<acquiretime_colormulti> 40 </acquiretime_colormulti>
<acquiretime_diffnoise> 30 </acquiretime_diffnoise>
</analysis_time>
<relaxrate>
<treshold>51</treshold>
<maxblobs>25</maxblobs>
</relaxrate>
</config> </config>

View File

@ -151,17 +151,17 @@ void CamNoiseAnalysis::synthesise()
//cvColorImage2.setFromPixels(image5.getPixels(), image5.width, image5.height); //cvColorImage2.setFromPixels(image5.getPixels(), image5.width, image5.height);
cvColorImage1.convertToGrayscalePlanarImage(cvGrayImage1, 1); cvColorImage1.convertToGrayscalePlanarImage(cvGrayImage1, 1);
// cvColorImage2.convertToGrayscalePlanarImage(cvGrayImage2, 1); // cvColorImage2.convertToGrayscalePlanarImage(cvGrayImage2, 1);
//added by tom we weren't actually setting cvgrayimage1 anywhere //added by tom we weren't actually setting cvgrayimage1 anywhere
// cvGrayImage1.setFromPixels(cvColorImage1.getPixels(),cvColorImage1.width,cvColorImage1.height); // cvGrayImage1.setFromPixels(cvColorImage1.getPixels(),cvColorImage1.width,cvColorImage1.height);
//cvGrayDiff1.absDiff(cvGrayImage2, cvGrayImage1); //cvGrayDiff1.absDiff(cvGrayImage2, cvGrayImage1);
//cvGrayImage1=cvColorImage1; //cvGrayImage1=cvColorImage1;
cvGrayImage1.erode(); cvGrayImage1.erode();
cvGrayImage1.erode(); cvGrayImage1.erode();
cvGrayImage1.erode(); cvGrayImage1.erode();
cvGrayImage1.blur(); cvGrayImage1.blur();
cvGrayImage1.contrastStretch(); cvGrayImage1.contrastStretch();
/* cvColorImage1.erode(); /* cvColorImage1.erode();
cvColorImage1.erode(); cvColorImage1.erode();
cvColorImage1.erode(); cvColorImage1.erode();

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);

View File

@ -105,7 +105,7 @@ void ColorSingleAnalysis::acquire()
Timer* save_timer; Timer* save_timer;
TimerCallback<ColorSingleAnalysis> save_callback(*this, &ColorSingleAnalysis::save_cb); TimerCallback<ColorSingleAnalysis> save_callback(*this, &ColorSingleAnalysis::save_cb);
_run_cnt++; _run_cnt++;
_frame_cnt = 0; _save_cnt = 0; _anim_cnt = 0, _synth_save_cnt = 0; _frame_cnt = 0; _save_cnt = 0; _anim_cnt = 0, _synth_save_cnt = 0;
_RUN_DONE = false; _RUN_DONE = false;
@ -124,7 +124,6 @@ void ColorSingleAnalysis::acquire()
save_timer->stop(); save_timer->stop();
// } // }
} }
@ -135,13 +134,108 @@ void ColorSingleAnalysis::synthesise()
if(_state == STATE_STOP) return; if(_state == STATE_STOP) return;
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 +274,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);
@ -192,9 +286,12 @@ void ColorSingleAnalysis::synthesise()
saveImageSynthesis(file_name, &cvColorImage1, OF_IMAGE_COLOR); saveImageSynthesis(file_name, &cvColorImage1, OF_IMAGE_COLOR);
_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
@ -238,8 +335,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 +480,42 @@ 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 > 2)
{
_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();
}
}
}
_RUN_DONE = true;
break;
/*
//cout << "STATE_DISPLAY_RESULTS...\n" << endl;
if (_frame_cnt > 2) if (_frame_cnt > 2)
{ {
@ -402,9 +531,9 @@ void ColorSingleAnalysis::draw()
ofEnableAlphaBlending(); ofEnableAlphaBlending();
ofSetColor(255, 255, 255); ofSetColor(255, 255, 255);
image2.setFromPixels(image3.getPixels(),image3.width,image3.height, OF_IMAGE_COLOR); image2.setFromPixels(image3.getPixels(),image3.width,image3.height, OF_IMAGE_COLOR);
image2.draw(0,0, ofGetWidth(), ofGetHeight()); image2.draw(0,0, ofGetWidth(), ofGetHeight());
ofDisableAlphaBlending(); ofDisableAlphaBlending();
} }
@ -412,12 +541,11 @@ 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;
} }
} }

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;
}; };

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();

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;