OpenCVがRGBの並び順をユーザーがコンパイル時に選択できないと知って、Boost.GILに乗り換えました。
#include <boost/gil/gil_all.hpp> #include <boost/gil/extension/io/png_io.hpp> using namespace boost::gil; rgb8_pixel_t nega(rgb8_pixel_t x) { return rgb8_pixel_t( 255 - at_c<0>(x), 255 - at_c<1>(x), 255 - at_c<2>(x) ); // こう書きたかった・・・ // return fusion::transform(x, 255 - boost::lambda::_1); } int main() { rgb8_image_t img; png_read_image("belle.png",img); transform_pixels(view(img), view(img), nega); png_write_view("out.png", view(img)); }
こちらはこちらで、ピクセルをBoost.Fusionのシーケンスとして扱えないのでもやっと。
ピクセル操作を楽にする方法あるのかな・・・。
追記:
static_transformでできました。
#include <boost/gil/gil_all.hpp> #include <boost/gil/extension/io/png_io.hpp> using namespace boost::gil; struct functor { template <class T> T operator()(T x) const { return 255 - x; } }; rgb8_pixel_t nega(rgb8_pixel_t x) { return (static_transform(x, x, functor()), x); } int main() { rgb8_image_t img; png_read_image("belle.png",img); transform_pixels(view(img), view(img), nega); png_write_view("out.png", view(img)); }