背景
opencv-contrib-pythonには割と最近作成されたパッケージやライブラリがここにgithub経由でコミットされています。contribはcontribute:寄付という意味らしいです。(英語苦手)
そこから、面白そうなのはないかと探していると xphoto::oilPainting
(油絵エフェクト)メソッドを見つけました。おそらくこのメソッドはまだPythonにはなくC++にしか現在のところないっぽいです。
開発
makefile
Mac環境でOpenCVをmakefileを使ってコンパイルする方法 にあるmakefileを少し修正します。
CXX = c++
CXXFLAGS = -I/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/
LDFLAGS = -L/usr/local/Cellar/opencv/4.1.1_2/lib/
LDLIBS = -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_xphoto
CXXVERSION = -std=c++11
paint: paint.cpp
$(CXX) $< -o $@ $(CXXFLAGS) $(CXXVERSION) $(LDFLAGS) $(LDLIBS)
clean :
rm paint
今回の油絵エフェクトメソッドを使うためには opencv_xphoto
が必要になるのでライブラリファイルを追加します。
cpp
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/xphoto.hpp>
int main(int argc, const char* argv[]) {
cv::Mat src = cv::imread("./mikan.jpg");
cv::Mat dst;
if (src.empty()) {
std::cout << "read error.\n";
return -1;
}
cv::xphoto::oilPainting(src, dst, 10, 1, cv::COLOR_BGR2Lab);
cv::namedWindow("oil painting effect", cv::WINDOW_AUTOSIZE);
cv::imshow("oil painting effect", dst);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
インクルードも同様に #include <opencv2/xphoto.hpp>
と宣言を追加します。
結果
ソース画像 (その1)
いつもの通りみかん星人です。
Processed (その1)
それっぽく油絵になりました。
まゆ毛濃いです。(元からか)
ソース画像 (その2)
Instagram 橋本環奈(多分公式) にあった最新の投稿画像を使ってみます。
Processed (その2)
xphoto::oilPainting
の3つめの引数を 10 -> 5
にしています。おそらく筆の太さと同義です。低めに設定しないと顔の輪郭が表示しにくくなります。
まとめ
opencvが4系になってかなりモジュール・メソッドが増えた。
今まで使ってこなかったメソッドを探すのは後で使おうと思った時に役に立つ、気がします。