Upload
cct-inc
View
911
Download
2
Embed Size (px)
Citation preview
OpenCVの入り口
1. OpenCVとは 2. インストール 3. 画像の読み込み 4. 画像の加工 5. 画像の保存 6. 将来
OpenCVとは
1. 画像処理を行うライブラリである。 2. 大変多くのアルゴリズムが実装されている。 3. BSDライセンスである。 4. Python, Javaのインタフェースが用意されている。 5. 一部、法的問題が起こる可能性があるものが含まれている。 6. 現在のバージョンは2.xであり、2系以降C++インタフェースが導入された。
インストール
ここから(http://opencv.org/) Windowsならインストーラをダウンロードする。 Mac/Linuxならソースコードをダウンロードし、 cmakeを使ってビルドする。 !
わたしはいつもこれをします。 $> sudo port install opencv +python27
画像の読み込み 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などいろいろ読み込める。
画像を読み込む。
窓を用意する。
表示する。
キー入力を待つ。
画像の加工画素へのアクセス-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つずつ取り出す。
画素へのアクセス-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
指定した領域だけを取り出す。
画像の加工
いろいろなアルゴリズム-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
画像の加工
いろいろなアルゴリズム-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 }
画像の読み込み
グレー画像へ変換
ヒストグラムを平滑化する。
識別器を読み込む。
顔を検出する。
検出場所に円を描く。
表示する。
画像の加工
いろいろなアルゴリズム-3
同じことをPythonで
画像の加工
画像の保存 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などいろいろなフォーマットで保存できる。
将来
従来のデバイスは、2次元の情報を取得するものが 主流であった。動画であろうと2次元の枠を越える ものではない。 !最近では、kinectなどを使うことにより容易に 距離画像、すなわち3次元画像を取得することが できるようになった。 !3次元画像処理を行うライブラリがPoint Cloud Libraryである。 新規アルゴリズムの実装件数は、OpenCV より多くなっている。 次回は、PCLを紹介したい。
One more thing…
https://www.youtube.com/watch?v=_TTtN4frMEA
OpenCV3リリース
現在α版がリリースされている。 今年秋にβ版、クリスマス頃に正式版がリリースされる。
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)
おまけ