Windows 10 IoT Core on Raspberry PI2のWebCam接続が確認できたので、一筆。
PCとUSBで接続可能なWebCamがあれば、定期的に画像を記録する仕掛けは簡単にできますね。しかしそのためにずっとPCを一台動かしているのはなんだか無駄。じゃあRaspberry PI2使おう…しかし、ずっと画像を蓄積続けるためにはストレージが足りないね…ということで、Microsoft AzureのBlob ストレージに貯めよう。そうすればセキュアに遠隔から画像も取り出せるし…
ということで、やり方をざっくり紹介。
まず、Visual Studio 2015で、新規プロジェクトを作成します。テンプレートは、Visual C#→Windows→ユニバーサル→空白のアプリを使います。プロジェクトができたら、MainPage.xamlの<Grid>...</Grid>を
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Canvas Grid.Row="1" x:Name="canvasPicture" Margin="5">
<CaptureElement x:Name="previewElement"/>
</Canvas>
</Grid>
のように、CanvasとCaptureElementタグを追加します。WebCamの画像はいったんこのCaptureElementに割り付けます。
次に、AzureのBlobにアクセスするために、Azure Storage SDKをインストールします。ソリューションエクスプローラーで参照を右クリックして、NuGetパッケージの管理を選択、Azure Storage SDKと検索窓に入力し、表示されたらインストールしてください。
そして、MainPage.xaml.csを開き、
publicsealedpartialclassMainPage : Page
{
public MainPage()
{
this.InitializeComponent();
this.Loaded += MainPage_Loaded;
}
MediaCapture mediaCaptureManager;
StorageFile photoStorageFile;
string capturedPhotoFile = "CapturedPhoto.jpg";
privateasyncvoid MainPage_Loaded(object sender, RoutedEventArgs e)
{
mediaCaptureManager = new MediaCapture();
try
{
await mediaCaptureManager.InitializeAsync();
previewElement.Source = mediaCaptureManager;
await mediaCaptureManager.StartPreviewAsync();
InitializeTimer();
uploadTimer.Start();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
DispatcherTimer uploadTimer;
privatevoid InitializeTimer()
{
if (uploadTimer == null)
{
uploadTimer = new DispatcherTimer();
int intervalMin = 15;
uploadTimer.Interval =TimeSpan.FromMinutes(intervalMin);
uploadTimer.Tick += (o, s) =>
{
UploadPhoto();
};
}
}
privatestring storageAccountName = "[storage name]";
privatestring storageAccountKey = "[storage access key]";
privateasyncvoid UploadPhoto()
{
uploadTimer.Stop();
photoStorageFile = await Windows.Storage.KnownFolders.PicturesLibrary.CreateFileAsync(capturedPhotoFile, Windows.Storage.CreationCollisionOption.GenerateUniqueName);
ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();
try
{
await mediaCaptureManager.CapturePhotoToStorageFileAsync(imageProperties, photoStorageFile);
var cloudStorageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=" + storageAccountName + ";AccountKey=" + storageAccountKey);
var blobClient = cloudStorageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference("photos");
await container.CreateIfNotExistsAsync();
var fileName = "photo" + DateTime.Now.ToString("yyyyMMdd-hh:mm::ss-fff") + ".jpg";
var blockBlob = container.GetBlockBlobReference(fileName);
await blockBlob.UploadFromFileAsync(photoStorageFile);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
uploadTimer.Start();
}
と、MainPageクラスの内容を書き換えます。名前空間が一部足りないのでusing宣言を適宜加えてください。storageAccountNameとstorageAccountKeyは、AzureのポータルでStorageを作成して取得してください。
あとは、Package.appxmanifestをコードで開くで開き(もしソリューションエクスプローラーで開けなければ、メモ帳などで開いてください。)、以下のように<Capability>タグに使用する機能を追加宣言します。
<Capabilities>
<Capability Name="internetClient"/>
<uap:Capability Name="picturesLibrary" />
<DeviceCapability Name="microphone" />
<DeviceCapability Name="webcam" />
</Capabilities>
これでOK.すべて完了。15分ごとにAzureのBlobストレージにアップロードします。センサーで計測しながら画像を蓄積しておけば、センサーがある値を記録した時に何が起こっていたかを記録することができるわけです。ちなみにこのコード、ユニバーサルアプリで作っているので、Windows10 の普通のPCでも動きます。WebCam持っている人ぜひお試しを。
※WebCamの中にはWin10IoTCore Raspberry Pi2に対応していない機種もあるのでご注意。
なおこの投稿の詳細な手順は、今後、http://aka.ms/IoTKitHoLにて公開しますんで、ご期待ください。