OpenCV

Eiichiro Momma edited this page Dec 15, 2016 · 10 revisions
Clone this wiki locally

OpenCV

インテルがオープンソース化し,Willow Garage→itseezに引き継がれた画像処理ライブラリ.

基本的なフィルタ処理は勿論のこと、オープンソース化した恩恵としてSnakesやら顔の認識やらオプティカルフローやらOpenCV 距離計測やら様々な機能が追加されている。 画像を扱うにあたり、車輪の再発明を避けるためにも外部ライブラリの積極利用は必須となる。

※Ver. 2.xへの対応中の為、古い記述が混じっています

※サンプルソースは記載時のバージョンでのみ動作確認の行なっているため、現バージョンでは動かない可能性もあります。その際はコメントにその旨記入して下さい。

見ておくべき資料

リファレンスマニュアル日本語訳、日本語でのサンプルソース

OpenCV本(mycomから)の出版に合わせて(?)公開された、本家のリファレンスの日本語訳とサンプルソース。 非常に参考になる。

OpenCV cheatsheet

2.xのC++ I/Fの操作はだいたいこれで分かる。

Table of Contents

基本的な使い方

imread, imshow, imwrite, Mat, split, mergeなど

ソース

8x8のモザイクにして横方向の濃淡変化を各チャネルについて128を中心とした±で示して合成。

    #ifdef _DEBUG
      #pragma comment( lib, "cv210d.lib" )
      #pragma comment( lib, "cxcore210d.lib" )
      #pragma comment( lib, "cvaux210d.lib" )
      #pragma comment( lib, "highgui210d.lib" )
    #else
      #pragma comment( lib, "cv210.lib" )
      #pragma comment( lib, "cxcore210.lib" )
      #pragma comment( lib, "cvaux210.lib" )
      #pragma comment( lib, "highgui210.lib" )
    #endif
    #include <cv.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <stdlib.h>

    using namespace std;

    int main(int argc, char** argv)
    {
      string wnSrc = "src";
      string wneighth = "eighth";
      string wnDst = "dst";
      //画像はimreadで開く
      cv::Mat src = cv::imread( string("../lenna.png)"));
      //IplImageではなくMatを使う
      cv::Mat eighth(cv::Size(src.cols/8,src.rows/8), CV_8UC3);
      cv::Mat dst = src.clone(); 
      cv::resize(src, eighth, eighth.size(),0, 0, cv::INTER_CUBIC);
      cv::resize(eighth, dst, dst.size(), 0, 0, cv::INTER_AREA);
      //b, g, rチャネルのIplImageを作る代わりにMatのvectorを作る
      vector<cv::Mat> mm;
      for (int i=0; i<3; i++){
        mm.push_back(cv::Mat(src.size(), CV_8UC1));
      }
      //splitはvector<cv::Mat>も受け付ける
      cv::split(dst, mm);
      //iteratorで各チャネルに同一の処理をさせる例
      vector<cv::Mat>::iterator it = mm.begin();
      while (it !=mm.end()){
        cv::Sobel(*it, *it, -1, 1, 0, 3, 1, 128);
        it++;
      }

      cv::namedWindow(wnSrc,cv::WINDOW_AUTOSIZE);
      //画像の表示はimshow
      cv::imshow(wnSrc, src);
      //mergeもsplit同様vectorを使える
      cv::merge(mm, src);
      //簡易アルファブレンディング。cvConvertScaleはconvertToに置き換わる。
      //第二引数はTypeの指定
      double alpha = 0.5;
      dst.convertTo(dst, dst.type(), alpha);
      src.convertTo(src, src.type(), 1-alpha);
      cv::add(src, dst, dst);
      cv::namedWindow(wneighth, cv::WINDOW_AUTOSIZE);
      cv::imshow(wneighth, eighth);
      cv::namedWindow(wnDst, cv::WINDOW_AUTOSIZE);
      cv::imshow(wnDst, dst);
      cv::waitKey(0);
      //保存はimwrite
      cv::imwrite(string("out.png)"), dst);
      return 0;
    }

結果

原画像

結果