New filters: rotate-h and rotate-v

This commit is contained in:
Némunaire 2012-07-16 11:00:09 +02:00
parent b6b2e9c24f
commit 59d0764071
7 changed files with 66 additions and 7 deletions

View File

@ -7,7 +7,7 @@ Configuration::add_filter(const std::string param)
{ {
std::pair<std::string, std::vector<int> > pair; std::pair<std::string, std::vector<int> > pair;
boost::char_separator<char> sep(",-;|. ="); boost::char_separator<char> sep(",;:. =");
boost::tokenizer<boost::char_separator<char> > tokens(param, sep); boost::tokenizer<boost::char_separator<char> > tokens(param, sep);
for (auto tok : tokens) for (auto tok : tokens)

View File

@ -7,4 +7,5 @@ AM_CXXFLAGS = \
$(DEBUG_CXXFLAGS) $(DEBUG_CXXFLAGS)
______lib_libfilterSample_a_SOURCES = grey.cc reverse.cc merge.cc \ ______lib_libfilterSample_a_SOURCES = grey.cc reverse.cc merge.cc \
interlace.cc inlay.cc blur.cc cartoon.cc count.cc color.cc interlace.cc inlay.cc blur.cc cartoon.cc count.cc color.cc \
rotate.cc

View File

@ -11,9 +11,14 @@ void* Color::operator()(void* para)
for (size_t i = 0; i < mat->rows; ++i) for (size_t i = 0; i < mat->rows; ++i)
for (size_t j = 0; j < mat->cols; ++j) for (size_t j = 0; j < mat->cols; ++j)
{ {
mat->at<cv::Vec3b>(i, j)[0] = mat->at<cv::Vec3b>(i, j)[0] * this->ref_[0] / 255; mat->at<cv::Vec3b>(i, j)[0] = mat->at<cv::Vec3b>(i, j)[0]
mat->at<cv::Vec3b>(i, j)[1] = mat->at<cv::Vec3b>(i, j)[1] * this->ref_[1] / 255; * this->ref_[0] / 255;
mat->at<cv::Vec3b>(i, j)[2] = mat->at<cv::Vec3b>(i, j)[2] * this->ref_[2] / 255;
mat->at<cv::Vec3b>(i, j)[1] = mat->at<cv::Vec3b>(i, j)[1]
* this->ref_[1] / 255;
mat->at<cv::Vec3b>(i, j)[2] = mat->at<cv::Vec3b>(i, j)[2]
* this->ref_[2] / 255;
} }
return mat; return mat;

View File

@ -0,0 +1,29 @@
#include "rotate.hh"
void* Rotate::operator()(void* para)
{
cv::Mat* mat = (cv::Mat*)para;
if (mat == nullptr)
return nullptr;
if (direction_ == 0) // rotate-h
for (size_t i = 0; i < mat->rows; ++i)
for (size_t j = mat->cols / 2 + 1; j > 0; --j)
{
cv::Vec3b tmp = mat->at<cv::Vec3b>(i, j);
mat->at<cv::Vec3b>(i, j) = mat->at<cv::Vec3b>(i, mat->cols - j - 1);
mat->at<cv::Vec3b>(i, mat->cols - j - 1) = tmp;
}
else if (direction_ == 2 || direction_ == -2) // rotate-v
for (size_t i = mat->rows / 2 + 1; i > 0; --i)
for (size_t j = 0; j < mat->cols; ++j)
{
cv::Vec3b tmp = mat->at<cv::Vec3b>(i, j);
mat->at<cv::Vec3b>(i, j) = mat->at<cv::Vec3b>(mat->rows - i - 1, j);
mat->at<cv::Vec3b>(mat->rows - i - 1, j) = tmp;
}
return mat;
}

View File

@ -0,0 +1,17 @@
#ifndef ROTATE_HH_
# define ROTATE_HH_
# include "tbb/pipeline.h"
# include "opencv2/opencv.hpp"
class Rotate: public tbb::filter
{
public:
Rotate(char direction)
: filter(tbb::filter::parallel), direction_(direction) {}
void* operator()(void*);
private:
char direction_;
};
#endif /* !ROTATE_HH_ */

View File

@ -18,7 +18,9 @@ bool parse_cli(Configuration& conf, int argc, char** argv)
po::options_description desc("Allowed options"); po::options_description desc("Allowed options");
desc.add_options() desc.add_options()
("help,h", "produce help message") ("help,h", "produce help message")
("filter,f", po::value<std::vector<std::string>>(), "apply a filter") ("filter,f", po::value<std::vector<std::string>>(), "apply a filter; "
"choose between grey, reverse, cartoon, count, color=B,G,R, sepia, "
"blur[=X], merge, interlace, inlay=B,G,R, strictinlay=B,G,R")
("input-file,i", po::value<std::vector<std::string>>(), "file to treat") ("input-file,i", po::value<std::vector<std::string>>(), "file to treat")
("output,o", po::value<std::string>(), "output file") ("output,o", po::value<std::string>(), "output file")
("codec,c", po::value<std::string>(), "output codec") ("codec,c", po::value<std::string>(), "output codec")
@ -110,7 +112,7 @@ int main (int argc, char** argv)
if (!pipe.add_filter(filter.first, filter.second)) if (!pipe.add_filter(filter.first, filter.second))
{ {
std::cerr << argv[0] << ": Unknown filter `" std::cerr << argv[0] << ": Unknown filter `"
<< filter.first << "'" << filter.second.size() << std::endl; << filter.first << "'" << std::endl;
return 2; return 2;
} }
} }

View File

@ -15,6 +15,7 @@
#include "filterSample/inlay.hh" #include "filterSample/inlay.hh"
#include "filterSample/count.hh" #include "filterSample/count.hh"
#include "filterSample/color.hh" #include "filterSample/color.hh"
#include "filterSample/rotate.hh"
Pipeline::Pipeline(std::list<VideoReader> input, VideoWriter output) Pipeline::Pipeline(std::list<VideoReader> input, VideoWriter output)
: input_(input), output_(output) : input_(input), output_(output)
@ -34,6 +35,10 @@ bool Pipeline::add_filter(std::string filter, std::vector<int> args)
this->pipeline_.add_filter(*(new Cartoon())); this->pipeline_.add_filter(*(new Cartoon()));
else if (filter == "count") else if (filter == "count")
this->pipeline_.add_filter(*(new Count())); this->pipeline_.add_filter(*(new Count()));
else if (filter == "rotate-h")
this->pipeline_.add_filter(*(new Rotate(0)));
else if (filter == "rotate-v")
this->pipeline_.add_filter(*(new Rotate(2)));
else if (filter == "color" && args.size() >= 3) else if (filter == "color" && args.size() >= 3)
this->pipeline_.add_filter(*(new Color(cv::Vec3b { this->pipeline_.add_filter(*(new Color(cv::Vec3b {
(unsigned char) args[0], (unsigned char) args[0],