From 2261a9a1f146cf528e2b5142b531d14428c12f2e Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Tue, 10 Dec 2013 13:05:22 +0000 Subject: similarity segmentation working --- rotord/src/libavwrapper.cpp | 7 ++-- rotord/src/nodes_audio_analysis.cpp | 69 ++++++++++++++++++++++++++++--------- rotord/src/nodes_channels.h | 2 +- 3 files changed, 58 insertions(+), 20 deletions(-) (limited to 'rotord/src') diff --git a/rotord/src/libavwrapper.cpp b/rotord/src/libavwrapper.cpp index d48cbc3..a6cb56d 100644 --- a/rotord/src/libavwrapper.cpp +++ b/rotord/src/libavwrapper.cpp @@ -65,9 +65,12 @@ bool libav::video_decoder::open(const std::string& filename){ } } if (makeindex) { - cerr<<"FFMS2: creating index "<0;j--){ seggrps[s.second[0]].second.push_back(make_pair(totalsmap[s.second[j]],s.second[j])); //keep running average// should be by area? - seggrps[s.second[0]].first+=(totalsmap[s.second[j]]*(1.0/max(1,(int)seggrps[s.second[0]].second.size()-1))); - double div=seggrps[s.second[0]].second.size()==1?1.0:((double)seggrps[s.second[0]].second.size()-1/(double)seggrps[s.second[0]].second.size()); + //seggrps[s.second[0]].first+=(totalsmap[s.second[j]]*(1.0/max(1,(int)seggrps[s.second[0]].second.size()-1))); + //double div=seggrps[s.second[0]].second.size()==1?1.0:((double)seggrps[s.second[0]].second.size()-1/(double)seggrps[s.second[0]].second.size()); //neat! this gives 1,1/2,2/3,3/4.. - seggrps[s.second[0]].first*=div; + //seggrps[s.second[0]].first*=div; + + //easier is to + double avg=0.0f; + for (auto p:seggrps[s.second[0]].second) avg+=p.first; + avg/=seggrps[s.second[0]].second.size(); + seggrps[s.second[0]].first=avg; + seggrps.erase(seggrps.begin()+s.second[j]); } } @@ -291,21 +298,49 @@ nned to retrieve total intensity by segment //sort the contents by intensity std::sort(seggrps.begin(),seggrps.end(),sortseggrps); //possible mergers will be with groups with adjacent intensity - while (seggrps.size()>(int)parameters["levels"]->value){ - //reduce similarity groups - //decide the best 2 to merge - vector diffs; - for (int j=0;jvalue)>0) { + while (seggrps.size()>(int)parameters["levels"]->value){ + //reduce similarity groups + //decide the best 2 to merge + vector diffs; + for (int j=0;jvalue,(int)totalsmap.size())) { + //split groups + //calculate standard deviation of intensity variation + vector devs; + for (int j=0;jdevs[largest]) largest=j; + //sanity check: if there are any groups that can be split they will have larger SD than singleton groups + //TODO actually split group } - seggrps.erase(seggrps.begin()+smallest); - } - cerr<<"intensities merged, "<value) { - //split groups } map outputvalues; diff --git a/rotord/src/nodes_channels.h b/rotord/src/nodes_channels.h index 4782e00..3b3fa70 100644 --- a/rotord/src/nodes_channels.h +++ b/rotord/src/nodes_channels.h @@ -419,7 +419,7 @@ namespace Rotor { Echo_trails(){ //calls base class constructor first create_parameter("number","number","number of echoes","Number echoes",25.0); - create_parameter("fadeto","number","amount that echoes fade out","Fadout amount",1.0,0.0,1.0); + create_parameter("fadeto","number","amount that echoes fade out to","Fadeout amount",1.0,0.0,1.0); create_parameter("interval","number","number of frames between echoes","",1.0,0.0,1.0); create_attribute("mode","blend mode for echoes","Blend mode","screen",{"screen","wrap","min","max"}); title="Echo trails"; -- cgit v1.2.3