OpenCV 3.0に果敢に挑戦し続けてみる

個人的な趣味の一環として、OpenCV 3.0がらみの情報をまとめてみる。「引用はいぃんよー、無断転載はあかんよー」ということで。

アニメじゃない(アニメじゃない)本当のこーとさー(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)

f:id:anobiidae:20140302102629j:plain

edgePreservingFilter(RECURS_FILTER)

f:id:anobiidae:20140302102803j:plain

detailEnhance

f:id:anobiidae:20140302102858j:plain

stylization

f:id:anobiidae:20140302102955j:plain

pencilSketch(shade_factor=0.02f)

f:id:anobiidae:20140302103033j:plain

f:id:anobiidae:20140302103125j:plain

 

ソースコードはこちらと。

  

#include <opencv/cv.hpp>
#include <opencv2/photo.hpp>
#include 

int 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);
    }
}