PowerShellで動画を再生する

| 2009年10月15日木曜日
前回保存した動画ファイルをOpenCVSharpを使って再生する。

今回も下記の5個のDLLが必要になるので、同じフォルダにコピーしておく。

・cv200.dll
・cxcore200.dll
・highgui200.dll
・opencv_ffmpeg200.dll
・OpenCvSharp.dll

Webカメラの映像を表示するのとあまり違いはなくて、単に読み込む対象がWebカメラからファイルに変えるだけで再生を行うことができる。
では、実際のコード
  1. [void][System.Reflection.Assembly]::LoadFrom( ( Join-Path $pwd OpenCvSharp.dll) )
  2. # 同じフォルダにある「foo.avi」を読み込む
  3. $aviFile = [OpenCvSharp.CvCapture]::FromFile( (Join-Path $pwd "foo.avi") )
  4. $window = New-Object OpenCvSharp.CvWindow("SamplePlayer")
  5. #読み込んだファイルのフレーム数分だけ再生したら終了する
  6. 0..$aviFile.FrameCount | % {
  7. [OpenCvSharp.CvWindow]::WaitKey(10)
  8. $window.Image = $aviFile.QueryFrame()
  9. }
  10. $window.Dispose()
  11. $aviFile.Dispose()

PowerShellでWebカメラの映像を保存する

| 2009年10月14日水曜日
OpenCVSharpを使ってWebカメラの映像を動画ファイルで保存してみる。
動画の保存は、OpenCVSharpのサンプルで「VideoWriter.cs」というのがあるのでそれを参考にする。

今回は、OpenCVSharpとサンプルに入っている下記の5個のDLLが必要になる。

・cv200.dll
・cxcore200.dll
・highgui200.dll
・opencv_ffmpeg200.dll
・OpenCvSharp.dll

これらのDLLを同じフォルダにコピーしておく。
サンプルでは200フレーム分を保存している。
実際のコードは以下
  1. [void][System.Reflection.Assembly]::LoadFrom( ( Join-Path $pwd OpenCvSharp.dll) )
  2. $camera = [OpenCvSharp.CvCapture]::FromCamera(0)
  3. $size = New-Object OpenCvSharp.CvSize($camera.FrameWidth, $camera.FrameHeight)
  4. # 「foo.avi」で保存する
  5. $videoWriter = New-Object OpenCvSharp.CvVideoWriter("foo.avi","XVID", 15, $size)
  6. $font = New-Object OpenCvSharp.CvFont([OpenCvSharp.FontFace]::HersheyComplex, 0.7, 0.7)
  7. $point = New-Object OpenCvSharp.CvPoint(10,20)
  8. $color = New-Object OpenCvSharp.CvColor(0,255,100)
  9. # (1) 画面に表示しなくてよければ、必要ない
  10. $window = New-Object OpenCvSharp.CvWindow("Capture", [OpenCvSharp.WindowMode]::AutoSize)
  11. # 200フレーム分キャプチャーする
  12. 1..200 | % {
  13. [OpenCvSharp.CvWindow]::WaitKey(10)
  14. $frame = $camera.QueryFrame()
  15. $str = [String]::Format("{0}[frame]",$_)
  16. # 左上に緑色でフレーム数が表示される
  17. $frame.PutText($str, $point, $font, $color)
  18. $videoWriter.WriteFrame($frame)
  19. $window.ShowImage($frame) # (1)
  20. }
  21. $frame.Dispose()
  22. $window.Dispose() # (1)
  23. $videoWriter.Dispose()
  24. $camera.Dispose()

PowerShellからWebカメラを使って静止画をキャプチャーする

|
OpenCVSharpを使って、WebカメラでJpeg形式の静止画を撮影する。
まずは、前回、前々回と同じようにDLLを同じフォルダに置いておく。

今回は、コマンドラインから直接入力してもOK。
(.ps1ファイルにした方が楽だろうけど…)

動作としては、Webカメラの映像を取得して、20フレーム目を静止画として保存している。
ここでは、「foo.jpg」という名前で同じフォルダに保存している。

実際のコードは以下
  1. [void][System.Reflection.Assembly]::LoadFrom( ( Join-Path $pwd OpenCvSharp.dll) )
  2. # Webカメラを取得する。
  3. $camera = [OpenCvSharp.CvCapture]::FromCamera(0)
  4. # 撮影する静止画のサイズを指定する。
  5. # デフォルトサイズ?でよければ、指定しなくてもいい。
  6. $camera.FrameWidth = 640
  7. $camera.FrameHeight = 480
  8. # 起動して直ぐのは、真っ白だったり、暗かったりするから、20フレームくらい撮る。
  9. # 戻り値は OpenCvSharp.IplImage型
  10. 1..20 | % { $iplImage = $camera.QueryFrame() }
  11. # OpenCvSharp.IplImage型をSystem.Drawing.Bitmap型へ変換する
  12. $bmp = [OpenCvSharp.BitmapConverter]::ToBitmap($iplImage)
  13. # Jpegで保存する。
  14. $bmp.Save((Join-Path $pwd "foo.jpg"), [System.Drawing.Imaging.ImageFormat]::Jpeg)
  15. $bmp.Dispose()
  16. $iplImage.Dispose()

