Opencv – Real Baby – Real Family http://blog.shirai.la/baby IVRC2016にてLavai Virtual Awardを受賞したチーム「明るい家族計画」です。2人の体験者から未来の赤ちゃんの顔を推定し、リアルフェイス育児体験ができるコンテンツ「Real baby / Real family」を制作しています。 Wed, 28 Feb 2018 23:25:00 +0000 ja hourly 1 https://wordpress.org/?v=5.1.6 dlibでOpenCVが使えるかもしれない件 http://blog.shirai.la/baby/dlib%e3%81%a7opencv%e3%81%8c%e4%bd%bf%e3%81%88%e3%82%8b%e3%81%8b%e3%82%82%e3%81%97%e3%82%8c%e3%81%aa%e3%81%84%e4%bb%b6/ Tue, 15 Nov 2016 11:51:29 +0000 http://blog.shirai.la/baby/?p=146 dlibのメソッド見てたらこんなん見つけた

 

dlib

・・・これ完全にOpenCVと親和性あるんじゃね?

 

 

試してみたらマジでありました。

後日コードを載せます。

]]>
dlibでopencvを使いたい http://blog.shirai.la/baby/opencv_and_dlib/ Fri, 21 Oct 2016 12:45:14 +0000 http://blog.shirai.la/baby/?p=171 dlibをopencvと一緒に使うとき便利なメソッドがあったので、備忘録作成。

 

dlibで処理を行った後、使い慣れたopencvにデータを渡したいなーということがあると思います。

そのようなときはこうします。

1 dlibのデータをopencvに渡したいとき。

dlibで画像を表すクラスはdlib::array2d<dlib::bgr_pixel>です。

それをMatクラスに渡すには「dlib/opencv.h」をインクルードして、

cv::Mat cvimage = dlib::toMat(dlibimage);

みたいに書きます。

2 opencvのデータをdlibに渡したいとき。

Matクラスをarray2d<bgr_pixel>に渡すには以下のようにします。

「dlib/opencv.h」をインクルードして、

dlib::array2d<dlib::bgr_pixel> dlibimage;

assign_image(dlibimage, cv_image<bgr_pixel>(cvimage));

みたいに書きます。

以上備忘録

]]>
OpenCV cv::Matとメモリ http://blog.shirai.la/baby/opencv01/ Fri, 30 Sep 2016 11:14:37 +0000 http://blog.shirai.la/baby/?p=132 OpenCVにおいて画像を格納するクラスはほとんどの方がcv::Matクラスを使用していると思います。Matクラスの振る舞いを理解しておくとコーディングがはかどります。


cv::Mat blue(300,300,CV_8UC3,cv::Scalar(0,0,255));
cv::Mat copy = blue;
for(int y = 0;y < copy.rows;++y){
for(int x = 0;x < copy.cols;++x){
for(int i = 0;i < 3;++i){
copy.data[copy.step * y + copy.channels() * x + i] = 255;
}
}
}

みたいなコードがあったときに、変数copyは白一色を表しますが、Mat型では初期化演算子、代入演算子ともに値のコピーを作成するのではなく参照先のコピーを作るだけです。つまりcopyが指しているメモリ空間は変数blueと共用していて、copyの値を書き換えるとblueの値も書き換わってしまいます。この結果blueは白色の画像になります。

メモリーの共有を防ぐには
cv::Mat copy = blue.clone();
という様に書きます。

OpenCVでは前者を浅いコピー、後者を深いコピーといいます。前者のほうが高速にコピーを行えます。

なぜOpenCVがこのような使用になっているかというと、画像の範囲を指定して処理を行いたいときにこの使用が生きてきます。

 

例えば画像の中心だけ画像処理させたいとき、このように書けます。

cv::Mat white(300,300,CV_8UC3,cv::Scalar(255,255,255));
cv::Mat roi = white(cv::Rect(150,150,150,150));
for(int y = 0;y < roi.rows;++y){
for(int x = 0;x < roi.cols;++x){
for(int i = 0;i < 3;++i){
roi.data[roi.step * y + roi.channels() * x + i] = 0;
}
}
}

このコードでは白い画像の中心150*150ピクセルが黒色になります。

このように画像の範囲を指定して処理を行いたいときに、威力を発揮します。(自分はそれしか知りませんが、ほかにも使用用途があれば教えてください…)

]]>
顔の特徴点取得できました! http://blog.shirai.la/baby/project_05/ Mon, 29 Aug 2016 18:31:33 +0000 http://blog.shirai.la/baby/?p=39 こんにちは。
明るい家族計画の望月です。

今回はdlibというC++のライブラリを使用しました。
dlibは画像処理や機械学習などの機能を持ち、顔の特徴点を取得するのに使用しました。

特徴点取得の参考画像がこちらです。
landmark

dlibに用意されている学習データを用いることで顔画像領域の切り出し、ランドマークの検出などが行えます。ちなみにOpenCVを用いても顔画像を切り出すことは可能ですが、それよりも精度よく顔画像を切り出すことができます。

またランドマークはdlibによって、ソートされて出力されるので、モーフィングなどで重要な対応点なども簡単に調べることができます。dlib_face_landmark_point

こんな感じで対応点をソートしてくれます。

ただdlibの導入は少し面倒なのでCMakeの使い方には慣れておいたほうが良いかもしれません。

まだ慣れていないのもありますが構文もかなり難しいです。

また、特徴点が取得できたので、赤ちゃんの平均顔画像も作成しました。
平均顔画像の作成にはOpenCVを使用しました。
baby_face.ave

平均顔の赤ちゃんは非常に可愛いです。
この可愛い赤ちゃん画像から若年変化について考えていきたいと思います。

]]>