OpenCV

とりあえず、ピクセルの走査だけやってみた。

#include <iostream>
#include <string>

#include <boost/range/algorithm/for_each.hpp>
#include <boost/range/counting_range.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/make_fused.hpp>
#include <boost/fusion/include/make_vector.hpp>
#include <boost/fusion/include/for_each.hpp>


#include <opencv/cv.h>
#include <opencv/highgui.h>

#pragma comment(lib, "cv210d.lib")
#pragma comment(lib, "cxcore210d.lib")
#pragma comment(lib, "highgui210d.lib")


typedef boost::fusion::vector<uchar, uchar, uchar>    color_t;

template<
    typename T
>
boost::iterator_range< cv::MatIterator_<T> >
make_cv_mat_range(cv::Mat& img){
    return boost::make_iterator_range( img.begin<T>(), img.end<T>() );
}


void nega(color_t& pix) {
    boost::fusion::for_each(pix, [](uchar& d){
        d = 255 - d;
    });
}

void gray_scale(color_t& pix){
    boost::fusion::for_each(pix, [&pix](uchar& d){
        d = static_cast<uchar>(
            static_cast<double>(boost::fusion::at_c<0>(pix)) * 0.299
          + static_cast<double>(boost::fusion::at_c<1>(pix)) * 0.587
          + static_cast<double>(boost::fusion::at_c<2>(pix)) * 0.114
        );
    });
}


int
main(){
    
    std::string    image_name("in.jpg");

    cv::Ptr<IplImage>    img_file = cvLoadImage(image_name.c_str(), CV_LOAD_IMAGE_UNCHANGED);
    
//    boost::for_each(make_cv_mat_range<color_t>(static_cast<cv::Mat>(img_file)), gray_scale);
    boost::for_each(make_cv_mat_range<color_t>(static_cast<cv::Mat>(img_file)), nega);

    cvSaveImage("out.jpg", img_file);

    return 0;
}

元画像

グレースケール

ネガ反転

ピクセルを走査しているだけなのであんまりOpenCVを使ってる感じはしませんが…。
公式にWindows用のインストーラがあるのでインストールして、
パスを通すだけで使えました。
(ちなみに2.0はライブラリをビルドする必要があるみたい)。
OpenCVのバージョンは2.1で、環境はVisualStudio2010です。
久々にCライクなライブラリを使ったので苦労した。
boost は偉大だ。
ゲームだとシェーダを使って画像処理を行うので使う機会はあんまりないと思うんだけどどうだろう。
Webカメラを使ったゲームぐらいか?
もうちょっと突っ込んでみたいけど今回はこれでいいや。
[参照]
http://opencv.jp/
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/