15
OpenCVの入り口

OpenCVの入り口

  • Upload
    cct-inc

  • View
    911

  • Download
    2

Embed Size (px)

Citation preview

Page 1: OpenCVの入り口

OpenCVの入り口

Page 2: OpenCVの入り口

1. OpenCVとは 2. インストール 3. 画像の読み込み 4. 画像の加工 5. 画像の保存 6. 将来

Page 3: OpenCVの入り口

OpenCVとは

1. 画像処理を行うライブラリである。 2. 大変多くのアルゴリズムが実装されている。 3. BSDライセンスである。 4. Python, Javaのインタフェースが用意されている。 5. 一部、法的問題が起こる可能性があるものが含まれている。 6. 現在のバージョンは2.xであり、2系以降C++インタフェースが導入された。

Page 4: OpenCVの入り口

インストール

ここから(http://opencv.org/) Windowsならインストーラをダウンロードする。 Mac/Linuxならソースコードをダウンロードし、 cmakeを使ってビルドする。 !

わたしはいつもこれをします。 $> sudo port install opencv +python27

Page 5: OpenCVの入り口

画像の読み込み 9 #include <opencv2/highgui/highgui.hpp>!10 !11 int main(int argc, const char * argv[])!12 {!13 // load a source image!14 const auto image = cv::imread("/Users/seiya_kumada/Pictures/lena.jpg");!15 !16 // create a window named "name."!17 const auto name = "name";!18 cv::namedWindow(name);!19 !20 // show the image!21 cv::imshow(name, image);!22 !23 // wait until pushing any key!24 cv::waitKey();!25 !26 return 0;!27 }

1. imreadの第2引数にcv::IMREAD_GRAYSCALEを渡せばグレー画像になる。 2. jpg, bmp, png, tifなどいろいろ読み込める。

画像を読み込む。

窓を用意する。

表示する。

キー入力を待つ。

Page 6: OpenCVの入り口

画像の加工画素へのアクセス-1

8 ! 9 #include <opencv2/highgui/highgui.hpp>!10 !11 int main(int argc, const char * argv[])!12 {!13 // load a source image!14 auto image = cv::imread("/Users/seiya_kumada/Pictures/lena.jpg");!15 !16 // method (1)!17 for ( auto j = 0; j < image.rows; ++j ) {!18 auto ptr = image.ptr<cv::Vec3b>(j);!19 for ( int i = 0; i < image.cols; ++i ) {!20 auto& p = ptr[i];!21 // auto b = p[0]; // blue!22 // auto g = p[1]; // green!23 // auto r = p[2]; // red!24 p[0] = 255;!25 }!26 }!27 !28 // method (2)!29 for ( auto j = 0; j < image.rows; ++j ) {!30 auto row = image.row(j);!31 std::for_each(row.begin<cv::Vec3b>(), row.end<cv::Vec3b>(), [](cv::Vec3b& p){!32 p[0] = 255;!33 });!34 !35 }!36 !37 // method (3)!38 const auto& a = image.at<cv::Vec3b>(0, 0);

cv::Vec3bのポインタに変換する。

イテレータも使えるので、STLと親和性がある。

1つずつ取り出す。

Page 7: OpenCVの入り口

画素へのアクセス-2

9 #include <opencv2/highgui/highgui.hpp>!10 !11 int main(int argc, const char * argv[])!12 {!13 // load a source image!14 auto image = cv::imread("/Users/seiya_kumada/Pictures/lena.jpg");!15 !16 // get a region of interesting!17 auto roi = image(cv::Rect(100, 100, 50, 50));!18 !19 // modify only the region!20 std::for_each(roi.begin<cv::Vec3b>(), roi.end<cv::Vec3b>(), [](cv::Vec3b& p){!21 p[0] = 255;!22 });!23

指定した領域だけを取り出す。

画像の加工

Page 8: OpenCVの入り口

いろいろなアルゴリズム-1 9 #include <opencv2/highgui/highgui.hpp>! 10 #include <opencv2/imgproc/imgproc.hpp>! 11 ! 12 int main(int argc, const char * argv[])! 13 {! 14 auto capture = cv::VideoCapture{0};! 15 if( !capture.isOpened() ) {! 16 return 1;! 17 }! 18 ! 19 auto frame = cv::Mat{};! 20 auto edges = cv::Mat{};! 21 const auto name = "edges";! 22 cv::namedWindow(name);! 23 ! 24 for(;;)! 25 {! 26 capture >> frame;! 27 cv::cvtColor(frame, edges, CV_BGR2GRAY);! 28 cv::GaussianBlur(edges, edges, cv::Size(7,7), 1.5, 1.5);! 29 cv::Canny(edges, edges, 0, 30, 3);! 30 imshow(name, edges);! 31 if ( cv::waitKey(30) >= 0 )! 32 {! 33 break;! 34 }! 35 }! 36 }

ぼかすエッジを拾う

グレー画像に変換する。

Gaussian Mixture http://seiya-kumada.blogspot.jp/2013/03/gaussian-mixturesem.html http://seiya-kumada.blogspot.jp/2013/03/em-opencv.html !K-means Clustering http://seiya-kumada.blogspot.jp/2013/03/k-means.html !シーン認識 http://seiya-kumada.blogspot.jp/2012/06/blog-post.html !グラフカットによる領域分割 http://seiya-kumada.blogspot.jp/2013/04/graphcut.html !Mean Shft Filtering http://seiya-kumada.blogspot.jp/2013/05/mean-shift-filtering.html

画像の加工

Page 9: OpenCVの入り口

いろいろなアルゴリズム-2

9 #include <opencv2/core/core.hpp>!10 #include <opencv2/imgproc/imgproc.hpp>!11 #include <opencv2/objdetect/objdetect.hpp>!12 #include <opencv2/highgui/highgui.hpp>!13 !14 // http://book.mynavi.jp/support/pc/opencv2/c3/opencv_img.html!15 !16 int main(int argc, char *argv[])!17 {!18 const auto imagename = "/Users/seiya_kumada/Projects/face-detection/Lenna.png";!19 auto color_img = cv::imread(imagename);!20 !21 // convert it to the gray scale!22 auto gray_img = cv::Mat {};!23 cv::cvtColor(color_img, gray_img, CV_BGR2GRAY);!24 !25 // normalize the brightness and increase the contrast!26 cv::equalizeHist(gray_img, gray_img);!27 !28 // load the classifier!29 const auto cascade_name = "/opt/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml";!30 auto cascade = cv::CascadeClassifier {};!31 cascade.load(cascade_name);!32 !33 // detect faces!34 auto faces = std::vector<cv::Rect>();!35 cascade.detectMultiScale(gray_img, faces);!36 !37 // draw results!38 for( const auto& face : faces ) {!39 const auto center = cv::Point {!40 cv::saturate_cast<int>((face.x + face.width * 0.5)),!41 cv::saturate_cast<int>((face.y + face.height * 0.5))!42 };!43 const auto radius = cv::saturate_cast<int>((face.width + face.height) * 0.25);!44 cv::circle(color_img, center, radius, cv::Scalar(80, 80, 255), 3, 8, 0);!45 }!46 !47 cv::namedWindow("result", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);!48 cv::imshow("result", color_img );!49 cv::waitKey(0);!50 }

画像の読み込み

グレー画像へ変換

ヒストグラムを平滑化する。

識別器を読み込む。

顔を検出する。

検出場所に円を描く。

表示する。

画像の加工

Page 10: OpenCVの入り口

いろいろなアルゴリズム-3

同じことをPythonで

画像の加工

Page 11: OpenCVの入り口

画像の保存 9 ! 10 #include <opencv2/highgui/highgui.hpp>! 11 #include <opencv2/imgproc/imgproc.hpp>! 12 ! 13 int main(int argc, const char * argv[])! 14 {! 15 // load a source image! 16 auto image = cv::imread("/Users/seiya_kumada/Pictures/lena.jpg");! 17 cv::imwrite("/Users/seiya_kumada/Pictures/lena.png", image);! 18 return 0;! 19 }

jpg, bmp, png, tifなどいろいろなフォーマットで保存できる。

Page 12: OpenCVの入り口

将来

従来のデバイスは、2次元の情報を取得するものが 主流であった。動画であろうと2次元の枠を越える ものではない。 !最近では、kinectなどを使うことにより容易に 距離画像、すなわち3次元画像を取得することが できるようになった。 !3次元画像処理を行うライブラリがPoint Cloud Libraryである。 新規アルゴリズムの実装件数は、OpenCV より多くなっている。 次回は、PCLを紹介したい。

Page 13: OpenCVの入り口

One more thing…

Page 14: OpenCVの入り口

https://www.youtube.com/watch?v=_TTtN4frMEA

OpenCV3リリース

現在α版がリリースされている。 今年秋にβ版、クリスマス頃に正式版がリリースされる。

Page 15: OpenCVの入り口

http://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%8A_(%E7%94%BB%E5%83%8F%E3%83%87%E3%83%BC%E3%82%BF)

おまけ