/
Tias
/
ImageGlitcher
Обзор
Документация
Войти
/
Tias
/
ImageGlitcher
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.cpp
88 строк
2 KB
Tias
remove unused var
03 окт 2025, 18:39
03 окт 2025, 18:39
d6950ce
Код
Авторство
О чём код?
#include <algorithm> #include <cassert> #include <opencv2/core.hpp> #include <opencv2/core/hal/interface.h> #include <opencv2/core/mat.hpp> #include <opencv2/core/types.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <iostream> namespace util { cv::Vec<uchar, 3>& at(cv::Mat & img, int i, int j) { return img.at<cv::Vec<uchar, 3>>(i, j); } const cv::Vec<uchar, 3>& at(const cv::Mat & img, int i, int j) { return img.at<cv::Vec<uchar, 3>>(i, j); } cv::Mat getChannel(const cv::Mat & img, size_t channelInd) { assert((channelInd < 3)); cv::Mat result; img.copyTo(result); uchar * data = result.data; while(data < result.dataend) { for(size_t i = 0; i < 3; ++i) (i != channelInd) && (data[i] = 0); data += 3; } return result; } cv::Mat shiftX(const cv::Mat & img, size_t dx) { assert((dx < img.cols)); cv::Rect roi(dx, 0, img.cols-dx, img.rows); cv::Mat roiImg = img(roi); cv::Mat result = cv::Mat::zeros(img.size(), img.type()); for(int i = 0; i < roi.height; ++i) for(int j = 0; j < roi.width; ++j) at(result, i, j) = at(img, i + roi.y, j + roi.x); return result; } } // namespace util void glitch(cv::Mat & img, size_t dx = 5) { using namespace util; cv::Mat green = getChannel(img, 1); cv::Mat red = getChannel(img, 2); cv::Mat blue = getChannel(img, 0); cv::Mat shiftedG = shiftX(green, dx); cv::Mat shiftedR = shiftX(red, 2*dx); cv::Mat shiftedB = shiftX(blue, 3*dx); img += shiftedG; img += shiftedR; img += shiftedB; cv::Rect roi(0, 0, img.cols - 3*dx, img.rows); img = img(roi); } int main(int argc, char * argw[]) { if(argc < 2) { std::cout << "Usage: " << argw[0] << "<input file> <out file(optional)>"<< '\n'; return 0; } std::string output = "./out.png"; std::string filepath = argw[1]; if(argc > 2) output = argw[2]; cv::Mat img = cv::imread(filepath); cv::imshow("Image", img); cv::waitKey(0); glitch(img); cv::imshow("Glitched", img); cv::waitKey(0); cv::imwrite(output, img); cv::destroyAllWindows(); return 0; }