2.1.4 グラフィックス (マーカー描画・テキスト描画・図形描画)


# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)

# 概要


MATLABで画像にマーカーや注釈、図形、テキストを描画・挿入する方法を紹介します。




Computer Vision Toolbox™の各種描画関数を活用します。


対応ファイル



   -  [I2_01_4_graphics.m](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I2_01_4_graphics.m) 

# 初期化

```matlab:Code
clear; clc; close all; imtool close all
```

# 画像を読み込む

```matlab:Code
I = imread('visionteam1.jpg');
figure; imshow(I);
```

![figure_0_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/13f254c5-8c5e-ce08-7a69-8994bd77151f.jpeg)



# 人物検出のアルゴリズムを実行


可視化に使用するために人物検出器を使ってバウンディングボックスの座標とスコアを計算します。



```matlab:Code
detector = peopleDetectorACF;
[bboxes,scores] = detect(detector,I)
```


```text:Output
bboxes = 5x4    
   180   119    98   238
   589   130   126   308
   260    95   149   364
    51   115   182   443
   439    52   215   523

scores = 5x1    
   39.6764
   25.4916
   74.0602
   59.2155
   47.6619

```

# 検出したバウンディングボックスを描画


はじめに検出したバウンディングボックスを描画します。



```matlab:Code
Iboxes = insertShape(I,'rectangle',bboxes);
imshow(Iboxes)
```


![figure_1_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/738a49ca-05c0-fb11-d9ad-31f540d9cec5.jpeg)



バウンディングボックスの枠の太さや色を変えてみます。



```matlab:Code
Iboxes = insertShape(I,'rectangle',bboxes,"LineWidth",5,"Color","red");
imshow(Iboxes)
```


![figure_2_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/8aa318f4-b718-ca81-c09d-83774971adf6.jpeg)

# 検出したバウンディングボックスを描画(キャプションを追加)


次に各検出結果のスコアをキャプションとしてバウンディングボックスを可視化します。



```matlab:Code
Iout = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(Iout)
```


![figure_3_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/6046d6db-b460-93b1-3e71-caec20485023.jpeg)



高いスコアと低いスコアで異なる色になるようにします。



```matlab:Code
% カラーマップを生成
cmap = jet;

% スコアを0-255に正規化
scoreNorm = im2uint8(mat2gray(scores));

% カラーマップに割り当て
colors = im2uint8(reshape(ind2rgb(scoreNorm,cmap),[],3));

% バウンディングボックスを挿入した画像生成
Iout = insertObjectAnnotation(I,'rectangle',bboxes,scores,...
    "LineWidth",3,"Color",colors);
figure
imshow(Iout)
```


![figure_4_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/5d8317f4-9b41-c7ca-3519-789c89778ec8.jpeg)

# テキスト挿入


テキストを挿入します。日本語で挿入することも可能です。



```matlab:Code
listTrueTypeFonts % フォントのリスト確認
```


```text:Output
ans = 591x1 cell    
'Agency FB'            
'Agency FB Bold'       
'Algerian'             
'Arial'                
'Arial Black'          
'Arial Bold'           
'Arial Bold Italic'    
'Arial Italic'         
'Arial Narrow'         
'Arial Narrow Bold'    

```


```matlab:Code
Iout2 = insertText(Iout,[1,1],'人物検出結果の可視化',...
    'Font','MS UI Gothic','FontSize',25,...
    'BoxColor','blue','TextColor','white');
figure, imshow(Iout2);
```


![figure_5_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/22cb577f-e603-a939-2faf-8b33cb4e500e.jpeg)

# マーカー挿入


マーカーを描画・挿入します。




例として検出された人物上でORB特徴を抽出し、その特徴点を描画します。



```matlab:Code
points = detectORBFeatures(rgb2gray(I),'ROI',bboxes(3,:));

% スコアを0-255に正規化
metricNorm = im2uint8(mat2gray(points.Metric));

% カラーマップに割り当て
colors = im2uint8(reshape(ind2rgb(metricNorm,parula),[],3));

% 描画
Iout3 = insertMarker(Iout2,points.Location,"plus","Color",colors);
figure, imshow(Iout3);
```


![figure_6_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/6e1ac191-b368-874a-80f6-45d964ef57af.jpeg)

# 図形挿入


任意の図形を挿入することもできます。



```matlab:Code
% 特徴点の重複を取り除く
loc = unique(double(points.Location),'rows');
% 三角形分割
DT = delaunayTriangulation(loc(:,1),loc(:,2));
%凸包を計算
C = convexHull(DT);
% [x1,y1,x2,y2,...]というベクトルに変換
polyPos = reshape([DT.Points(C,1),DT.Points(C,2)]',1,[]);
% ポリゴンとして挿入
Iout4 = insertShape(Iout3,'Polygon',polyPos,'LineWidth',5);

% 顔検出
faceDetector = vision.CascadeObjectDetector();
bboxesFace = faceDetector(rgb2gray(I));
% 円を描画するために[x,y,r]のベクトルに変換
posCir = [bboxesFace(:,1:2)+bboxesFace(:,3:4)/2 bboxesFace(:,3)/2];
Iout5 = insertShape(Iout4,'Circle',posCir,'LineWidth',5);

figure, imshow(Iout5);
```


![figure_7_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/8229045c-07d6-4535-1861-d714533bad23.jpeg)

# まとめ


MATLABで画像にマーカーや注釈、図形、テキストを描画・挿入する方法を紹介しました。




画像処理、コンピュータービジョン、ディープラーニングなどの処理結果の可視化にお役立てください。


# 参考

   -  [`insertText`](https://jp.mathworks.com/help/vision/ref/inserttext.html) 
   -  [`insertObjectAnnotation`](https://jp.mathworks.com/help/vision/ref/insertobjectannotation.html) 
   -  [`insertShape`](https://jp.mathworks.com/help/vision/ref/insertshape.html) 
   -  [`insertMarker`](https://jp.mathworks.com/help/vision/ref/insertmarker.html) 


# 謝辞


本記事は @eigs さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。



# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)