旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【Python】 "Deep Learning Prerequisites: The Numpy Stack in Python" Lecture10のメモ

udemyで無料オンラインコースがいくつかあるのですが、Numpyの無料講座を受講中です。その中で知らなかった事をメモしておきます。

www.udemy.com

1. 線形方程式はnp.linalg.solveで解ける

import numpy as np

A = np.array([[1,2], [3,4]])
b = np.array([3,4])
x = np.linalg.solve(A, b)

【Python】 "Deep Learning Prerequisites: The Numpy Stack in Python" Lecture4のメモ

udemyで無料オンラインコースがいくつかあるのですが、Numpyの無料講座を受講中です。その中で知らなかった事をメモしておきます。

www.udemy.com

1. ベクトルのユークリッドノルムの計算はnp.linalg.normで出来る

import numpy as np

vec = np.array([1, 2, 3])
norm = np.linalg.norm(vec)

【WPF】 RadioButtonをユーザーが触れないようにする

IsHitTestVisibleとIsTabStopをFalseに設定します。IsHitTestVisibleのみをFalseにした場合、Tabキーを押してRadioButtonに移動し、スペースキーを押すとRadioButtonをチェックできてしまうため、両方Falseにする必要があります。

<RadioButton Content="ReadOnlyRadioButton" IsHitTestVisible="False" IsTabStop="False"/>

【OpenCvSharp】 ポインタを利用してMatクラスの画素にアクセスする

OpenCvSharpのMatクラスを走査する時、いつもAtメソッドを利用していたのですが、ポインタを使って走査する方法を見つけたのでメモします。

gist.github.com

リンク先はカラー画像に対して走査していますが、自分はグレースケール画像を走査したかったので、その場合のコード以下のようになります。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);
}

f:id:ni4muraano:20170420211718j:plain:w200 f:id:ni4muraano:20170420212828j:plain:w200

【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);

f:id:ni4muraano:20170115110821j:plain:w200 f:id:ni4muraano:20170420211741j:plain:w200

【WPF】 時間のかかる処理を実行する時にアニメーションを表示する

アプリケーションで時間のかかる処理を実行している時に「今処理を実行中ですよ」とユーザーに知らせたい時、実行中に表示するアニメーションがあると便利です。幸いアニメーション自体は既に作成してくれている人がいるので、それを拝借します。

www.trillian.com.au

<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;