OpenCV の活用方法を紹介している有益なGithub のサイトを見つけたので、それを紹介する。
OpenCV自体にもサンプルはあるが、OpenCVの豊かな機能の全体を使い切るには、もっとサンプルのプログラムがあるにこしたことはない。
同じ機能の解説でも、使い方の違いで、だいぶ理解が違ってくる。
Github LearnOpenCV
sub directory ごとにそれぞれ1つのカテゴリの例題があります。
そのsub diretoryは
ブログのページに対応しています。
Github Average Face : OpenCV ( C++ / Python ) Tutorial
平均顔を作るまでの手順を詳細に基準を解説しています。
平均顔を作るためには顔の座標をそろえなければなりません。
従来は、目の中心の位置や鼻の位置、口の左右端などの位置を手入力しなければなりませんでした。
しかし、いまはdlibのlandmarkの検出を使って行うことができます。
その結果を利用して画像の大きさと位置をそろえて平均顔を作成しています。
参考になるdlibのスクリプト
このdlibのスクリプトには、顔画像を位置合わせする標準的な手法を示しています。
このようなスクリプトを使えば、LearnOpenCVの例題の中にある顔の座標をテキストファイルで与える必要がなくなります。
Github Eigenface using OpenCV (C++/Python)
平均顔が作れるくらいになっていれば固有顔を作ることができます。
固有顔(Eigenface)の解説はOpenCVのサイトにもありますが、
固有顔の成分の比率を変えるとどのような顔になるのかを、この例題を実行してみることは、いろいろな知見が得られるでしょう。
スライダーを左右に変動させることで、画像が変動していきます。
Github Face Reconstruction using EigenFaces (C++/Python)
固有顔への展開は、平均顔を差し引いた残りを、固有顔という直交ベクトルへの展開なので、
十分に次元を高くしておけば、元の画像の情報はすべて含まれています。
このことは、平均顔と利用している固有顔がどんなかわかっていれば、固有顔の係数から、元の顔画像を復元できることを示しています。
この例題はそのことを示しています。
blog Face Reconstruction using EigenFaces (C++/Python)
どのような平均顔と固有顔を用いているかということ、固有顔への展開の係数の両方を開示してしまうと、元の顔画像になってしまうので、
データの扱いには気をつける必要があります。
この画像の中では、固有顔をカラーで行なっています。
OpenCVのチュートリアルの中では、モノクロの画像での固有顔を示しています。
OpenCV4 の関連情報
Github FaceDetectionComparison
OpenCVにある複数の顔検出ライブラリとdlibにある顔検出を比較するスクリプトがあります。
Github FacialLandmarkDetection
FacemarkLBF::create()
を使って顔のlandmark を導出しているものです。
のソースコードを読むと、VideoCapture() を開いて、顔を検出をし、それぞれの顔に対して、
bool success = facemark->fit(frame,faces,landmarks);
でlandmarksを導出しています。
そして、その結果を描画するものになっています。
実行するには、README.md にある指示のあるファイルをダウンロードします。
次のようにwgetコマンドで入手することもできます。
wget https://raw.githubusercontent.com/kurnianggoro/GSOC2017/master/data/lbfmodel.yaml
wget https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_alt2.xml
そして、ビルド済みのコマンドを実行します。
./facialLandmarkDetection
/dev/video0になっているカメラを入力として、検出された顔に、顔の特徴点を描画します。
Blog 記事 Gender & Age Classification using OpenCV Deep Learning ( C++/Python )
OpenCVの深層学習を用いた性別と年齢の分類( C++/Python )
Github のREADME.md を読めば、簡単に実演することができます。
Github Object Tracking using OpenCV (C++/Python)
OpenCVにある6種類の追跡アルゴリズムの評価をできるスクリプトがあります。
blog Object Tracking using OpenCV (C++/Python)
その記事を読むとOpenCV3で使える代表的な追跡アルゴリズムの解説があります。
読むだけの価値はあります。
Github Colorization
深層学習を利用した、グレースケール画像のカラー画像化するスクリプトです。
まず、次のようにしてモデルファイルを取得します。
sudo chmod a+x getModels.sh
./getModels.sh
次に、このようにしてグレー画像を、カラー画像に変換することができます。
$ python colorizeImage.py --input greyscaleImage.png
Colorized image saved as greyscaleImage_colorized.png
Done !!!
$
blog Convolutional Neural Network based Image Colorization using OpenCV
Github Face Swap using OpenCV ( C++ / Python )
顔を入れ替えるスクリプト
blog [https://www.learnopencv.com/face-swap-using-opencv-c-python/]
(https://www.learnopencv.com/face-swap-using-opencv-c-python/)
顔のアライメントをした後に顔の輪郭を折れ線で囲まれた領域としています。
それをなめらかに画像をつないでいます。
output = cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)
Pythonの例題は、次のようにして実行できます。
$ python faceSwap.py
xrange()関数がないバージョンのPythonではエラーがでるので、xrange()をrange()
に置き換えます。
このスクリプトの中では、顔の領域を指定する多角形をテキストファイルで指定している。
もし、スクリプトを一般化したければ、顔のlandmarkを求め方結果から、このテキストの内容を自動生成させることです。
# Read array of corresponding points
points1 = readPoints(filename1 + '.txt')
points2 = readPoints(filename2 + '.txt')
Github Automatic Red Eye Remover using OpenCV (C++ / Python)
blog Automatic Red Eye Remover using OpenCV (C++ / Python)
赤目補正
目領域の中に赤目と判断される領域を画素単位で算出して、補正を加えています。
OpenCVにある目検出の利用は、このコードのほんの一部にすぎません。
このサイトのサンプルは、単にOpenCVの機能を利用したレベルではなくて、それ以上の知見を
たくさん含んでいます。
Github Computer Vision for Predicting Facial Attractiveness
これは、利用にあたっては注意がいる必要のあるライブラリでしょう。顔の魅力を数値化するというものです。いわゆる美人顔・美男顔のようなものが高くなるものです。使わないことを私としては推奨したいと思います。
Github HandPose
$ python handPoseImage.py
この現状の実装では、手がどこにあるのかもわからないような状況に対して、手を検出して、指などの位置を算出してくれることを期待するのは、難しそうだ。
headPose
$ python headPose.py
qiita 顔向き推定について調査中
Github Non-Photorealistic Rendering using OpenCV ( Python, C++ )
OpenCVに入っているフィルタの例示になっています。
blog Non-Photorealistic Rendering using OpenCV ( Python, C++ )
cv2.edgePreservingFilter(src, flags=1, sigma_s=60, sigma_r=0.4)
Github Character Classification (of Synthetic Dataset) using Keras (modified LeNet)
Github ObjectDetection-YOLO/
WWW Deep Learning based Object Detection using YOLOv3 with OpenCV ( Python / C++ )
What is indeed surprising is that OpenCV’s CPU implementation of DNN is 9x faster than Darknet with OpenML.
といいます。
Github Understanding Autoencoders using Tensorflow (Python)
手書き文字のデータにランダムノイズが加わったときに、それをautoencoderを使うことで、ランダムノイズを削除する例が示されています。
Github Color spaces in OpenCV (C++ / Python)
画像処理の分野では、カラー画像をRGBとは異なるcolor spaceを用いて処理することがあります。そのほうが、物事の識別をしやすい表現になることがあるためです。
Github applyColorMap for pseudocoloring in OpenCV ( C++ / Python )
colormapは数値データを可視化するときに、数値と色とを対応付ける方法です。
colormap_jetなどは、特によく使われるcolormapです。
Github Mask-RCNN
次の記事が詳しいです。
深層学習の検出では、最近はセグメンテーションベースのオブジェクト検出が増えてきています。
ただ単に矩形(=長方形)でオブジェクトの位置を示すのではなく、画像中のどこからどこまでがオブジェクトなのかを示すものです。矩形で示すオブジェクトでは、歩行者の画像で、どこからどこまで、ほんとうに歩行者の位置なのか、歩行者はどういう姿勢なのかを考えるヒントが不足しています。ですから、最近はセグメンテーションベースのオブジェクト検出の重要性が高まっています。
以下の記事をたどると、簡単にそのサンプルを動かすことができました(Ubuntuで確認)。
Qiita Mask-RCNN の使い方
Qiita 5分でMask-RCNNを試す
Github learnopencv/OpenPose/
$ python OpenPoseImage.py
$ python OpenPoseVideo.py
Github multi-person-pose-estimation-in-opencv-using-openpose
blog Multi-Person Pose Estimation in OpenCV using OpenPose
この記事を書いている時点では、次の修正を加えてbuildが実行できました。
diff --git a/OpenPose-Multi-Person/multi-person-openpose.cpp b/OpenPose-Multi-Person/multi-person-openpose.cpp
index 7660d82..9e0e957 100644
--- a/OpenPose-Multi-Person/multi-person-openpose.cpp
+++ b/OpenPose-Multi-Person/multi-person-openpose.cpp
@@ -320,7 +320,7 @@ int main(int argc,char** argv) {
inputFile = std::string(argv[1]);
}
- cv::Mat input = cv::imread(inputFile,CV_LOAD_IMAGE_COLOR);
+ cv::Mat input = cv::imread(inputFile,cv::IMREAD_COLOR);
std::chrono::time_point<std::chrono::system_clock> startTP = std::chrono::system_clock::now();
WWW LearnOpenCV
Mask R-CNN for Object Detection and Segmentation
Youtube Mask R-CNN for pose estimation and instance segmentation
Youtube Mask R-CNN
Qiita Mask R-CNN(keras)で人物検出 on Colaboratory
Youtube Mask R CNN Demo