サイト紹介 LearnOpenCV

OpenCV の活用方法を紹介している有益なGithub のサイトを見つけたので、それを紹介する。

OpenCV自体にもサンプルはあるが、OpenCVの豊かな機能の全体を使い切るには、もっとサンプルのプログラムがあるにこしたことはない。

同じ機能の解説でも、使い方の違いで、だいぶ理解が違ってくる。


## Github [LearnOpenCV](https://github.com/spmallick/learnopencv)

sub directory ごとにそれぞれ１つのカテゴリの例題があります。
そのsub diretoryは
ブログのページに対応しています。


### Github [Average Face : OpenCV ( C++ / Python ) Tutorial](https://github.com/spmallick/learnopencv/tree/master/FaceAverage)

平均顔を作るまでの手順を詳細に基準を解説しています。

平均顔を作るためには顔の座標をそろえなければなりません。
従来は、目の中心の位置や鼻の位置、口の左右端などの位置を手入力しなければなりませんでした。
しかし、いまはdlibのlandmarkの検出を使って行うことができます。

その結果を利用して画像の大きさと位置をそろえて平均顔を作成しています。

#### 参考になるdlibのスクリプト
https://github.com/davisking/dlib/blob/master/python_examples/face_alignment.py

このdlibのスクリプトには、顔画像を位置合わせする標準的な手法を示しています。
このようなスクリプトを使えば、LearnOpenCVの例題の中にある顔の座標をテキストファイルで与える必要がなくなります。

---

### Github [Eigenface using OpenCV (C++/Python)](https://github.com/spmallick/learnopencv/tree/master/EigenFace)

平均顔が作れるくらいになっていれば固有顔を作ることができます。

固有顔（Eigenface)の解説はOpenCVのサイトにもありますが、
固有顔の成分の比率を変えるとどのような顔になるのかを、この例題を実行してみることは、いろいろな知見が得られるでしょう。

スライダーを左右に変動させることで、画像が変動していきます。


![](https://www.learnopencv.com/wp-content/uploads/2018/01/EigenFace.jpg)

---

### Github [Face Reconstruction using EigenFaces (C++/Python)](https://github.com/spmallick/learnopencv/tree/master/ReconstructFaceUsingEigenFaces)

固有顔への展開は、平均顔を差し引いた残りを、固有顔という直交ベクトルへの展開なので、
十分に次元を高くしておけば、元の画像の情報はすべて含まれています。

このことは、平均顔と利用している固有顔がどんなかわかっていれば、固有顔の係数から、元の顔画像を復元できることを示しています。

この例題はそのことを示しています。

![](https://www.learnopencv.com/wp-content/uploads/2018/01/face-reconstruction-using-eigenfaces.jpg)



---

#### blog [Face Reconstruction using EigenFaces (C++/Python)](https://www.learnopencv.com/face-reconstruction-using-eigenfaces-cpp-python/)


どのような平均顔と固有顔を用いているかということ、固有顔への展開の係数の両方を開示してしまうと、元の顔画像になってしまうので、
データの扱いには気をつける必要があります。

この画像の中では、固有顔をカラーで行なっています。
OpenCVのチュートリアルの中では、モノクロの画像での固有顔を示しています。


##### OpenCV4 の関連情報
https://docs.opencv.org/4.0.0/da/d60/tutorial_face_main.html

---

### Github [FaceDetectionComparison](https://github.com/spmallick/learnopencv/tree/master/FaceDetectionComparison)

OpenCVにある複数の顔検出ライブラリとdlibにある顔検出を比較するスクリプトがあります。

---

### Github [FacialLandmarkDetection](https://github.com/spmallick/learnopencv/tree/master/FacialLandmarkDetection)

`FacemarkLBF::create()` を使って顔のlandmark を導出しているものです。

https://github.com/spmallick/learnopencv/blob/master/FacialLandmarkDetection/facialLandmarkDetection.cpp

のソースコードを読むと、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 )](https://www.learnopencv.com/age-gender-classification-using-opencv-deep-learning-c-python/
)
OpenCVの深層学習を用いた性別と年齢の分類( C++/Python )

