/* * Software written by Jared Bruni https://github.com/lostjared This software is dedicated to all the people that experience mental illness. Website: http://lostsidedead.com YouTube: http://youtube.com/LostSideDead Instagram: http://instagram.com/jaredbruni Twitter: http://twitter.com/jaredbruni Facebook: http://facebook.com/LostSideDead0x You can use this program free of charge and redistrubute it online as long as you do not charge anything for this program. This program is meant to be 100% free. BSD 2-Clause License Copyright (c) 2019, Jared Bruni All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include"ac.h" void ac::RandomFilteredSquare(cv::Mat &frame) { static std::unique_ptr boxes; int num_boxes = static_cast(frame.cols/0.5); if(boxes == 0 || (frame.cols != Box::frame_width)) { boxes.reset(new Box[num_boxes]); Box::frame_width = frame.cols; Box::frame_height = frame.rows; for(int i = 0; i < num_boxes; ++i) boxes.get()[i].initBox(frame.cols, frame.rows); } for(int i = 0; i < num_boxes; ++i) { boxes.get()[i].sizeBox(); boxes.get()[i].drawBox(frame); } } void ac::RandomQuads(cv::Mat &frame) { static MatrixCollection<8> collection; collection.shiftFrames(frame); for(int j = 0; j < 4; ++j) { int frame_index = 0; do { frame_index = rand()%28; } while(frame_index == 13 || frame_index == 14); CallFilter(frame_index, collection.frames[j]); } cv::Size quarter(frame.cols/2, frame.rows/2); ac::copyMat(collection.frames[0],0, 0, frame, ac::Rect(0, 0, quarter)); ac::copyMat(collection.frames[1],frame.cols/2, 0, frame, ac::Rect(frame.cols/2,0, quarter)); ac::copyMat(collection.frames[2],frame.cols/2, frame.rows/2, frame, ac::Rect(frame.cols/2, frame.rows/2, quarter)); ac::copyMat(collection.frames[3],0, frame.rows/2, frame, ac::Rect(0,frame.rows/2, quarter)); } void ac::QuadCosSinMultiply(cv::Mat &frame) { cv::Mat frame_copy = frame.clone(); cv::Size quarter(frame.cols/2, frame.rows/2); DrawFunction procFunc = getFilter(ac::draw_strings[15]); procFunc(frame_copy); procFunc(frame_copy); ac::copyMat(frame_copy,0, 0, frame, ac::Rect(0, 0, quarter)); procFunc(frame_copy); ac::copyMat(frame_copy,frame.cols/2, 0, frame, ac::Rect(frame.cols/2,0, quarter)); procFunc(frame_copy); ac::copyMat(frame_copy,frame.cols/2, frame.rows/2, frame, ac::Rect(frame.cols/2, frame.rows/2, quarter)); procFunc(frame_copy); ac::copyMat(frame_copy,0, frame.rows/2, frame, ac::Rect(0,frame.rows/2, quarter)); } void ac::QuadRandomFilter(cv::Mat &frame) { if(testSize(frame) == false) return; cv::Mat frame_copy = frame.clone(); cv::Size quarter(frame.cols/2, frame.rows/2); int base_index = 0, index = 0; DrawFunction baseFilter = getRandomFilter(base_index); baseFilter(frame_copy); DrawFunction procFunc = getRandomFilter(index); procFunc(frame_copy); ac::copyMat(frame_copy,0, 0, frame, ac::Rect(0, 0, quarter)); procFunc(frame_copy); ac::copyMat(frame_copy,frame.cols/2, 0, frame, ac::Rect(frame.cols/2,0, quarter)); procFunc(frame_copy); ac::copyMat(frame_copy,frame.cols/2, frame.rows/2, frame, ac::Rect(frame.cols/2, frame.rows/2, quarter)); procFunc(frame_copy); ac::copyMat(frame_copy,0, frame.rows/2, frame,ac::Rect(0,frame.rows/2, quarter)); } void ac::RollRandom(cv::Mat &frame) { if(testSize(frame) == false) return; SquareVertical_Roll(frame); int index = 0; DrawFunction rand_func = getRandomFilter(index); rand_func(frame); } void ac::AverageRandom(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 8.0; cv::Mat frame_copy = frame.clone(), frame_copy2 = frame.clone(); int index = 0; DrawFunction func = getRandomFilter(index); func(frame_copy); func(frame_copy2); for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b pix1 = frame_copy.at(z, i); cv::Vec3b pix2 = frame_copy2.at(z, i); for(int j = 0; j < 3; ++j) { pixel[j] = static_cast(pixel[j] + pix1[j] + pix2[j]); pixel[j] /= static_cast(1.5); pixel[j] = static_cast(pixel[j] * (1+alpha)); } } } static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::HorizontalStripes(cv::Mat &frame) { if(frame.empty() || frame.rows < 25 || frame.cols < 25) return; static cv::Scalar value(1.0, 1.0, 1.0); for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { double rval = rand()%10; double val = rval * 0.001; value[j] += val; if(value[j] > 255) value[j] = 0; pixel[j] = pixel[j] ^ static_cast(value[j]); } } } MedianBlur(frame); Bitwise_XOR(frame); } void ac::DiamondStrobe(cv::Mat &frame) { static double pos = 1.0;// set pos to 1.0 int w = frame.cols;// frame width int h = frame.rows;// frame height static int index1 = 0, index2 = 2; ++index1; if(index1 > 2) index1 = 0; ++index2; if(index2 > 2) index2 = 0; for(int z = 0; z < h; ++z) {// from top to bottom for(int i = 0; i < w; ++i) {// from left to right cv::Vec3b &buffer = frame.at(z, i);// get current pixel // calculate the colors of the gradient diamonds if((i%2) == 0) {// if i % 2 equals 0 if((z%2) == 0) {// if z % 2 equals 0 // set pixel component values buffer[index1] = static_cast(1-pos*buffer[0]); buffer[index2] = static_cast((i+z)*pos); } else { // set pixel coomponent values buffer[index1] = static_cast(pos*buffer[0]-z); buffer[index2] = static_cast((i-z)*pos); } } else { if((z%2) == 0) {// if z % 2 equals 0 // set pixel component values buffer[index1] = static_cast(pos*buffer[0]-i); buffer[index2] = static_cast((i-z)*pos); } else { // set pixel component values buffer[index1] = static_cast(pos*buffer[0]-z); buffer[index2] = static_cast((i+z)*pos); } } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } // static direction starts off with 1 static double pos_max = 7.0f;// pos maximum static int direction = 1; procPos(direction, pos, pos_max); } void ac::SmoothTrails(cv::Mat &frame) { static MatrixCollection<8> collection; Smooth(frame, &collection); } void ac::Dual_SelfAlphaRainbow(cv::Mat &frame) { static double alpha1 = 2.0, alpha2 = 10.0, pos_max = 10.0; static bool switch_on = true; rainbowBlend(frame); for(int z = 0; z < frame.rows-1; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); if(switch_on == true) { for(int j = 0; j < 3; ++j) pixel[j] = static_cast(pixel[j]*alpha1); } else { for(int j = 0; j < 3; ++j) pixel[j] = static_cast(pixel[j]*alpha2); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } switch_on = !switch_on; } static int direction[2] = { 1, 0 }; procPos(direction[0], alpha1, pos_max); procPos(direction[1], alpha2, pos_max); } void ac::Dual_SelfAlphaBlur(cv::Mat &frame) { Dual_SelfAlphaRainbow(frame); MedianBlur(frame); MedianBlur(frame); Bitwise_XOR(frame); } void ac::SurroundPixelXor(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 4.0; for(int z = 0; z < frame.rows-3; ++z) { for(int i = 0; i < frame.cols-3; ++i) { cv::Vec3b pix[3]; cv::Vec3b &pixel = frame.at(z, i); pix[0] = frame.at(z+1, i); pix[1] = frame.at(z, i+1); pix[2] = frame.at(z+1, i+1); cv::Scalar value; value[0] = pix[0][0]+pix[1][0]+pix[2][0]; value[1] = pix[0][1]+pix[1][1]+pix[2][1]; value[3] = pix[0][2]+pix[1][2]+pix[2][2]; for(int j = 0; j < 3; ++j) { int val = static_cast(value[j]); pixel[j] = static_cast((val^pixel[j])*alpha); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::Darken(cv::Mat &frame) { for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); pixel[0] /= 6; pixel[1] /= 6; pixel[2] /= 6; } } } void ac::WeakBlend(cv::Mat &frame) { static int index = 0; static cv::Scalar value((rand()%5)+1,(rand()%5)+1,(rand()%5)+1); for(int i = 0; i < frame.cols; ++i) { for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { int val = static_cast(pixel[j]+(pixel[j]*value[index])); val /= 2; pixel[j] = static_cast(val); } index ++; if(index > 2) index = 0; swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } for(int j = 0; j < 3; ++j) { value[j] += 1+((rand()%5) * 0.5); if(value[j] > 10) { value[j] = rand()%10; } } } void ac::AverageVertical(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 8.0; std::unique_ptr values(new cv::Scalar[frame.rows]); for(int i = 0; i < frame.cols; ++i) { for(int z = 0; z < frame.rows; ++z) { cv::Vec3b pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) values.get()[z][j] += pixel[j]; } } for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Scalar val = values.get()[z]; cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { val[j] /= frame.rows; pixel[j] += static_cast(val[j]*alpha); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::RandomCollectionAverage(cv::Mat &frame) { if(testSize(frame) == false) return; static MatrixCollection<8> collection; int index = 0; DrawFunction randF = getRandomFilter(index); randF(frame); Smooth(frame, &collection); } void ac::RandomCollectionAverageMax(cv::Mat &frame) { if(testSize(frame) == false) return; static MatrixCollection<16> collection; int index = 0; DrawFunction randF = getRandomFilter(index); randF(frame); Smooth(frame, &collection); } void ac::SmoothTrailsSelfAlphaBlend(cv::Mat &frame) { static MatrixCollection<8> collection; MedianBlur(frame); SelfAlphaBlend(frame); Smooth(frame, &collection); } void ac::SmoothTrailsRainbowBlend(cv::Mat &frame) { static MatrixCollection<8> collection; MedianBlur(frame); rainbowBlend(frame); Smooth(frame, &collection); } void ac::MedianBlend(cv::Mat &frame) { static MatrixCollection<8> collection; int r = 3+rand()%7; for(int i = 0; i < r; ++i) MedianBlur(frame); collection.shiftFrames(frame); for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Scalar value; for(int j = 0; j < collection.size(); ++j) { cv::Vec3b pixel = collection.frames[j].at(z, i); for(int q = 0; q < 3; ++q) { value[q] += pixel[q]; } } cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { int val = 1+static_cast(value[j]); pixel[j] = static_cast(pixel[j] ^ val); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } } void ac::RandomAlphaBlend(cv::Mat &frame) { static MatrixCollection<8> collection; double alpha = 1.0, alpha_max = 6.0; int index = 0; if(testSize(frame) == false) return; DrawFunction randFunc = getRandomFilter(index); cv::Mat temp = frame.clone(), rand_frame = frame.clone(); randFunc(rand_frame); collection.shiftFrames(rand_frame); AlphaBlend(temp,rand_frame, frame, alpha); Smooth(frame, &collection); static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::RandomTwoFilterAlphaBlend(cv::Mat &frame) { /* static double alpha = 1.0, alpha_max = 5.0; static MatrixCollection<8> collection; cv::Mat one, two, output; one = frame.clone(); two = frame.clone(); int index = 0; DrawFunction randFunc1 = getRandomFilter(index); DrawFunction randFunc2 = getRandomFilter(index); randFunc1(one); randFunc2(two); AlphaBlend(one, two, output, alpha); collection.shiftFrames(output); Smooth(frame, &collection); static int direction = 1; procPos(direction, alpha, alpha_max); */ } void ac::PixelatedSquare(cv::Mat &frame) { static MatrixCollection<8> collection; static double alpha = 1.0, alpha_max = 3.0; cv::Mat filter_1 = frame.clone(); cv::Mat frame_copy; SurroundPixelXor(filter_1); GridFilter16x(filter_1); AlphaBlend(filter_1,frame,frame_copy,alpha); collection.shiftFrames(frame_copy); Smooth(frame, &collection); static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::AlphaBlendPosition(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 4.0; int pos_x = 0; for(int z = 0; z < frame.rows; ++z) { cv::Vec3b pix = frame.at(z, pos_x); ++pos_x; if(pos_x > frame.cols-1) pos_x = 0; for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) pixel[j] = static_cast((pixel[j]*(alpha+1))+(pix[j]*alpha)); swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::BlendRowAlpha(cv::Mat &frame) { static int row = 0; static double alpha = 1.0, alpha_max = 4.0; for(int i = 0; i < frame.cols; ++i) { row++; if(row > frame.cols) row = 0; for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { pixel[j] = static_cast((pixel[j] ^ row)*alpha); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::BlendRow(cv::Mat &frame) { static int row = 0; for(int i = 0; i < frame.cols; ++i) { row++; if(row > frame.cols) row = 0; for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { pixel[j] = static_cast(pixel[j] ^ row); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } } void ac::BlendRowByVar(cv::Mat &frame) { static int row = 0; for(int i = 0; i < frame.cols; ++i) { row++; if(row > frame.cols) row = 0; for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { pixel[j] = static_cast((pixel[j]+(z-i)) ^ row); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel } } } void ac::BlendRowByDirection(cv::Mat &frame) { static int row = 0; static int direction = 1; for(int i = 0; i < frame.cols; ++i) { if(direction == 1) { ++row; if(row > frame.cols) direction = 0; } else if(direction == 0) { --row; if(row <= 0) { direction = 1; } } for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { if(direction == 1) pixel[j] = static_cast((pixel[j]+i+z) & row); else if(direction == 0) pixel[j] = static_cast((pixel[j]^row)); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } } void ac::BlendAlphaXor(cv::Mat &frame) { static int r = 3; static int direction = 1; static double alpha = 1.0, alpha_max = 10.0; for(int i = 0; i < frame.cols; ++i) { for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { unsigned char val = static_cast(r*alpha); pixel[j] += cv::saturate_cast(pixel[j]^val); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } if(direction == 1) { ++r; if(r >= 255) direction = 0; } else if(direction == 0) { --r; if(r <= 3) direction = 1; } static int dir = 1; procPos(dir, alpha, alpha_max); } void ac::SelfXorScale(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 8.0; static int value = 1; for(int i = 0; i < frame.cols; ++i) { for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { pixel[j] = static_cast((pixel[j]^value)*alpha); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int direction = 1; if(direction == 1) { ++value; if(value > 254) direction = 0; } else if(direction == 0) { --value; if(value <= 1) direction = 1; } static int dir = 1; procPos(dir, alpha, alpha_max); } void ac::BitwiseXorScale(cv::Mat &frame) { static cv::Mat frame1 = frame.clone(); cv::Mat temp = frame.clone(); if(frame1.size()!=frame.size()) frame1 = temp.clone(); static double alpha = 1.0, alpha_max = 2.0; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b pix = frame1.at(z, i); for(int j = 0; j < 3; ++j) { pixel[j] += static_cast((pixel[j]^pix[j])*alpha); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } frame1 = temp; static int direction = 1; procPos(direction, alpha, alpha_max); } void ac::XorTrails(cv::Mat &frame) { static MatrixCollection<8> collection; collection.shiftFrames(frame); for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b value; for(int j = 0; j < collection.size(); ++j) { cv::Vec3b frame_val = collection.frames[j].at(z, i); for(int q = 0; q < 3; ++q) { value[q] ^= frame_val[q]; } } for(int j = 0; j < 3; ++j) pixel[j] = pixel[j]^value[j]; swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } } void ac::RainbowTrails(cv::Mat &frame) { static MatrixCollection<8> collection; collection.shiftFrames(frame); for(int i = 0; i < frame.cols; ++i) { for(int z = 0; z < frame.rows; ++z) { cv::Vec3b value; cv::Vec3b &pixel = frame.at(z, i);; for(int j = 1; j < collection.size(); ++j) { cv::Vec3b frame_val = collection.frames[j].at(z, i); for(int q = 0; q < 3; ++q) { value[q] += frame_val[q]; } } for(int j = 0; j < 3; ++j) { pixel[j] = pixel[j]^value[j]; } } } } void ac::NegativeTrails(cv::Mat &frame) { static MatrixCollection<8> collection; static double alpha = 1.0, alpha_max = 8.0; collection.shiftFrames(frame); for(int i = 0; i < frame.cols; ++i) { for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b value; for(int j = 0; j < collection.size(); ++j) { cv::Vec3b frame_val = collection.frames[j].at(z, i); for(int q = 0; q < 3; ++q) { pixel[q] ^= pixel[q]+frame_val[q]; } } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir = 1; procPos(dir, alpha, alpha_max); } void ac::IntenseTrails(cv::Mat &frame) { static MatrixCollection<8> collection; collection.shiftFrames(frame); static double alpha = 1.0, alpha_max = 8.0; for(int i = 0; i < frame.cols; ++i) { for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b value = pixel; for(int j = 0; j < collection.size(); ++j) { cv::Vec3b frame_val = collection.frames[j].at(z, i); for(int q =0; q < 3; ++q) { value[q] += static_cast(frame_val[q]*alpha); } } for(int j = 0; j < 3; ++j) pixel[j] ^= value[j]; swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir = 1; procPos(dir, alpha, alpha_max); } void ac::SelfAlphaRGB(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 3.0; static int index = 0; for(int i = 0; i < frame.cols-2; ++i) { for(int z = 0; z < frame.rows-2; ++z) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b pix[4]; pix[0] = frame.at(z+1, i+1); pix[1] = frame.at(z+1, i); pix[2] = frame.at(z, i+1); pix[3] = pixel; switch(index) { case 0: pixel[0] = static_cast(pix[0][0]*alpha); pixel[1] = static_cast((pix[0][1]+pix[1][1])*alpha); pixel[2] = static_cast((pix[0][2]+pix[1][2]+pix[2][2])*alpha); break; case 1: pixel[2] = static_cast(pix[0][0]*alpha); pixel[1] = static_cast((pix[0][1]+pix[1][1])*alpha); pixel[0] = static_cast((pix[0][2]+pix[1][2]+pix[2][2])*alpha); break; case 2: pixel[1] = static_cast(pix[0][0]*alpha); pixel[0] = static_cast((pix[0][1]+pix[1][1])*alpha); pixel[2] = static_cast((pix[0][2]+pix[1][2]+pix[2][2])*alpha); break; case 3: pixel[0] = pixel[0]^static_cast(pix[0][0]*alpha); pixel[1] = pixel[1]^static_cast((pix[0][1]+pix[1][1])*alpha); pixel[2] = pixel[2]^static_cast((pix[0][2]+pix[1][2]+pix[2][2])*alpha); break; } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir = 1; procPos(dir, alpha, alpha_max); ++index; if(index > 3) index = 0; } void ac::BitwiseXorStrobe(cv::Mat &frame) { static int index = 0; static double alpha1 = 1.0, alpha2 = 10.0, alpha3 = 5.0,alpha_max = 3.0; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); switch(index) { case 0: pixel[0] += cv::saturate_cast(pixel[0] * alpha1); pixel[1] += cv::saturate_cast(pixel[1] * alpha2); pixel[2] += cv::saturate_cast(pixel[2] * alpha3); break; case 1: pixel[2] += cv::saturate_cast(pixel[0] * alpha1); pixel[0] += cv::saturate_cast(pixel[1] * alpha2); pixel[1] += cv::saturate_cast(pixel[2] * alpha3); break; case 2: pixel[1] += cv::saturate_cast(pixel[0] * alpha1); pixel[2] += cv::saturate_cast(pixel[1] * alpha2); pixel[0] += cv::saturate_cast(pixel[2] * alpha3); break; } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir1 = 1, dir2 = 0, dir3 = 1; procPos(dir1, alpha1, alpha_max); procPos(dir2, alpha2, alpha_max); procPos(dir3, alpha3, alpha_max); ++index; if(index > 2) index = 0; Bitwise_XOR(frame); } void ac::AlphaBlendRandom(cv::Mat &frame) { if(testSize(frame) == false) return; static double val = 0.30; static int val_dir = 1; int index = 0; DrawFunction func[2]; func[0] = getRandomFilter(index); func[1] = getRandomFilter(index); cv::Mat copy[4]; copy[0] = frame.clone(); copy[1] = frame.clone(); copy[2] = frame.clone(); func[0](copy[0]); func[1](copy[1]); AlphaBlend(copy[0], copy[1], copy[3], 0.5); AlphaBlend(copy[2], copy[3], frame, val); if(val_dir == 1) { val += 0.05; if(val >= 1.0) val_dir = 0; } else { val -= 0.05; if(val <= 0.30) val_dir = 1; } } void ac::ChannelSortAlphaBlend(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 3.0; static int index = 0; std::vector v; // to hold the Matrix for split cv::split(frame, v);// split the channels into seperate matrices cv::Mat channels[3]; // output channels cv::Mat output; // for merge cv::sort(v[0], channels[0],cv::SORT_ASCENDING); // sort each matrix cv::sort(v[1], channels[1],cv::SORT_ASCENDING); cv::sort(v[2], channels[2],cv::SORT_ASCENDING); cv::sort(v[index], channels[index], cv::SORT_DESCENDING); cv::merge(channels, 3, output); ++index; if(index > 2) index = 0; cv::Mat copy = frame.clone(); for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b pixadd = output.at(z, i); for(int j = 0; j < 3; ++j) { //pixel += pixadd; pixel[j] = static_cast((pixel[j] * (1+alpha)) + (pixadd[j] * alpha)); } } } static int dir = 1; procPos(dir, alpha, alpha_max, 10, 0.01); } void ac::XorChannelSort(cv::Mat &frame) { std::vector v; // to hold the Matrix for split cv::split(frame, v);// split the channels into seperate matrices cv::Mat channels[3]; // output channels cv::Mat output; // for merge cv::sort(v[0], channels[0],(((rand()%2) == 0) ? cv::SORT_ASCENDING : cv::SORT_DESCENDING)); // sort each matrix cv::sort(v[1], channels[1],(((rand()%2) == 0) ? cv::SORT_ASCENDING : cv::SORT_DESCENDING)); // sort each matrix cv::sort(v[2], channels[2],(((rand()%2) == 0) ? cv::SORT_ASCENDING : cv::SORT_DESCENDING)); // sort each matrix cv::merge(channels, 3, output); for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b sorted = output.at(z, i); for(int j = 0; j < 3; ++j) pixel[j] = pixel[j] ^ sorted[j]; swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } } void ac::GradientColors(cv::Mat &frame) { static int index = 0; static unsigned char val = 0; int inc = (frame.rows/255)+1; for(int i = 0; i < frame.cols; ++i) { val = 1; for(int z = 0; z < frame.rows; ++z) { cv::Vec3b &pixel = frame.at(z, i); pixel[index] = val; if((z%inc) == 0) ++val; swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } ++index; if(index > 2) index = 0; } void ac::GradientColorsVertical(cv::Mat &frame) { static int index = 0; static unsigned char val = 0; int inc = (frame.cols/255)+1; for(int z = 0; z < frame.rows; ++z) { val = 1; for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); pixel[index] = val; if((i%inc) == 0) ++val; swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } ++index; if(index > 2) index = 0; } void ac::Bitwise_XOR_Average(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 8.0; for(int z = 0; z < frame.rows; ++z) { cv::Scalar sval; for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) { sval[j] += pixel[j]; } } for(int j = 0; j < 3; ++j) sval[j] /= frame.cols; for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) pixel[j] = static_cast((pixel[j] * (1+alpha)) + (static_cast(sval[j])*alpha)); swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir = 1; procPos(dir, alpha, alpha_max, 0.01); Bitwise_XOR(frame); } void ac::NotEqual(cv::Mat &frame) { static MatrixCollection<2> collection; collection.shiftFrames(frame); static double alpha = 1.0, alpha_max = 3.0; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); bool same_value = true; cv::Vec3b value; for(int j = 0; j < collection.size(); ++j) { value = collection.frames[j].at(z, i); if(value != pixel) { same_value = false; break; } } if(same_value == false) { for(int j = 0; j < 3; ++j) { pixel[j] = static_cast((pixel[j] * (1+alpha)) + (value[j] * alpha)); } } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir = 1; procPos(dir, alpha, alpha_max, 0.10); } void ac::GradientXorSelfScale(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 3.0; for(int z = 0; z < frame.rows-1; ++z) { for(int i = 0; i < frame.cols-1; ++i) { cv::Vec3b &pixel = frame.at(z, i); cv::Vec3b pix = frame.at(z+1, i+1); for(int j = 0; j < 3; ++j) { pixel[j] = static_cast((pixel[j] * (1+alpha))) ^ pix[j]; } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir = 1; procPos(dir, alpha, alpha_max, 10, 0.03); } void ac::SmoothSourcePixel(cv::Mat &frame) { static MatrixCollection<8> collection; static double alpha = 1.0, alpha_max = 3.0; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); int total = pixel[0]+pixel[1]+pixel[2]/3; for(int j = 0; j < 3; ++j) { pixel[j] = static_cast(((pixel[j] ^ total) * static_cast(alpha))); } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ } } static int dir = 1; procPos(dir, alpha, alpha_max, 15, 0.1); collection.shiftFrames(frame); Smooth(frame, &collection); } void ac::StrobeBlend(cv::Mat &frame) { int value1 = ((frame.cols/2)/255)+1; int num = 1, num2 = 1; static double alpha = 1.0, alpha_max = 8.0; static int index1 = 0, index2 = 2; static int frame_num = 0; ++frame_num; if(frame_num > 1) frame_num = 0; for(int z = 0; z < frame.rows; ++z) { num = 1; num2 = 1; for(int i = 0; i < frame.cols/2; ++i) { cv::Vec3b &pixel = frame.at(z, i); if((i%value1)==0) num++; if(frame_num == 0) { for(int j = 0; j < 3; ++j) { pixel[j] = pixel[j] ^ static_cast(num); } } else { for(int j = 0; j < 3; ++j) { pixel[j] = pixel[j] ^ static_cast(num/(alpha+1)); } } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ //pixel[index1]= 255; } for(int i = frame.cols/2; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); if((i%value1)==0) num2++; if(frame_num == 0) { for(int j = 0; j < 3; ++j) { pixel[j] = pixel[j] ^ static_cast(num2); } } else { for(int j = 0; j < 3; ++j) { pixel[j] = pixel[j] ^ static_cast(num2/(alpha+1)); } } swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ //pixel[index2] = 0; } } if(++index1 > 2) index1 = 0; if(--index2 < 0) index2 = 2; static int dir = 1; procPos(dir, alpha, alpha_max, 15, 0.03); } void ac::FrameBars(cv::Mat &frame) { int diff_i = (frame.cols/255)+1; int diff_z = (frame.rows/255)+1; unsigned char val[2] = {0,0}; static double alpha = 1.0, alpha_max = 8.0; static MatrixCollection<4> collection; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) pixel[j] += static_cast(val[0]*alpha) + static_cast(val[1]*alpha); swapColors(frame, z, i);// swap colors if(isNegative) invert(frame, z, i);// if isNegative invert pixel */ if((i%diff_i) == 0) { val[0]++; } } if((z%diff_z) == 0) { val[1]++; } } static int dir = 1; procPos(dir, alpha, alpha_max); collection.shiftFrames(frame); Smooth(frame, &collection); } void ac::Sort_Vertical_Horizontal(cv::Mat &frame) { cv::Mat value = frame.clone(); VerticalChannelSort(value); ChannelSort(value); Add(frame, value, false); } void ac::Sort_Vertical_Horizontal_Bitwise_XOR(cv::Mat &frame) { cv::Mat value = frame.clone(); VerticalChannelSort(value); ChannelSort(value); static bool sub = false; if(sub == false) Add(frame, value, false); else Sub(frame, value, false); sub = (sub == true) ? false : true; Bitwise_XOR(frame); } void ac::Scalar_Average_Multiply(cv::Mat &frame) { cv::Mat copy = frame.clone(); VerticalChannelSort(frame); cv::Scalar average; ScalarAverage(frame, average); Transform(copy, frame, [&](cv::Vec3b &pixel, int , int ) { for(int j = 0; j < 3; ++j) { pixel[j] *= static_cast(average[j]); } }); cv::Mat out = frame.clone(); AlphaBlend(out, copy, frame, 0.5); } void ac::Scalar_Average(cv::Mat &frame) { cv::Mat copy = frame.clone(); cv::Scalar value; ScalarAverage(frame, value); Transform(copy, frame,[&](cv::Vec3b &pixel, int , int ) { for(int j = 0; j < 3; ++j) pixel[j] *= static_cast(value[j]); }); cv::Mat out = frame.clone(); AlphaBlend(copy, out, frame, 0.5); } void ac::Total_Average(cv::Mat &frame) { cv::Mat frames[3]; static double alpha = 1.0, alpha_max = 8.0; frames[0] = frame.clone(); frames[1] = frame.clone(); frames[2] = frame.clone(); SelfScale(frames[0]); rainbowBlend(frames[1]); SelfAlphaRGB(frames[2]); unsigned long total[3]; for(int j = 0; j < 3; ++j) TotalAverageOffset(frames[j], total[j]); for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) pixel[j] += static_cast((alpha*total[j])); swapColors(frame, z, i); // if isNegative true invert pixel if(isNegative) invert(frame, z, i); } } static int dir = 1; procPos(dir, alpha, alpha_max); } void ac::FlashWhite(cv::Mat &frame) { static cv::Vec3b white(255,255,255); static bool state = false; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { if(state) frame.at(z, i) = white; } } state = (state == true) ? false : true; } void ac::FlashBlackAndWhite(cv::Mat &frame) { static int index = 0; static cv::Vec3b white(255,255,255), black(0,0,0); if(index != 1 && index != 3) { for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { switch(index) { case 0: frame.at(z, i) = white; break; case 2: frame.at(z, i) = black; } } } } ++index; if(index > 3) index = 0; } void ac::GaussianBlend(cv::Mat &frame) { static double alpha = 1.0, alpha_max = 3.0; static MatrixCollection<8> collection; unsigned int r = 3+(rand()%10); for(unsigned int q = 0; q < r; ++q) GaussianBlur(frame); collection.shiftFrames(frame); int value[3] = { rand()%255, rand()%255, rand()%255 }; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) pixel[j] = static_cast((pixel[j] ^ value[j]) * alpha); swapColors(frame, z, i); // if isNegative true invert pixel if(isNegative) invert(frame, z, i); } } static int dir = 1; procPos(dir, alpha, alpha_max, 15, 0.1); collection.shiftFrames(frame); Smooth(frame, &collection); } void ac::RandomXor(cv::Mat &frame) { int r_color[3] = { rand()%255, rand()%255, rand()%255 }; static double alpha = 1.0, alpha_max = 3.0; for(int z = 0; z < frame.rows; ++z) { for(int i = 0; i < frame.cols; ++i) { cv::Vec3b &pixel = frame.at(z, i); for(int j = 0; j < 3; ++j) pixel[j] = static_cast((pixel[j] ^ r_color[j]) * alpha); swapColors(frame, z, i); // if isNegative true invert pixel if(isNegative) invert(frame, z, i); } } static int dir = 1; procPos(dir, alpha, alpha_max); }