アニメじゃない(アニメじゃない)本当のこーとさー(OpenCV 3.0.0-dev Non-Photorealistic Renderingを使ってみる)
そもそも、Non-Photorealistic Renderingって何?ということならば、ここを見ると解るはず。
http://yokoya.naist.jp/paper/datas/1288/jmthesis.pdf
一言で言えば、「芸術的な表現をもつ画像生成」という話らしい。
よし、つかってみよう。
おおよそパラメータはSとRの2個があるけど、説明が無い…。
横がS={0,40,80,120,160,200} 、縦がR={0.0, 0.2,0.4,0.6,0.8,1.0}だよ!
edgePreservingFilter(NORMCONV_FILTER)
edgePreservingFilter(RECURS_FILTER)
detailEnhance
stylization
pencilSketch(shade_factor=0.02f)
ソースコードはこちらと。
#include <opencv/cv.hpp> #include <opencv2/photo.hpp> #includeint main(int argc, char **argv) { char cmd[255]; cv::Mat src = cv::imread(argv[1]); cv::Mat dst; cv::Mat dst2; for (int method = 0; method <= 5; method++) { for (int s = 0; s <= 200; s += 40) { char name3[255]; sprintf(name3, "%04d_XX.jpg", s); for (int r = 0; r <= 10; r += 2) { char name[255]; switch (method) { case 0: default: cv::edgePreservingFilter(src, dst, cv::NORMCONV_FILTER, s, (double) r / 10.0); break; case 1: cv::edgePreservingFilter(src, dst, cv::RECURS_FILTER, s, (double) r / 10.0); break; case 2: cv::detailEnhance(src, dst, s, (double) r / 10.0); break; case 3: cv::stylization(src, dst, s, (double) r / 10.0); break; case 4: cv::pencilSketch(src, dst, dst2, s, (double) r / 10.0); break; case 5: cv::pencilSketch(src, dst2, dst, s, (double) r / 10.0); break; } sprintf(name, "%04d_%02d.jpg", s, r); cv::imwrite(name, dst); switch (r) { case 0: sprintf(cmd, "cp %s %s", name, name3); system(cmd); break; default: sprintf(cmd, "convert -append %s %s %s", name3, name, name3); system(cmd); break; } } switch (s) { case 0: sprintf(cmd, "cp %s result.jpg", name3); system(cmd); break; default: sprintf(cmd, "convert +append result.jpg %s result.jpg", name3); system(cmd); break; } } sprintf(cmd, "cp result.jpg result_%02d.jpg", method); system(cmd); } }