【Python】 "Deep Learning Prerequisites: The Numpy Stack in Python" Lecture10のメモ
【Python】 "Deep Learning Prerequisites: The Numpy Stack in Python" Lecture4のメモ
【WPF】 RadioButtonをユーザーが触れないようにする
IsHitTestVisibleとIsTabStopをFalseに設定します。IsHitTestVisibleのみをFalseにした場合、Tabキーを押してRadioButtonに移動し、スペースキーを押すとRadioButtonをチェックできてしまうため、両方Falseにする必要があります。
<RadioButton Content="ReadOnlyRadioButton" IsHitTestVisible="False" IsTabStop="False"/>
【OpenCvSharp】 ポインタを利用してMatクラスの画素にアクセスする
OpenCvSharpのMatクラスを走査する時、いつもAtメソッドを利用していたのですが、ポインタを使って走査する方法を見つけたのでメモします。
リンク先はカラー画像に対して走査していますが、自分はグレースケール画像を走査したかったので、その場合のコード以下のようになります。unsafeキーワードを利用可能にするため、”アンセーフ コードの許可(F)”にチェックを入れることを忘れないで下さい。
unsafe { byte* b = mm.DataPointer; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { byte valueAt = b[0]; b += 1; } } }
【OpenCV】 画像に傾いた四角形を書き込む
RotatedRectは直線を利用して描くしかないようです。。。
// 画像を読み込む Mat source; imread("lenna.jpg").copyTo(source); if (source.empty()) { throw runtime_error("Failed to open image"); } // RotatedRectを描画する Mat destination; source.copyTo(destination); RotatedRect rect = RotatedRect(Point2f(40.0, 40.0), Size2f(60.0, 20.0), 20.0); Scalar color = Scalar(0, 0, 0); int thickness = 2; Point2f vertices[4]; rect.points(vertices); for (int i = 0; i < 4; ++i) { line(destination, vertices[i], vertices[(i + 1)%4], color, thickness); }
【OpenCV】 画像に楕円を書き込む
ellipseというメソッドを利用すると画像に楕円を書き込めますよ、というメモです。
// 画像を読み込む Mat source; imread("lenna.jpg").copyTo(source); if (source.empty()) { throw runtime_error("Failed to open image"); } Mat destination; source.copyTo(destination); RotatedRect rect = RotatedRect(Point2f(40.0, 40.0), Size2f(60.0, 20.0), 20.0); Scalar color = Scalar(0, 0, 0); int thickness = 2; // 楕円を書き込む ellipse(destination, rect, color, thickness);
【WPF】 時間のかかる処理を実行する時にアニメーションを表示する
アプリケーションで時間のかかる処理を実行している時に「今処理を実行中ですよ」とユーザーに知らせたい時、実行中に表示するアニメーションがあると便利です。幸いアニメーション自体は既に作成してくれている人がいるので、それを拝借します。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <Color x:Key="FilledColor" A="255" B="155" R="155" G="155"/> <Color x:Key="UnfilledColor" A="0" B="155" R="155" G="155"/> <Style x:Key="BusyAnimationStyle" TargetType="Control"> <Setter Property="Background" Value="#7F000000"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Control"> <ControlTemplate.Resources> <Storyboard x:Key="Animation0" BeginTime="00:00:00.0" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse0" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation1" BeginTime="00:00:00.2" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse1" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation2" BeginTime="00:00:00.4" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse2" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation3" BeginTime="00:00:00.6" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse3" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation4" BeginTime="00:00:00.8" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse4" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation5" BeginTime="00:00:01.0" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse5" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation6" BeginTime="00:00:01.2" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse6" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation7" BeginTime="00:00:01.4" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse7" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" > <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> </ControlTemplate.Resources> <ControlTemplate.Triggers> <Trigger Property="IsVisible" Value="True"> <Trigger.EnterActions> <BeginStoryboard Storyboard="{StaticResource Animation0}" x:Name="Storyboard0" /> <BeginStoryboard Storyboard="{StaticResource Animation1}" x:Name="Storyboard1"/> <BeginStoryboard Storyboard="{StaticResource Animation2}" x:Name="Storyboard2"/> <BeginStoryboard Storyboard="{StaticResource Animation3}" x:Name="Storyboard3"/> <BeginStoryboard Storyboard="{StaticResource Animation4}" x:Name="Storyboard4"/> <BeginStoryboard Storyboard="{StaticResource Animation5}" x:Name="Storyboard5"/> <BeginStoryboard Storyboard="{StaticResource Animation6}" x:Name="Storyboard6"/> <BeginStoryboard Storyboard="{StaticResource Animation7}" x:Name="Storyboard7"/> </Trigger.EnterActions> <Trigger.ExitActions> <StopStoryboard BeginStoryboardName="Storyboard0"/> <StopStoryboard BeginStoryboardName="Storyboard1"/> <StopStoryboard BeginStoryboardName="Storyboard2"/> <StopStoryboard BeginStoryboardName="Storyboard3"/> <StopStoryboard BeginStoryboardName="Storyboard4"/> <StopStoryboard BeginStoryboardName="Storyboard5"/> <StopStoryboard BeginStoryboardName="Storyboard6"/> <StopStoryboard BeginStoryboardName="Storyboard7"/> </Trigger.ExitActions> </Trigger> </ControlTemplate.Triggers> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" > <Canvas Height="60" Width="60"> <Canvas.Resources> <Style TargetType="Ellipse"> <Setter Property="Width" Value="15"/> <Setter Property="Height" Value="15" /> <Setter Property="Fill" Value="#009B9B9B" /> </Style> </Canvas.Resources> <Ellipse x:Name="ellipse0" Canvas.Left="1.75" Canvas.Top="21"/> <Ellipse x:Name="ellipse1" Canvas.Top="7" Canvas.Left="6.5"/> <Ellipse x:Name="ellipse2" Canvas.Left="20.5" Canvas.Top="0.75"/> <Ellipse x:Name="ellipse3" Canvas.Left="34.75" Canvas.Top="6.75"/> <Ellipse x:Name="ellipse4" Canvas.Left="40.5" Canvas.Top="20.75" /> <Ellipse x:Name="ellipse5" Canvas.Left="34.75" Canvas.Top="34.5"/> <Ellipse x:Name="ellipse6" Canvas.Left="20.75" Canvas.Top="39.75"/> <Ellipse x:Name="ellipse7" Canvas.Top="34.25" Canvas.Left="7" /> <Ellipse Width="39.5" Height="39.5" Canvas.Left="8.75" Canvas.Top="8" Visibility="Hidden"/> </Canvas> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
上記コードをBusyAnimationStyle.xamlとして保存し、App.xamlにBusyAnimationStyle.xamlを書き込みます。
<Application x:Class="Example.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Windows\BusyAnimationStyle.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
次に、Windowのxamlに配置します。VisibilityはHiddenにしておかないと、アプリケーション起動時にいきなりBusyAnimationが有効になってしまいます。
<Window x:Class="Example.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="500" Width="500"> <Grid> <Control Name="busyAnimation" Style="{StaticResource BusyAnimationStyle}" Width="{Binding Path=Width, ElementName=MainWindow}" Visibility="Hidden"/> </Grid> </Window>
以上で準備は完了です。あとは時間のかかる処理を実行する前に下記のようにVisibilityをVisibleにすればアニメーションがスタートします。時間のかかる処理が完了した後は再度VisibilityをHiddenにすることを忘れないようにして下さい。
busyAnimation.Visibility=Visible;