SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(LEADTOOLS)

「LEADTOOLS」を使ってKinectから取得した距離データを可視化しよう

  • X ポスト
  • このエントリーをはてなブックマークに追加

LeadConverter.vb

 参照設定が完了したら、コンバータを記述します。

リスト4  LeadConverter.vb
Public Class LeadConverter
    Implements IValueConverter


    Public Function Convert(value As Object,
                            targetType As Type,
                            parameter As Object,
                            culture As Globalization.CultureInfo) As Object _
                        Implements IValueConverter.Convert
        If TypeOf value Is ImageSource Then
            Dim orignal = CType(value, ImageSource)
            Dim command As Leadtools.ImageProcessing.RasterCommand =
                New Leadtools.ImageProcessing.Color.HistogramEqualizeCommand

            If Not command Is Nothing Then
                Using image As Leadtools.RasterImage =
                    Leadtools.Windows.Media.RasterImageConverter.ConvertFromSource(
                        orignal,
                        Leadtools.Windows.Media.ConvertFromSourceOptions.None)
                    command.Run(image)
                    Return Leadtools.Windows.Media.RasterImageConverter.ConvertToSource(
                                image,
                                Leadtools.Windows.Media.ConvertToSourceOptions.None)
                End Using
            Else
                Return orignal
            End If
        Else
            Return value
        End If
    End Function

    Public Function ConvertBack(value As Object,
                                targetType As Type,
                                parameter As Object,
                                culture As Globalization.CultureInfo) As Object _
                            Implements IValueConverter.ConvertBack
        Throw New NotImplementedException
    End Function
End Class
  1. RasterCommandとしてHistogramEqualizeCommandを定義
  2. ConvertFromSourceメソッドで元のImageSourceをRasterImageに変換
  3. RunメソッドによりRasterImageにRasterCommandを実行
  4. ConvertToSourceで、RasterImageをImageSourceに変換

MainWindow.xaml

 XAMLにコンバータの利用設定を追記します。

リスト5 MainWindow.xaml
<Window
    x:Class="MainWindow"
    Title="CZ1312HistogramVB" 
    Height="300" Width="640"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:CZ1312HistogramVB"
    Loaded="WIndow_Loaded" Closing="Window_Closing">
    <Window.Resources>
        <local:LeadConverter x:Key="LeadConverter"/>
    </Window.Resources>
    <Viewbox>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="1*" />
            </Grid.ColumnDefinitions>
            <Image Grid.Column="0" Grid.Row="0" 
                   Source="{Binding DepthImageElement}"  
                   Width="640" Height="480" />
            <Image Grid.Column="1" Grid.Row="0" 
                   Source="{Binding DepthImageElement, Converter={StaticResource LeadConverter}}"  
                   Width="640" Height="480" />
        </Grid>
    </Viewbox>
</Window>

実行結果

図5 LEADTOOLSでの処理結果
図5 LEADTOOLSでの処理結果

 左右を見比べてみると左手前の凹凸や人物の上半身の凹凸がより分かりやすくなりました。また再遠部分が白く強調されたために全体的にその手前の物体の外観が分かりやすくなっていて、期待通りのフィルター効果が効いています。

別の効果を試してみる(サンプル:CZ1312ColorizeGrayVB)

 LEADTOOLSにはグレースケールをカラー化するためのColorizeGrayCommand関数も用意されています。そのため、LeadConverterクラスを次のように変えるだけで新たな見せ方を実現できます。

リスト6 LeadConverter.vb
Public Class LeadConverter
    Implements IValueConverter
 
 
    Public Function Convert(value As Object,
                            targetType As Type,
                            parameter As Object,
                            culture As Globalization.CultureInfo) As Object _
                        Implements IValueConverter.Convert
        If TypeOf value Is ImageSource Then
            Dim orignal = CType(value, ImageSource)
            Dim command As New Leadtools.ImageProcessing.Core.ColorizeGrayCommand With {
                    .GrayColors = Nothing}
 
            If Not command Is Nothing Then
                Using image As Leadtools.RasterImage =
                    Leadtools.Windows.Media.RasterImageConverter.ConvertFromSource(
                        orignal,
                        Leadtools.Windows.Media.ConvertFromSourceOptions.None)
                    command.Run(image)
                    Return Leadtools.Windows.Media.RasterImageConverter.ConvertToSource(
                                command.DestinationImage,
                                Leadtools.Windows.Media.ConvertToSourceOptions.None)
                End Using
            Else
                Return orignal
            End If
        Else
            Return value
        End If
    End Function
 
    Public Function ConvertBack(value As Object,
                                targetType As Type,
                                parameter As Object,
                                culture As Globalization.CultureInfo) As Object _
                            Implements IValueConverter.ConvertBack
        Throw New NotImplementedException
    End Function
End Class
  1. RasterCommandとしてColorizeGrayCommandを定義
  2. ConvertFromSourceメソッドで元のImageSourceをRasterImageに変換
  3. RunメソッドによりRasterImageにRasterCommandを実行
  4. ConvertToSourceで、RasterImageをImageSourceに変換

実行結果

図6 LEADTOOLSでの処理結果
図6 LEADTOOLSでの処理結果

 左右を見比べてみると右側はかなりサイケデリックな色合いになってしまいましたが、距離の違いや細かな凸凹がかなり明確になっています。もし、このような処理をLEADTOOLSを使わないで実現したとしたら全ドットに対して1ドットずつ値を判定して対応するカラー値に変換していかなければならずフレームレートの低下が発生しますが、LEADTOOLSであれば手軽で実行時のフレームレートも低下せずに実装できます。

 今回は自動変換を行いましたが値に応じて細かく色指定もできますので、必要な部分だけ色付けをするなどの用途にも使用できます。

まとめ

 動画が連続した静止画であることは、アニメがどのように作られているかを知っているとすぐに理解できます。そして静止画1枚に対しての処理時間が短ければ、静止画に対するフィルターをかけながらでも動画として見えるように処理し続けることも可能なのです。LEADTOOLSであれば、その高速性を生かしてこのような用途でも十分使用に耐えられます。

 なお、今年発売されるといわれている新型Kinectでは、距離データの解像度も高解像度になっています。つまり、静止画1枚あたりのデータ量が増加したことにより、高速なフィルター処理の必要性がさらに高まったことになります。また、先行提供版の新型Kinectを利用する機会があったので、距離データにLEADTOOLSを試してみました。高解像度に加えてLEADTOOLSで見やすくすることで、とてもきれいな距離データの見える化が可能です。この成果はコミックマーケット85のマイクロソフト企業ブースで、多くの方にご覧いただくことができました。

図7 先行提供版新型Kinect+LEADTOOLSでの処理結果
図7 先行提供版新型Kinect+LEADTOOLSでの処理結果

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(LEADTOOLS)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7573 2016/03/14 11:40

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング