From 7b8dcd094090b6b04593297b9106aed2f8c27a25 Mon Sep 17 00:00:00 2001 From: Jamie Allen Date: Mon, 27 Feb 2012 19:26:11 +0100 Subject: [PATCH] commit prior to trying to revert to david's branches --- config.refindx | 5 - src/RelaxRateAnalysis.cpp | 115 ++++++++++++----- src/RelaxRateAnalysis.h | 9 +- src/rficv/rfiCvContourFinder.cpp | 211 ------------------------------- src/rficv/rfiCvContourFinder.h | 73 ----------- 5 files changed, 81 insertions(+), 332 deletions(-) delete mode 100644 src/rficv/rfiCvContourFinder.cpp delete mode 100644 src/rficv/rfiCvContourFinder.h diff --git a/config.refindx b/config.refindx index 392ceb3..9dd552e 100644 --- a/config.refindx +++ b/config.refindx @@ -36,9 +36,4 @@ 40 30 - - - 51 - - \ No newline at end of file diff --git a/src/RelaxRateAnalysis.cpp b/src/RelaxRateAnalysis.cpp index f636b9e..2de1a55 100755 --- a/src/RelaxRateAnalysis.cpp +++ b/src/RelaxRateAnalysis.cpp @@ -12,7 +12,6 @@ using Poco::Thread; #define NUMBER_RUNS 1 #define ACQUIRE_TIME 20 -#define TRESHOLD 80 void RelaxRateAnalysis::setup(int camWidth, int camHeight) { @@ -24,9 +23,6 @@ void RelaxRateAnalysis::setup(int camWidth, int camHeight) acq_run_time = RefractiveIndex::XML.getValue("config:analysis_time:acquiretime_relaxrate", ACQUIRE_TIME); cout << "ACQUIRE_TIME RelaxRateAnalysis " << acq_run_time << endl; - _treshold = RefractiveIndex::XML.getValue("config:relaxrate:treshold", TRESHOLD); - cout << "TRESHOLD RelaxRateAnalysis " << _treshold << endl; - //int acq_run_time = 20; // 20 seconds of acquiring per run DELTA_T_SAVE = 2*(10*acq_run_time/2); // for 20 seconds, we want this to be around 200 files @@ -128,26 +124,63 @@ void RelaxRateAnalysis::synthesise() //cout << "IResponseAnalysis::saving synthesis...\n"; if(_state == STATE_STOP) return; - cvContourFinderVect.clear(); - - for(float i=1;i<_saved_filenames_analysis.size();i++){ - + for(float i=1;i<_saved_filenames_analysis.size()-1;i++){ + + //cout << "IResponseAnalysis::synthesis FOR LOOP...\n"; + + //cout << "_saved_filenames_analysis[i]" << _saved_filenames_analysis[i] << endl; + if(_state == STATE_STOP) return; - + + if(!image1.loadImage(_saved_filenames_analysis[i])){ + //couldn't load image + cout << "didn't load image" << endl; + } + if(image1.loadImage(_saved_filenames_analysis[i])){ + //cout << "LOADED image1!!!" << endl; + if(image5.loadImage(_saved_filenames_analysis[i+1])){ - ///////////////////////// PROCESS THE SAVED CAMERA IMAGES OF SHIT TO THE IMAGES ////////////////////////// - - cvColorImage1.setFromPixels(image1.getPixels(), image1.width, image1.height); - cvGrayDiff1 = cvColorImage1; - cvGrayDiff1.threshold(_treshold); - - rfiCvContourFinder* cf = new rfiCvContourFinder(); - - cf->findContours(cvGrayDiff1, 20, (image1.width * image1.height) / 4, 25, true); - - cvContourFinderVect.push_back(cf); - + ///////////////////////// PROCESS THE SAVED CAMERA IMAGES OF SHIT TO THE IMAGES ////////////////////////// + + cvColorImage1.setFromPixels(image1.getPixels(), image1.width, image1.height); + cvColorImage2.setFromPixels(image5.getPixels(), image5.width, image5.height); + + cvGrayImage1 = cvColorImage1; + cvGrayImage2 = cvColorImage2; + + cvGrayDiff1.absDiff(cvGrayImage2, cvGrayImage1); + cvGrayDiff1.threshold(80); + + cvContourFinder1.findContours(cvGrayDiff1, 20, (image1.width * image1.height) / 4, 25, true); + + + /////////////////////////////////// SAVE TO DISK IN THE SYNTHESIS FOLDER //////////////////////////////// + string file_name; + + file_name = ofToString(_synth_save_cnt, 2)+"_RelaxRateAnalysis_"+ofToString(_run_cnt,2)+".jpg"; + + + //<---- THE OLD WAY OF SAVING - works on OSX but generates BLACK FRAMES on WINDOWS ----> + // ofSaveImage(cvGrayImage1.getPixelsRef(),_whole_file_path_synthesis+"/"+file_name, OF_IMAGE_QUALITY_BEST); + + + //<---- NEW SAVING - seems to fix WINDOWS saving out BLACK FRAMES PROBLEM ----> + //ofImage image; + //image.allocate(cvGrayDiff1.width, cvGrayDiff1.height, OF_IMAGE_GRAYSCALE); + + //*** This needs to be here for OSX of we get a BAD ACCESS ERROR. DOES IT BREAK WINDOWS? ***// + //image.setUseTexture(false); + + //image.setFromPixels(cvGrayDiff1.getPixels(), cvGrayDiff1.width, cvGrayDiff1.height, OF_IMAGE_GRAYSCALE); + //image.saveImage(_whole_file_path_synthesis+"/"+file_name); + + //_saved_filenames_synthesis.push_back(_whole_file_path_synthesis+"/"+file_name); + + // <--- REALLY NEW SAVING METHOD --- 26 feb 2012 --- consolidated the save function into Abstract Analysis> /// + saveImageSynthesis(file_name, &cvGrayDiff1, OF_IMAGE_GRAYSCALE); + _synth_save_cnt++; + } } } @@ -159,27 +192,31 @@ void RelaxRateAnalysis::synthesise() void RelaxRateAnalysis::displayresults() { - - cvContourFinderVectDisplay.clear(); - for(int i=1;idraw(0,0, ofGetWidth(), ofGetHeight()); - } - + //cout << "_show_image...\n" << endl; + + ofEnableAlphaBlending(); + + ofSetColor(255, 255, 255); + image2.setFromPixels(image3.getPixels(),image3.width,image3.height, OF_IMAGE_GRAYSCALE); + image2.draw(0,0, ofGetWidth(), ofGetHeight()); + + ofDisableAlphaBlending(); } // display results of the synthesis diff --git a/src/RelaxRateAnalysis.h b/src/RelaxRateAnalysis.h index 2b75cef..a929304 100755 --- a/src/RelaxRateAnalysis.h +++ b/src/RelaxRateAnalysis.h @@ -5,12 +5,8 @@ #include "Poco/Timer.h" -#include "rfiCvContourFinder.h" - #include "ofxOpenCv.h" - - class RelaxRateAnalysis : public AbstractAnalysis { public: @@ -35,8 +31,6 @@ protected: int _run_cnt, _save_cnt, _synth_save_cnt, _anim_cnt; float c, _frame_cnt, _frame_cnt_max, _anim_cnt_max; - int _treshold; - bool _show_image, _image_shown; ofImage image1; ofImage image2; @@ -60,7 +54,6 @@ protected: ofxCvGrayscaleImage cvGrayImage3; ofxCvGrayscaleImage cvGrayImage4; - vector cvContourFinderVect; - vector cvContourFinderVectDisplay; + ofxCvContourFinder cvContourFinder1; }; diff --git a/src/rficv/rfiCvContourFinder.cpp b/src/rficv/rfiCvContourFinder.cpp deleted file mode 100644 index 41ccd5c..0000000 --- a/src/rficv/rfiCvContourFinder.cpp +++ /dev/null @@ -1,211 +0,0 @@ - -#include "rfiCvContourFinder.h" - - - -//-------------------------------------------------------------------------------- -static bool sort_carea_compare( const CvSeq* a, const CvSeq* b) { - // use opencv to calc size, then sort based on size - float areaa = fabs(cvContourArea(a, CV_WHOLE_SEQ)); - float areab = fabs(cvContourArea(b, CV_WHOLE_SEQ)); - - //return 0; - return (areaa > areab); -} - - - - -//-------------------------------------------------------------------------------- -rfiCvContourFinder::rfiCvContourFinder() { - _width = 0; - _height = 0; - myMoments = (CvMoments*)malloc( sizeof(CvMoments) ); - reset(); -} - -//-------------------------------------------------------------------------------- -rfiCvContourFinder::~rfiCvContourFinder() { - free( myMoments ); -} - -//-------------------------------------------------------------------------------- -void rfiCvContourFinder::reset() { - cvSeqBlobs.clear(); - blobs.clear(); - nBlobs = 0; -} - -//-------------------------------------------------------------------------------- -int rfiCvContourFinder::findContours( ofxCvGrayscaleImage& input, - int minArea, - int maxArea, - int nConsidered, - bool bFindHoles, - bool bUseApproximation) { - - // get width/height disregarding ROI - IplImage* ipltemp = input.getCvImage(); - _width = ipltemp->width; - _height = ipltemp->height; - - reset(); - - // opencv will clober the image it detects contours on, so we want to - // copy it into a copy before we detect contours. That copy is allocated - // if necessary (necessary = (a) not allocated or (b) wrong size) - // so be careful if you pass in different sized images to "findContours" - // there is a performance penalty, but we think there is not a memory leak - // to worry about better to create mutiple contour finders for different - // sizes, ie, if you are finding contours in a 640x480 image but also a - // 320x240 image better to make two rfiCvContourFinder objects then to use - // one, because you will get penalized less. - - if( inputCopy.getWidth() == 0 ) { - inputCopy.setUseTexture(false); - inputCopy.allocate( _width, _height ); - } else if( inputCopy.getWidth() != _width || inputCopy.getHeight() != _height ) { - // reallocate to new size - inputCopy.clear(); - inputCopy.setUseTexture(false); - inputCopy.allocate( _width, _height ); - } - - inputCopy.setROI( input.getROI() ); - inputCopy = input; - - CvSeq* contour_list = NULL; - contour_storage = cvCreateMemStorage( 1000 ); - storage = cvCreateMemStorage( 1000 ); - - CvContourRetrievalMode retrieve_mode - = (bFindHoles) ? CV_RETR_LIST : CV_RETR_EXTERNAL; - cvFindContours( inputCopy.getCvImage(), contour_storage, &contour_list, - sizeof(CvContour), retrieve_mode, bUseApproximation ? CV_CHAIN_APPROX_SIMPLE : CV_CHAIN_APPROX_NONE ); - CvSeq* contour_ptr = contour_list; - - // put the contours from the linked list, into an array for sorting - while( (contour_ptr != NULL) ) { - float area = fabs( cvContourArea(contour_ptr, CV_WHOLE_SEQ) ); - if( (area > minArea) && (area < maxArea) ) { - cvSeqBlobs.push_back(contour_ptr); - } - contour_ptr = contour_ptr->h_next; - } - - - // sort the pointers based on size - if( cvSeqBlobs.size() > 1 ) { - sort( cvSeqBlobs.begin(), cvSeqBlobs.end(), sort_carea_compare ); - } - - - // now, we have cvSeqBlobs.size() contours, sorted by size in the array - // cvSeqBlobs let's get the data out and into our structures that we like - for( int i = 0; i < MIN(nConsidered, (int)cvSeqBlobs.size()); i++ ) { - blobs.push_back( ofxCvBlob() ); - float area = cvContourArea( cvSeqBlobs[i], CV_WHOLE_SEQ ); - CvRect rect = cvBoundingRect( cvSeqBlobs[i], 0 ); - cvMoments( cvSeqBlobs[i], myMoments ); - - blobs[i].area = fabs(area); - blobs[i].hole = area < 0 ? true : false; - blobs[i].length = cvArcLength(cvSeqBlobs[i]); - blobs[i].boundingRect.x = rect.x; - blobs[i].boundingRect.y = rect.y; - blobs[i].boundingRect.width = rect.width; - blobs[i].boundingRect.height = rect.height; - blobs[i].centroid.x = (myMoments->m10 / myMoments->m00); - blobs[i].centroid.y = (myMoments->m01 / myMoments->m00); - - // get the points for the blob: - CvPoint pt; - CvSeqReader reader; - cvStartReadSeq( cvSeqBlobs[i], &reader, 0 ); - - for( int j=0; j < cvSeqBlobs[i]->total; j++ ) { - CV_READ_SEQ_ELEM( pt, reader ); - blobs[i].pts.push_back( ofPoint((float)pt.x, (float)pt.y) ); - } - blobs[i].nPts = blobs[i].pts.size(); - - } - - nBlobs = blobs.size(); - - // Free the storage memory. - // Warning: do this inside this function otherwise a strange memory leak - if( contour_storage != NULL ) { cvReleaseMemStorage(&contour_storage); } - if( storage != NULL ) { cvReleaseMemStorage(&storage); } - - return nBlobs; - -} - -//-------------------------------------------------------------------------------- -void rfiCvContourFinder::draw( float x, float y, float w, float h ) { - - float scalex = 0.0f; - float scaley = 0.0f; - if( _width != 0 ) { scalex = w/_width; } else { scalex = 1.0f; } - if( _height != 0 ) { scaley = h/_height; } else { scaley = 1.0f; } - - if(bAnchorIsPct){ - x -= anchor.x * w; - y -= anchor.y * h; - }else{ - x -= anchor.x; - y -= anchor.y; - } - - ofPushStyle(); - glPushMatrix(); - glTranslatef( x, y, 0.0 ); - glScalef( scalex, scaley, 0.0 ); - ofSetHexColor(0xFFFFFF); - - for( int i=0; i<(int)blobs.size(); i++ ) { - ofNoFill(); - ofBeginShape(); - for( int j=0; j - -class rfiCvContourFinder : public ofBaseDraws { - - public: - - vector blobs; - int nBlobs; // DEPRECATED: use blobs.size() instead - - - rfiCvContourFinder(); - virtual ~rfiCvContourFinder(); - - virtual float getWidth() { return _width; }; //set after first findContours call - virtual float getHeight() { return _height; }; //set after first findContours call - - virtual int findContours( ofxCvGrayscaleImage& input, - int minArea, int maxArea, - int nConsidered, bool bFindHoles, - bool bUseApproximation = true); - // approximation = don't do points for all points - // of the contour, if the contour runs - // along a straight line, for example... - - virtual void draw() { draw(0,0, _width, _height); }; - virtual void draw( float x, float y ) { draw(x,y, _width, _height); }; - virtual void draw( float x, float y, float w, float h ); - virtual void draw(const ofPoint & point); - virtual void draw(const ofRectangle & rect); - virtual void setAnchorPercent(float xPct, float yPct); - virtual void setAnchorPoint(int x, int y); - virtual void resetAnchor(); - //virtual ofxCvBlob getBlob(int num); - - - - protected: - - int _width; - int _height; - ofxCvGrayscaleImage inputCopy; - CvMemStorage* contour_storage; - CvMemStorage* storage; - CvMoments* myMoments; - vector cvSeqBlobs; //these will become blobs - - ofPoint anchor; - bool bAnchorIsPct; - - virtual void reset(); - -}; - - - -#endif