![](https://www.learnopencv.com/wp-content/uploads/2019/02/age-gender-sample1-1024x682.jpg)

Github のREADME.md を読めば、簡単に実演することができます。

　


---

### Github [Object Tracking using OpenCV (C++/Python)](https://github.com/spmallick/learnopencv/tree/master/tracking)

OpenCVにある６種類の追跡アルゴリズムの評価をできるスクリプトがあります。
#### blog [Object Tracking using OpenCV (C++/Python)](https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/)

その記事を読むとOpenCV3で使える代表的な追跡アルゴリズムの解説があります。
読むだけの価値はあります。

---

### Github [Colorization](https://github.com/spmallick/learnopencv/tree/master/Colorization)

深層学習を利用した、グレースケール画像のカラー画像化するスクリプトです。

まず、次のようにしてモデルファイルを取得します。

```
sudo chmod a+x getModels.sh
./getModels.sh
```

次に、このようにしてグレー画像を、カラー画像に変換することができます。

```
$ python colorizeImage.py --input  greyscaleImage.png 
Colorized image saved as greyscaleImage_colorized.png
Done !!!
$
```

入力画像
![greyscaleImage.png](https://qiita-image-store.s3.amazonaws.com/0/83761/9113f735-ff1c-8347-a3fd-f435edbac9a8.png)

生成されたカラー画像
![greyscaleImage_colorized.png](https://qiita-image-store.s3.amazonaws.com/0/83761/23252cb1-afe8-acbb-d2ca-3cd0aa55179e.png)


blog [Convolutional Neural Network based Image Colorization using OpenCV](https://www.learnopencv.com/convolutional-neural-network-based-image-colorization-using-opencv/)

---

### Github [Face Swap using OpenCV ( C++ / Python )](https://github.com/spmallick/learnopencv/tree/master/FaceSwap)

顔を入れ替えるスクリプト

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)](https://github.com/spmallick/learnopencv/blob/master/RedEyeRemover/README.md)

blog [Automatic Red Eye Remover using OpenCV (C++ / Python)](https://www.learnopencv.com/automatic-red-eye-remover-using-opencv-cpp-python/)

赤目補正
目領域の中に赤目と判断される領域を画素単位で算出して、補正を加えています。

OpenCVにある目検出の利用は、このコードのほんの一部にすぎません。
このサイトのサンプルは、単にOpenCVの機能を利用したレベルではなくて、それ以上の知見を
たくさん含んでいます。

---

### Github [Computer Vision for Predicting Facial Attractiveness](https://github.com/spmallick/learnopencv/tree/master/FacialAttractiveness)

これは、利用にあたっては注意がいる必要のあるライブラリでしょう。顔の魅力を数値化するというものです。いわゆる美人顔・美男顔のようなものが高くなるものです。使わないことを私としては推奨したいと思います。

---

### Github [HandPose](https://github.com/spmallick/learnopencv/tree/master/HandPose)


```
$ python handPoseImage.py
```

![dlib_hand_pose.png](https://qiita-image-store.s3.amazonaws.com/0/83761/b321c56b-ce2f-3a88-779c-6505b466ee8f.png)


この現状の実装では、手がどこにあるのかもわからないような状況に対して、手を検出して、指などの位置を算出してくれることを期待するのは、難しそうだ。

---
headPose

```
$ python headPose.py 
```

実行結果
![Screenshot from 2018-12-30 02-18-46.png](https://qiita-image-store.s3.amazonaws.com/0/83761/4e0350c0-925b-6d01-2fae-e45cc1aaddf0.png)


qiita [顔向き推定について調査中](https://qiita.com/nonbiri15/items/f6910a993457a1862632)


---

### Github [Non-Photorealistic Rendering using OpenCV ( Python, C++ )](https://github.com/spmallick/learnopencv/tree/master/NonPhotorealisticRendering)

OpenCVに入っているフィルタの例示になっています。

blog [Non-Photorealistic Rendering using OpenCV ( Python, C++ )](https://www.learnopencv.com/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)](https://github.com/spmallick/learnopencv/tree/master/CharClassification#character-classification-of-synthetic-dataset-using-keras-modified-lenet)

---

### Github [ObjectDetection-YOLO/](https://github.com/spmallick/learnopencv/tree/master/ObjectDetection-YOLO)


WWW [Deep Learning based Object Detection using YOLOv3 with OpenCV ( Python / C++ )](https://www.learnopencv.com/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.

といいます。

![Screenshot from 2018-11-23 01-54-45.png](https://qiita-image-store.s3.amazonaws.com/0/83761/4ede4722-d08d-d2ee-9491-eba7e3b31b09.png)

---

### Github [Understanding Autoencoders using Tensorflow (Python)](https://github.com/spmallick/learnopencv/tree/master/DenoisingAutoencoder)

手書き文字のデータにランダムノイズが加わったときに、それをautoencoderを使うことで、ランダムノイズを削除する例が示されています。


![](https://www.learnopencv.com/wp-content/uploads/2017/11/denoising-example.png)

---

### Github [Color spaces in OpenCV (C++ / Python)](https://github.com/spmallick/learnopencv/tree/master/ColorSpaces)

画像処理の分野では、カラー画像をRGBとは異なるcolor spaceを用いて処理することがあります。そのほうが、物事の識別をしやすい表現になることがあるためです。

---

### Github [applyColorMap for pseudocoloring in OpenCV ( C++ / Python )](https://github.com/spmallick/learnopencv/tree/master/Colormap)

colormapは数値データを可視化するときに、数値と色とを対応付ける方法です。

colormap_jetなどは、特によく使われるcolormapです。



### Github [Mask-RCNN](https://github.com/spmallick/learnopencv/tree/master/Mask-RCNN) 

次の記事が詳しいです。

深層学習の検出では、最近はセグメンテーションベースのオブジェクト検出が増えてきています。
ただ単に矩形（＝長方形）でオブジェクトの位置を示すのではなく、画像中のどこからどこまでがオブジェクトなのかを示すものです。矩形で示すオブジェクトでは、歩行者の画像で、どこからどこまで、ほんとうに歩行者の位置なのか、歩行者はどういう姿勢なのかを考えるヒントが不足しています。ですから、最近はセグメンテーションベースのオブジェクト検出の重要性が高まっています。

以下の記事をたどると、簡単にそのサンプルを動かすことができました(Ubuntuで確認)。


Qiita  [Mask-RCNN の使い方](https://qiita.com/ekzemplaro/items/6ec4df8f43e7daa0ca1f)

Qiita [5分でMask-RCNNを試す](https://qiita.com/miyamotok0105/items/ddeca916df9104fb15bb)

---

### Github [learnopencv/OpenPose/](https://github.com/spmallick/learnopencv/tree/master/OpenPose)




```
$ python  OpenPoseImage.py

$ python  OpenPoseVideo.py 
```


![Screenshot from 2018-12-29 20-16-21.png](https://qiita-image-store.s3.amazonaws.com/0/83761/cc9f3ddd-23c8-0e45-be2d-37caeaad64a6.png)


### Github [multi-person-pose-estimation-in-opencv-using-openpose](https://github.com/spmallick/learnopencv/tree/master/OpenPose-Multi-Person)


#### blog [Multi-Person Pose Estimation in OpenCV using OpenPose](https://www.learnopencv.com/multi-person-pose-estimation-in-opencv-using-openpose/)

入力画像
![group.jpg](https://qiita-image-store.s3.amazonaws.com/0/83761/056cb45b-c756-90f7-f4f8-b3b8fcdc3844.jpeg)

実行後の画像
![openpose_multi_person.png](https://qiita-image-store.s3.amazonaws.com/0/83761/1cac2106-9706-772e-eb89-7642a7410960.png)



##### この記事を書いている時点では、次の修正を加えて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](https://www.learnopencv.com/)


----

### [Mask R-CNN for Object Detection and Segmentation](https://github.com/matterport/Mask_RCNN)

[Mask R-CNNを簡単にカメラ映像から試す方法](https://ai-coordinator.jp/mask-r-cnn)

Youtube [Mask R-CNN for pose estimation and instance segmentation](https://www.youtube.com/watch?v=KYNDzlcQMWA)


Youtube [Mask R-CNN](https://www.youtube.com/watch?v=g7z4mkfRjI4)

Qiita [Mask R-CNN（keras）で人物検出 on Colaboratory](https://qiita.com/nanako_ut/items/cb28d403fcaf013b2396)


Youtube [Mask R CNN Demo](https://www.youtube.com/watch?v=XxJ4yRLW5No)


[4K Mask RCNN COCO Object detection and segmentation #2](https://www.youtube.com/watch?v=OOT3UIXZztE)