Eiichiro Momma edited this page Sep 28, 2017 · 20 revisions

OpenCV

Intelがオープンソース化し,Willow Garage→itseez→Intelと堂々巡りの画像処理ライブラリ. (公式サイト )

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

※古い記述が混じっています

※サンプルソースは記載時のバージョンでのみ動作確認の行なっているため、現バージョンでは動かない可能性もあります。

見ておくべき資料

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

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

OpenCV cheatsheet

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

Pythonの記述もあるコンテンツ

C++関係

旧情報

基本的な使い方 (C++)

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

結果

原画像

結果

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.