Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>pseudo codes suck big time! here's the un-pseudo/ed version. results?:there is only try or try not</p> <p>bgfg_vibe.hpp</p> <pre><code>#ifndef bgfg_vibe_hpp #define bgfg_vibe_hpp #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" struct Model { cv::Mat*** samples; cv::Mat** fgch; cv::Mat* fg; }; class bgfg_vibe { #define rndSize 256 unsigned char ri; #define rdx ri++ public: bgfg_vibe(); int N,R,noMin,phi; void init_model(cv::Mat&amp; firstSample); void setphi(int phi); cv::Mat* fg(cv::Mat&amp; frame); private: bool initDone; cv::RNG rnd; Model* model; void init(); void fg1ch(cv::Mat&amp; frame,cv::Mat** samples,cv::Mat* fg); int rndp[rndSize],rndn[rndSize],rnd8[rndSize]; }; #endif </code></pre> <p>bgfg_vibe.cpp</p> <pre><code>#include "bgfg_vibe.hpp" bgfg_vibe::bgfg_vibe():R(20),N(20),noMin(2),phi(0) { initDone=false; rnd=cv::theRNG(); ri=0; } void bgfg_vibe::init() { for(int i=0;i&lt;rndSize;i++) { rndp[i]=rnd(phi); rndn[i]=rnd(N); rnd8[i]=rnd(8); } } void bgfg_vibe::setphi(int phi) { this-&gt;phi=phi; for(int i=0;i&lt;rndSize;i++) { rndp[i]=rnd(phi); } } void bgfg_vibe::init_model(cv::Mat&amp; firstSample) { std::vector&lt;cv::Mat&gt; channels; split(firstSample,channels); if(!initDone) { init(); initDone=true; } model=new Model; model-&gt;fgch= new cv::Mat*[channels.size()]; model-&gt;samples=new cv::Mat**[N]; model-&gt;fg=new cv::Mat(cv::Size(firstSample.cols,firstSample.rows), CV_8UC1); for(size_t s=0;s&lt;channels.size();s++) { model-&gt;fgch[s]=new cv::Mat(cv::Size(firstSample.cols,firstSample.rows), CV_8UC1); cv::Mat** samples= new cv::Mat*[N]; for(int i=0;i&lt;N;i++) { samples[i]= new cv::Mat(cv::Size(firstSample.cols,firstSample.rows), CV_8UC1); } for(int i=0;i&lt;channels[s].rows;i++) { int ioff=channels[s].step.p[0]*i; for(int j=0;j&lt;channels[0].cols;j++) { for(int k=0;k&lt;1;k++) { (samples[k]-&gt;data + ioff)[j]=channels[s].at&lt;uchar&gt;(i,j); } (model-&gt;fgch[s]-&gt;data + ioff)[j]=0; if(s==0)(model-&gt;fg-&gt;data + ioff)[j]=0; } } model-&gt;samples[s]=samples; } } void bgfg_vibe::fg1ch(cv::Mat&amp; frame,cv::Mat** samples,cv::Mat* fg) { int step=frame.step.p[0]; for(int i=1;i&lt;frame.rows-1;i++) { int ioff= step*i; for(int j=1;j&lt;frame.cols-1;j++) { int count =0,index=0; while((count&lt;noMin) &amp;&amp; (index&lt;N)) { int dist= (samples[index]-&gt;data + ioff)[j]-(frame.data + ioff)[j]; if(dist&lt;=R &amp;&amp; dist&gt;=-R) { count++; } index++; } if(count&gt;=noMin) { ((fg-&gt;data + ioff))[j]=0; int rand= rndp[rdx]; if(rand==0) { rand= rndn[rdx]; (samples[rand]-&gt;data + ioff)[j]=(frame.data + ioff)[j]; } rand= rndp[rdx]; int nxoff=ioff; if(rand==0) { int nx=i,ny=j; int cases= rnd8[rdx]; switch(cases) { case 0: //nx--; nxoff=ioff-step; ny--; break; case 1: //nx--; nxoff=ioff-step; ny; break; case 2: //nx--; nxoff=ioff-step; ny++; break; case 3: //nx++; nxoff=ioff+step; ny--; break; case 4: //nx++; nxoff=ioff+step; ny; break; case 5: //nx++; nxoff=ioff+step; ny++; break; case 6: //nx; ny--; break; case 7: //nx; ny++; break; } rand= rndn[rdx]; (samples[rand]-&gt;data + nxoff)[ny]=(frame.data + ioff)[j]; } }else { ((fg-&gt;data + ioff))[j]=255; } } } } cv::Mat* bgfg_vibe::fg(cv::Mat&amp; frame) { std::vector&lt;cv::Mat&gt; channels; split(frame,channels); for(size_t i=0;i&lt;channels.size();i++) { fg1ch(channels[i],model-&gt;samples[i],model-&gt;fgch[i]); if(i&gt;0 &amp;&amp; i&lt;2) { bitwise_or(*model-&gt;fgch[i-1],*model-&gt;fgch[i],*model-&gt;fg); } if(i&gt;=2) { bitwise_or(*model-&gt;fg,*model-&gt;fgch[i],*model-&gt;fg); } } if(channels.size()==1) return model-&gt;fgch[0]; return model-&gt;fg; } </code></pre> <p>main.cpp</p> <pre><code>#include "bgfg_vibe.hpp" using namespace cv; int main(int argc, char ** argv) { Mat frame; bgfg_vibe bgfg; VideoCapture cap("c:/toprocess/frame_%04d.jpg"); cap &gt;&gt; frame; bgfg.init_model(frame); for(;;) { cap&gt;&gt;frame; Mat fg = *bgfg.fg(frame); imshow("fg",fg); waitKey(1); } return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload