dlibで画像を認識させて、遊んでみた。
皆さんこんにちは
お元気ですか。私は元気です。
ついに、今回はdlibで遊んでみました。
※dlibとは何だ?と思う方は以下のページへ
基本的な構成
基本的の構成は以下のようになっており、よく使いそうな項目と
あるけどExamplesが存在しない項目の紹介となっています。
画像の読み込みと表示
画像を読み込んで窓に開いてみます。
C++の以下のコードで動作します。案外短かった。
しかし、コンパイルに結構手こずりました。
ライブラリを見ながら、リンクに何が不足しているのかを考えつつ、リンクしていきました。
(むしろCMakeを書くべきか・・・)
g++ -I/Users/Tereka/Programing/dlib/ -lpthread -ldlib -lblas augmentation.cpp
ソースコードは基本的にこれに追加する形式となります。
#include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <dlib/image_transforms.h> using namespace std; using namespace dlib; int main(int argc, char const *argv[]) { array2d<rgb_pixel> img; //画像をファイルから読み込む。 load_image(img, argv[1]); //窓を定義する。 image_window window(img, "Original Image"); //クローズするまで開く。 window.wait_until_closed(); return 0; }
画像の処理をかけてみる。
画像処理を実施してみました。
コンパイルコマンドは前項のをお使いください。
今回使ったのは、flipとgaussian blurと呼ばれる画像の処理をかけてみました。
#include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <dlib/image_transforms.h> using namespace std; using namespace dlib; int main(int argc, char const *argv[]) { array2d<rgb_pixel> img; //画像をファイルから読み込む。 load_image(img, argv[1]); //窓を定義する。 image_window window(img, "Original Image"); //クローズするまで開く。 window.wait_until_closed(); array2d<rgb_pixel> fliped_image; flip_image_up_down(img,fliped_image); image_window window2(fliped_image, "Fliped Image"); window2.wait_until_closed(); array2d<rgb_pixel> gaussian_blur_img; gaussian_blur(img,gaussian_blur_img); image_window gaussian_window(gaussian_blur_img, "Gaussian Image"); gaussian_window.wait_until_closed(); return 0; }
画像特徴に使われる処理を実施してみる。
Local Binary Pattern(LBP)とHog処理を実施してみます。
Selective Search
Selective Searchを実施してみました。
実はこれ、PythonにはExampleがありますが、なんと、C++にはExampleを用意してくれません。
ということで、ドキュメントを読みつつ、自分でコードを書いてみました。
#include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <dlib/image_transforms.h> #include <vector> #include <iostream> using namespace std; using namespace dlib; int main(int argc, char const *argv[]) { array2d<rgb_pixel> img; //画像をファイルから読み込む。 load_image(img, argv[1]); //窓を定義する。 image_window window(img, "Original Image"); //クローズするまで開く。 window.wait_until_closed(); std::vector<rectangle> rects; //Selective Search find_candidate_object_locations(img,rects); //四角形の描画 for (int i = 0; i < rects.size(); i++) { cout << rects[i].top() << endl; rgb_pixel pixel(255,0,0); draw_rectangle(img,rects[i],pixel); } //表示 image_window selective_window(img, "Selective Search Image"); selective_window.wait_until_closed(); return 0; }
find_candidate_object_locationsがSelective Searchの実行関数となります。
その結果は与えたrectsの中に格納されるので、その結果を描画しています。
OpenCV連携
OpenCV連携についてです。dlibライブラリ自身でサポートしており、
OpenCVで使いたい場合はOpenCVのMat型、dlibの関数しかない場合はdlibの関数を使うなど
簡単にこの連携を実現できます。
g++ -O2 -I/Users/Tereka/Programing/dlib/ -lpthread -ldlib -lblas `pkg-config --cflags opencv` `pkg-config --libs opencv` opencv_test.cpp
基本的にはtoMatとcv_imageを使えばよいです。実装コードは以下となっています。
#include <opencv2/highgui/highgui.hpp> #include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <dlib/image_transforms.h> #include <dlib/opencv.h> using namespace dlib; using namespace cv; int main(int argc, char const *argv[]) { Mat temp = imread(argv[1]); //OpenCV→dlib変換 cv_image<bgr_pixel> cimg(temp); //dlib→OpenCV変換 Mat convertedMat = toMat(cimg); return 0; }