← index
acidcamGL/source/plugin/fade_shuffle/fade.cpp
Source: acidcamGL/source/plugin/fade_shuffle/fade.cpp
#include"ac.h"
#include<cstdlib>
#include<ctime>


void alphablend(cv::Mat &src, cv::Mat &cpy, double alpha) {
    for(int z = 0; z < src.rows; ++z) {
        for(int i = 0; i < src.cols; ++i) {
            cv::Vec3b &pixel = src.at<cv::Vec3b>(z, i);
            cv::Vec3b &pix = cpy.at<cv::Vec3b>(z, i);
            for(int j = 0; j < 3; ++j) {
                pixel[j] = ac::wrap_cast((alpha * pixel[j]) + ( (1-alpha) * pix[j]));
            }
        }
    }
}

extern "C" void filter(cv::Mat  &frame) {
    static std::vector<std::string> fname;
    static int init = 0;
    if(init == 0) {
        ac::init();
        init = 1;
        srand(static_cast<unsigned int>(time(0)));
        std::copy(ac::solo_filter.begin(), ac::solo_filter.end(), std::back_inserter(fname));
        unsigned int seed = std::chrono::system_clock::now().time_since_epoch().count();
             std::shuffle(fname.begin(), fname.end(), std::default_random_engine(seed));
    }
    static int offset1 = 0;
    static int offset2 = 1;
    static double alpha = 0.1;
    cv::Mat cpy = frame.clone();
    ac::CallFilter(fname[offset1], frame);
    ac::CallFilter(fname[offset2], cpy);
    alphablend(frame, cpy, alpha);
    static int dir = 1;
    if(dir == 1) {
        alpha += 0.05;
        if(alpha >= 1) {
            alpha = 1;
            dir = 0;
            offset2++;
            if(offset2 > (fname.size()-1)) {
                offset2 = 0;
                unsigned int seed = std::chrono::system_clock::now().time_since_epoch().count();
                     std::shuffle(fname.begin(), fname.end(), std::default_random_engine(seed));
            }
            
        }
    } else {
        alpha -= 0.05;
        if(alpha <= 0.1) {
            alpha = 0.1;
            dir = 1;
            offset1++;
            if(offset1 > (fname.size()-1)) {
                offset1 = 0;
                unsigned int seed = std::chrono::system_clock::now().time_since_epoch().count();
                     std::shuffle(fname.begin(), fname.end(), std::default_random_engine(seed));
            }
            
        }
    }
}