PowerShellからWebカメラを使ってみる

| 2009年10月10日土曜日
OpenCVSharpを使用して、Webカメラの映像を表示させてみる。
Sampleの中に「CaptureCamera.cs」っというのがあるので、それをPowerShellで書く。

前回と同じように、同じフォルダにDLLを置いてから下のコードを実行する。
PowerShellで直接コードを入力しても動かない(理由がわからないけど…)ので、ファイルに保存してから実行する。
実行するとウィンドウにカメラの映像が表示される。終了する時は、右上の×をクリックしても終わらないので、アクティブな状態にしておいてキーボードの「q」を押すと終了できる。

-- CaptureCamera.ps1 --
  1. [void][System.Reflection.Assembly]::LoadFrom( ( Join-Path $pwd OpenCvSharp.dll) )
  2. $cap = [OpenCvSharp.CvCapture]::FromCamera(0)
  3. $w = New-Object OpenCvSharp.CvWindow("SampleCapture")
  4. while ( [OpenCvSharp.CvWindow]::WaitKey(10) -lt 0 ) {
  5. $w.Image = $cap.QueryFrame()
  6. }

PowerShellからOpenCVSharpを使ってみる

| 2009年10月9日金曜日
PowerShellで画像処理なるものをやってみたいので、まずはここを参考にOpenCVSharpを使ってみる。

なにはともあれ、DLLが必要なのでOpenCVSharpのダウンロードページから下の2つを落としてくる。

・OpenCvSharp-Jp-2.0-20091007.zip
・Sample-2.0-20091007.zip

どちらも、展開して今回必要な4つのDLLを適当なフォルダにコピーする。

[Sampleの方に入っているOpenCVのDLL]
・cv200.dll
・cxcore200.dll
・highgui200.dll

[OpenCVSharpの方に入っているDLL]
・OpenCvSharp.dll

コピーしたフォルダに移動して下のコードを実行する。
小さなウィンドウが表示されればOK。
  1. [void][System.Reflection.Assembly]::LoadFrom( ( Join-Path $pwd OpenCvSharp.dll) )
  2. $size = New-Object OpenCvSharp.CvSize(128, 128)
  3. $img = [OpenCvSharp.Cv]::CreateImage($size, [OpenCvSharp.BitDepth]::U8, 1)
  4. for ($y = 0; $y -lt $img.Height; $y++) {
  5. for ($x = 0; $x -lt $img.Width; $x++) {
  6. [OpenCvSharp.Cv]::Set2D($img, $y, $x, $x + $y)
  7. }
  8. }
  9. [OpenCvSharp.Cv]::NamedWindow("window")
  10. [OpenCvSharp.Cv]::ShowImage("window", $img)
  11. [OpenCvSharp.Cv]::WaitKey()
  12. [OpenCvSharp.Cv]::DestroyWindow("window")
  13. [OpenCvSharp.Cv]::ReleaseImage($img)

PowerShellで8.3形式の短いファイル名を取得する

| 2009年10月1日木曜日
短いファイル名を取得するには、kernel32.dllのGetShortPathNameメソッドを呼べばわかるんだけど、それをPowerShellからやると面倒そうなので、Scripting.FileSystemObjectを利用してみる。

ここでは、Excelの実行ファイルを取得してみる。


> $fso = New-Object -comObject Scripting.FileSystemObject
> $fso.GetFile("C:\Program Files\Microsoft Office\Office12\EXCEL.EXE")

Path : C:\Program Files\Microsoft Office\Office12\EXCEL.EXE
Name : EXCEL.EXE
ShortPath : C:\PROGRA~1\MICROS~2\Office12\EXCEL.EXE
ShortName : EXCEL.EXE
Drive : System.__ComObject
ParentFolder : System.__ComObject
Attributes : 32
DateCreated : 2009/05/04 8:40:04
DateLastModified : 2009/05/04 8:40:04
DateLastAccessed : 2009/06/11 7:18:21
Size : 18333536
Type : アプリケーション


> ($fso.GetFile("C:\Program Files\Microsoft Office\Office12\EXCEL.EXE")).ShortPath

C:\PROGRA~1\MICROS~2\Office12\EXCEL.EXE


短いファイル名を取得したかった理由はレジストリに設定するためだったのでこれで十分いけそうだ。

VBScriptでネットワークドライブを使う

|
ドライブ名を”なし”で使いたかったので、MapNetworkDriveメソッドの最初の引数は空にする。

Dim objNet
Set objNet = WScript.CreateObject("WScript.Network")
objNet.MapNetworkDrive "", "\\ServerName", True, "UserName", "Password"

切断するのはRemoveNetworkDriveメソッドで行う。

objNet.RemoveNetworkDrive "\\ServerName", True, True