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
- RasterCommandとしてHistogramEqualizeCommandを定義
- ConvertFromSourceメソッドで元のImageSourceをRasterImageに変換
- RunメソッドによりRasterImageにRasterCommandを実行
- ConvertToSourceで、RasterImageをImageSourceに変換
MainWindow.xaml
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>
実行結果
左右を見比べてみると左手前の凹凸や人物の上半身の凹凸がより分かりやすくなりました。また再遠部分が白く強調されたために全体的にその手前の物体の外観が分かりやすくなっていて、期待通りのフィルター効果が効いています。
別の効果を試してみる(サンプル:CZ1312ColorizeGrayVB)
LEADTOOLSにはグレースケールをカラー化するためのColorizeGrayCommand関数も用意されています。そのため、LeadConverterクラスを次のように変えるだけで新たな見せ方を実現できます。
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
- RasterCommandとしてColorizeGrayCommandを定義
- ConvertFromSourceメソッドで元のImageSourceをRasterImageに変換
- RunメソッドによりRasterImageにRasterCommandを実行
- ConvertToSourceで、RasterImageをImageSourceに変換
実行結果
左右を見比べてみると右側はかなりサイケデリックな色合いになってしまいましたが、距離の違いや細かな凸凹がかなり明確になっています。もし、このような処理をLEADTOOLSを使わないで実現したとしたら全ドットに対して1ドットずつ値を判定して対応するカラー値に変換していかなければならずフレームレートの低下が発生しますが、LEADTOOLSであれば手軽で実行時のフレームレートも低下せずに実装できます。
今回は自動変換を行いましたが値に応じて細かく色指定もできますので、必要な部分だけ色付けをするなどの用途にも使用できます。
まとめ
動画が連続した静止画であることは、アニメがどのように作られているかを知っているとすぐに理解できます。そして静止画1枚に対しての処理時間が短ければ、静止画に対するフィルターをかけながらでも動画として見えるように処理し続けることも可能なのです。LEADTOOLSであれば、その高速性を生かしてこのような用途でも十分使用に耐えられます。
なお、今年発売されるといわれている新型Kinectでは、距離データの解像度も高解像度になっています。つまり、静止画1枚あたりのデータ量が増加したことにより、高速なフィルター処理の必要性がさらに高まったことになります。また、先行提供版の新型Kinectを利用する機会があったので、距離データにLEADTOOLSを試してみました。高解像度に加えてLEADTOOLSで見やすくすることで、とてもきれいな距離データの見える化が可能です。この成果はコミックマーケット85のマイクロソフト企業ブースで、多くの方にご覧いただくことができました。