diff --git a/configure.ac b/configure.ac index 5ef9492..f87732f 100644 --- a/configure.ac +++ b/configure.ac @@ -14,7 +14,7 @@ AC_CONFIG_MACRO_DIR([m4]) # Look for a C++ compiler.CXXFLAGS_save="$CXXFLAGS" AC_PROG_CXX AC_PROG_RANLIB -CXXFLAGS="$CXXFLAGS_save -std=c++11 -g -O0" +CXXFLAGS="$CXXFLAGS_save -std=c++0x -g -O0" AM_SILENT_RULES([yes]) AC_ARG_ENABLE(debug, diff --git a/src/filterSample/Makefile.am b/src/filterSample/Makefile.am index 387a426..154839f 100644 --- a/src/filterSample/Makefile.am +++ b/src/filterSample/Makefile.am @@ -7,4 +7,4 @@ AM_CXXFLAGS = \ $(DEBUG_CXXFLAGS) ______lib_libfilterSample_a_SOURCES = grey.cc reverse.cc merge.cc \ - interlace.cc inlay.cc blur.cc cartoon.cc count.cc + interlace.cc inlay.cc blur.cc cartoon.cc count.cc color.cc diff --git a/src/filterSample/color.cc b/src/filterSample/color.cc new file mode 100644 index 0000000..f34548e --- /dev/null +++ b/src/filterSample/color.cc @@ -0,0 +1,20 @@ +#include "color.hh" +#include "opencv2/opencv.hpp" + +void* Color::operator()(void* para) +{ + cv::Mat* mat = (cv::Mat*)para; + + if (mat == nullptr) + return nullptr; + + for (size_t i = 0; i < mat->rows; ++i) + for (size_t j = 0; j < mat->cols; ++j) + { + mat->at(i, j)[0] = mat->at(i, j)[0] * this->ref_[0] / 255; + mat->at(i, j)[1] = mat->at(i, j)[1] * this->ref_[1] / 255; + mat->at(i, j)[2] = mat->at(i, j)[2] * this->ref_[2] / 255; + } + + return mat; +} diff --git a/src/filterSample/color.hh b/src/filterSample/color.hh new file mode 100644 index 0000000..98969ec --- /dev/null +++ b/src/filterSample/color.hh @@ -0,0 +1,17 @@ +#ifndef COLOR_HH_ +# define COLOR_HH_ + +# include "tbb/pipeline.h" +# include "opencv2/opencv.hpp" + +class Color: public tbb::filter +{ + public: + Color(cv::Vec3b ref) + : filter(tbb::filter::parallel), ref_(ref) {} + void* operator()(void*); + private: + cv::Vec3b ref_; +}; + +#endif /* !COLOR_HH_ */ diff --git a/src/main.cc b/src/main.cc index cb239a9..ad2c1cf 100644 --- a/src/main.cc +++ b/src/main.cc @@ -110,7 +110,7 @@ int main (int argc, char** argv) if (!pipe.add_filter(filter.first, filter.second)) { std::cerr << argv[0] << ": Unknown filter `" - << filter.first << "'" << std::endl; + << filter.first << "'" << filter.second.size() << std::endl; return 2; } } diff --git a/src/pipeline.cc b/src/pipeline.cc index 140b8cd..472d957 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -14,6 +14,7 @@ #include "filterSample/interlace.hh" #include "filterSample/inlay.hh" #include "filterSample/count.hh" +#include "filterSample/color.hh" Pipeline::Pipeline(std::list input, VideoWriter output) : input_(input), output_(output) @@ -33,6 +34,17 @@ bool Pipeline::add_filter(std::string filter, std::vector args) this->pipeline_.add_filter(*(new Cartoon())); else if (filter == "count") this->pipeline_.add_filter(*(new Count())); + else if (filter == "color" && args.size() >= 3) + this->pipeline_.add_filter(*(new Color(cv::Vec3b { + (unsigned char) args[0], + (unsigned char) args[1], + (unsigned char) args[2] + }))); + else if (filter == "sepia") + { + this->pipeline_.add_filter(*(new Grey())); + this->pipeline_.add_filter(*(new Color(cv::Vec3b { 40, 74, 130 }))); + } else if (filter == "blur") { if (args.size() >= 1)