PowerShellで動画を白黒でキャプチャー

| 2009年10月31日土曜日
OpenCVSharpを使用して、動画を白黒でキャプチャーする。
グレースケールの時と同じで、読み込む→グレースケールに変換→白黒に変換の順に行う。
最後に変換したものをウィンドウに表示させる。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. # カメラの情報を取得
  3. $camera = [OpenCvSharp.CvCapture]::FromCamera(0)
  4. $window = New-Object OpenCvSharp.CvWindow("SampleCapture")
  5. $threshold = 128 # 白色か黒色かのしきい値
  6. while ( [OpenCvSharp.CvWindow]::WaitKey(10) -lt 0 ) {
  7. $iplImage = $camera.QueryFrame()
  8. $srcIplImage = New-Object OpenCvSharp.IplImage( $iplImage.Size, [OpenCvSharp.BitDepth]::U8, 1)
  9. # グレースケールに変換
  10. [OpenCvSharp.Cv]::CvtColor($iplImage,$srcIplImage, [OpenCvSharp.ColorConversion]::BgraToGray)
  11. $dstIplImage = New-Object OpenCvSharp.IplImage( $srcIplImage.Size, [OpenCvSharp.BitDepth]::U8, 1)
  12. # 白黒に変換
  13. $srcIplImage.Threshold($dstIplImage, $threshold, 255, [OpenCvSharp.ThresholdType]::Binary)
  14. $window.Image = $dstIplImage
  15. }
  16. $iplImage.Dispose()
  17. $srcIplImage.Dispose()
  18. $dstIplImage.Dispose()
  19. $window.Dispose()
  20. $camera.Dispose()

PowerShellで動画をグレースケールでキャプチャー

|
OpenCVSharpを使用して、動画をグレースケールでキャプチャーする。
静止画をグレースケールにするのと同じ方法で、一度、IplImage型でWebカメラの映像を読み込んでからグレースケールに変換し、変換したものをウィンドウに表示させる。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. # カメラの情報を取得
  3. $camera = [OpenCvSharp.CvCapture]::FromCamera(0)
  4. $window = New-Object OpenCvSharp.CvWindow("SampleCapture")
  5. while ( [OpenCvSharp.CvWindow]::WaitKey(10) -lt 0 ) {
  6. $srcIplImage = $camera.QueryFrame()
  7. $dstIplImage = New-Object OpenCvSharp.IplImage( $srcIplImage.Size, [OpenCvSharp.BitDepth]::U8, 1)
  8. # グレースケールに変換
  9. [OpenCvSharp.Cv]::CvtColor($srcIplImage,$dstIplImage, [OpenCvSharp.ColorConversion]::BgraToGray)
  10. $window.Image = $dstIplImage
  11. }
  12. $srcIplImage.Dispose()
  13. $dstIplImage.Dispose()
  14. $window.Dispose()
  15. $camera.Dispose()

PowerShellで動画の顔検出をしてみる

| 2009年10月29日木曜日
OpenCvSharpを使用して、Webカメラでキャプチャーしながら顔検出をしてみる。
基本的には静止画の時と同じで、その部分のコードを動画のキャプチャーに埋め込んだだけ。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. #顔を検出するためにHaar分類器のカスケードを用いる
  3. $color = [OpenCvSharp.CvColor]::Red
  4. $scale = 1.04;
  5. $scaleFactor = 1.139;
  6. $minNeighbors = 2;
  7. $camera = [OpenCvSharp.CvCapture]::FromCamera(0)
  8. $window = New-Object OpenCvSharp.CvWindow("SampleCapture")
  9. $srcWidth = $camera.FrameWidth
  10. $srcHeight = $camera.FrameHeight
  11. $srcSize = New-Object OpenCvSharp.CvSize([int]$srcWidth, [int]$srcHeight)
  12. $srcIplImage = New-Object OpenCvSharp.IplImage( $srcSize, [OpenCvSharp.BitDepth]::U8, 1)
  13. $dstWidth = $camera.FrameWidth / $scale
  14. $dstHeight = $camera.FrameHeight / $scale
  15. $dstSize = New-Object OpenCvSharp.CvSize([int]$dstWidth, [int]$dstHeight)
  16. $dstIplImage = New-Object OpenCvSharp.IplImage( $dstSize, [OpenCvSharp.BitDepth]::U8, 1)
  17. while ( [OpenCvSharp.CvWindow]::WaitKey(10) -lt 0 ) {
  18. $iplImage = $camera.QueryFrame()
  19. #顔検出用の画像の生成
  20. [OpenCvSharp.Cv]::CvtColor($iplImage,$srcIplImage, [OpenCvSharp.ColorConversion]::BgraToGray)
  21. [OpenCvSharp.Cv]::Resize($srcIplImage, $dstIplImage, [OpenCvSharp.Interpolation]::Linear)
  22. [OpenCvSharp.Cv]::EqualizeHist($dstIplImage,$dstIplImage)
  23. $cascade = [OpenCvSharp.CvHaarClassifierCascade]::FromFile((Join-Path $pwd "haarcascade_frontalface_alt.xml"))
  24. $storage = New-Object OpenCvSharp.CvMemStorage
  25. $storage.Clear()
  26. # 顔の検出
  27. $faces = [OpenCvSharp.Cv]::HaarDetectObjects($dstIplImage, $cascade, $storage, $scaleFactor, $minNeighbors, 0, (New-Object OpenCvSharp.CvSize(30, 30)));
  28. Write-Host $faces.Total
  29. # 検出された全ての顔位置に四角い枠を描画する
  30. for ($i = 0; $i -lt $faces.Total; $i++) {
  31. $r = $faces[$i].Rect
  32. $pt1 = New-Object OpenCvSharp.CvPoint($r.x, $r.y)
  33. $pt2 = new-object OpenCvSharp.CvPoint(($r.x + $r.Width),($r.y + $r.Height ))
  34. $iplImage.Rectangle($pt1, $pt2, $color, 3, 8, 0)
  35. }
  36. # 丸で囲む
  37. # for ($i = 0; $i -lt $faces.Total; $i++) {
  38. # $r = $faces[$i].Rect
  39. # $X = [OpenCvSharp.Cv]::Round(($r.X + $r.Width * 0.5) * $Scale)
  40. # $Y = [OpenCvSharp.Cv]::Round(($r.Y + $r.Height * 0.5) * $Scale)
  41. # $center = New-Object OpenCvSharp.CvPoint($X, $Y)
  42. # $radius = [OpenCvSharp.Cv]::Round(($r.Width + $r.Height) * 0.25 * $Scale)
  43. # $iplImage.Circle($center, $radius, $color, 3, [OpenCvSharp.LineType]::AntiAlias, 0)
  44. # }
  45. # ウィンドウに表示
  46. $window.Image = $iplImage
  47. }
  48. $srcIplImage.Dispose()
  49. $dstIplImage.Dispose()
  50. $iplImage.Dispose()
  51. $window.Dispose()
  52. $camera.Dispose()

PowerShellで画像のRGBを調べてみる

| 2009年10月27日火曜日
OpenCVSharpを使用して画像のRGBを調べてみる。
下のコードは読み込んだ画像の1ピクセル?づつのRGB情報を順番に出力していくもの。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. $iplImage = [OpenCvSharp.Cv]::LoadImage((Join-Path $pwd "foo1.jpg"))
  3. for ($x = 0; $x -lt $iplImage.Width; $x++) {
  4. for ($y = 0; $y -lt $iplImage.Height; $y++) {
  5. $cvColor = [OpenCvSharp.CvColor]$iplImage.Get2D($y, $x)
  6. $line = [String]::Format("x = {0:000}, y = {1:000} : R = {2:000}, G = {3:000}, B = {4:000}", $x, $y, $cvColor.R, $cvColor.G, $cvColor.B)
  7. Write-Host $line
  8. }
  9. }
  10. $iplImage.Dispose()

PowerShellで静止画の顔検出をしてみる

| 2009年10月26日月曜日
OpenCvSharpを使用して、画像から顔を検出してみる。
顔があったらその周りを赤色の四角い枠で囲む。

顔検出には数千枚の画像ファイルから機械学習を行って、人間の顔とは?ってのを修めたデータが必要らしい…
でも、それをやるには時間がかかりすぎるので、Sampleに入っている学習済みのデータ「haarcascade_frontalface_alt.xml」を使用させてもらう。

利用させてもらっておいてどうかとは思うが、試したデータでは今一だった。
どうも余計なものまで顔と認識して検出してくる。もちろん、顔も検出してくれるからいいんだけどね。

いつものDLLと「haarcascade_frontalface_alt.xml」を同じフォルダーにコピーして、検出した元画像を「foo.jpg」として下のコードを実行する。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. # 元データ
  3. $iplImage = [OpenCvSharp.Cv]::LoadImage((Join-Path $pwd "foo.jpg"))
  4. $color = [OpenCvSharp.CvColor]::Red
  5. $scale = 1.04;
  6. $scaleFactor = 1.139;
  7. $minNeighbors = 2;
  8. $srcWidth = $iplImage.Width
  9. $srcHeight = $iplImage.Height
  10. $srcSize = New-Object OpenCvSharp.CvSize([int]$srcWidth, [int]$srcHeight)
  11. $srcIplImage = New-Object OpenCvSharp.IplImage( $srcSize, [OpenCvSharp.BitDepth]::U8, 1)
  12. $dstWidth = $iplImage.Width / $scale
  13. $dstHeight = $iplImage.Height / $scale
  14. $dstSize = New-Object OpenCvSharp.CvSize([int]$dstWidth, [int]$dstHeight)
  15. $dst1IplImage = New-Object OpenCvSharp.IplImage( $dstSize, [OpenCvSharp.BitDepth]::U8, 1)
  16. # 顔検出用の画像の生成
  17. [OpenCvSharp.Cv]::CvtColor($iplImage,$srcIplImage, [OpenCvSharp.ColorConversion]::BgraToGray)
  18. [OpenCvSharp.Cv]::Resize($srcIplImage, $dst1IplImage, [OpenCvSharp.Interpolation]::Linear)
  19. [OpenCvSharp.Cv]::EqualizeHist($dst1IplImage,$dst1IplImage)
  20. $cascade = [OpenCvSharp.CvHaarClassifierCascade]::FromFile((Join-Path $pwd "haarcascade_frontalface_alt.xml"))
  21. $storage = New-Object OpenCvSharp.CvMemStorage
  22. $storage.Clear()
  23. # 顔の検出
  24. $faces = [OpenCvSharp.Cv]::HaarDetectObjects($dst1IplImage, $cascade, $storage, $scaleFactor, $minNeighbors, 0, (New-Object OpenCvSharp.CvSize(30, 30)));
  25. # 検出された全ての顔位置に四角い枠で囲む
  26. for ($i = 0; $i -lt $faces.Total; $i++) {
  27. $r = $faces[$i].Rect
  28. $pt1 = New-Object OpenCvSharp.CvPoint($r.x, $r.y)
  29. $pt2 = new-object OpenCvSharp.CvPoint(($r.x + $r.Width),($r.y + $r.Height ))
  30. $iplImage.Rectangle($pt1, $pt2, $color, 3, 8, 0)
  31. }
  32. # 丸で囲いたい場合はこっち
  33. #for ($i = 0; $i -lt $faces.Total; $i++) {
  34. # $r = $faces[$i].Rect
  35. # $X = [OpenCvSharp.Cv]::Round(($r.X + $r.Width * 0.5) * $Scale)
  36. # $Y = [OpenCvSharp.Cv]::Round(($r.Y + $r.Height * 0.5) * $Scale)
  37. # $center = New-Object OpenCvSharp.CvPoint($X, $Y)
  38. # $radius = [OpenCvSharp.Cv]::Round(($r.Width + $r.Height) * 0.25 * $Scale)
  39. # $iplImage.Circle($center, $radius, $color, 3, [OpenCvSharp.LineType]::AntiAlias, 0)
  40. #}
  41. # 赤枠で囲ったデータを保存する
  42. $iplImage.SaveImage((Join-Path $pwd "bar.jpg"))
  43. $iplImage.Dispose()
  44. $srcIplImage.Dispose()
  45. $dst1IplImage.Dispose()

PowerShellで画像を白黒に変換する

| 2009年10月19日月曜日
OpenCVSharpを使って画像を白黒(2値化)する。
最初にグレースケールにしておいて、しきい値以下だったら白色、以上だったら黒色の二色の画像にする。
少しぼかした方が、白い部分と黒い部分が分かれるのでいいかもしれない。
ぼかさないと、ノイズが多い感じになる。
サンプルはぼかし無しで、ぼかしの部分はコメントアウトしてある。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. # グレースケールで読み込む
  3. $srcIplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg"), [OpenCvSharp.LoadMode]::GrayScale)
  4. # ソース画像と同じサイズのグレースケールで初期化する
  5. $dstIplImage = New-Object OpenCvSharp.IplImage( $srcIplImage.Size, [OpenCvSharp.BitDepth]::U8, 1)
  6. # 画像をすこしぼかすした方がいいかも
  7. #$smooth = 5
  8. #$srcIplImage.Smooth($srcIplImage, [OpenCvSharp.SmoothType]::Gaussian, $smooth)
  9. $threshold = 128 # 白色か黒色かのしきい値
  10. $srcIplImage.Threshold($dstIplImage, $threshold, 255, [OpenCvSharp.ThresholdType]::Binary)
  11. $dstIplImage.SaveImage((Join-Path $pwd "bar.jpg"))
  12. $srcIplImage.Dispose()
  13. $dstIplImage.Dispose()

PowerShellで画像をグレースケールに変換する

| 2009年10月18日日曜日
OpenCVSharpを使って画像をグレースケールにする。
グレースケールにする方法は下記の二つ。

①画像を読み込む時にグレースケールで読み込む方法。
②OpenCvSharp.IplImageオブジェクトを減色する方法。

①の方法だと一度ファイルに保存する必要があるので、Webカメラでキャプチャーしながらの解析には向かない。その時は、②を使えばいい。

まずは、①のコード
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. #グレースケールで読み込む
  3. $iplImage = [OpenCvSharp.Cv]::LoadImage((Join-Path $pwd "foo.jpg"), [OpenCvSharp.LoadMode]::GrayScale)
  4. $iplImage.SaveImage((Join-Path $pwd "bar.jpg"))
  5. $iplImage.Dispose()
続いて、②のコード
  1. [void][System.Reflection.Assembly]::LoadFrom(( Join-Path $pwd OpenCvSharp.dll))
  2. #グレースケールに変換
  3. $srcIplImage = [OpenCvSharp.Cv]::LoadImage((Join-Path $pwd "foo.jpg"))
  4. $dstIplImage = New-Object OpenCvSharp.IplImage( $srcIplImage.Size, [OpenCvSharp.BitDepth]::U8, 1)
  5. [OpenCvSharp.Cv]::CvtColor($srcIplImage,$dstIplImage, [OpenCvSharp.ColorConversion]::BgraToGray)
  6. $dstIplImage.SaveImage((Join-Path $pwd "bar.jpg"))
  7. $srcIplImage.Dispose()
  8. $dstIplImage.Dispose()

PowerShellで画像をぼかす

| 2009年10月17日土曜日
OpenCVSharpを使って画像をぼかす(平滑化する)。
たぶん、一部だけぼかすこともできるとは思うけど、やり方がわからないので、まずは全体をぼかす。

ぼかし方は五種類、OpenCvSharp.SmoothTypeで定義されている。

・ BlurNoScale
・ Blur
・ Gaussian
・ Median
・ Bilateral

そのうちの一つ「Bilateral」は例がでて使えなかった。

以下、コード
  1. [void][System.Reflection.Assembly]::LoadFrom( ( Join-Path $pwd OpenCvSharp.dll) )
  2. $smooth = 5 # ぼかし率?値が大きいほどぼかしが強い
  3. # 強い光を当てたみたいな画像になった
  4. $iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg"))
  5. $iplImage.Smooth($iplImage, [OpenCvSharp.SmoothType]::BlurNoScale, $smooth)
  6. $iplImage.SaveImage((Join-Path $pwd "BlurNoScale.jpg"))
  7. $iplImage.Dispose()
  8. # 全体的にぼゃ~って感じ
  9. $iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg"))
  10. $iplImage.Smooth($iplImage, [OpenCvSharp.SmoothType]::Blur, $smooth)
  11. $iplImage.SaveImage((Join-Path $pwd "Blur.jpg"))
  12. $iplImage.Dispose()
  13. # 全体的にぼゃっとしてるけどBlurよりははっきり
  14. $iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg"))
  15. $iplImage.Smooth($iplImage, [OpenCvSharp.SmoothType]::Gaussian, $smooth)
  16. $iplImage.SaveImage((Join-Path $pwd "Gaussian.jpg"))
  17. $iplImage.Dispose()
  18. # 油絵みたい
  19. $iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg"))
  20. $iplImage.Smooth($iplImage, [OpenCvSharp.SmoothType]::Median, $smooth)
  21. $iplImage.SaveImage((Join-Path $pwd "Median.jpg"))
  22. $iplImage.Dispose()
  23. #ぼかし方(平滑化)をBilateralにすると例外が発生してうまくいかない
  24. #$iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg"))
  25. #$iplImage.Smooth($iplImage, [OpenCvSharp.SmoothType]::Bilateral, $smooth)
  26. #$iplImage.SaveImage((Join-Path $pwd "Bilateral.jpg"))
  27. #$iplImage.Dispose()

PowerShellで画像を回転させる

|
OpenCVSharpを使って画像を回転したり反転したりしてみる。

OpenCvSharp.Cv.Flip()メソッドを使って、X軸かY軸か両軸で画像を反転させれる。

以下、コード
  1. [void][System.Reflection.Assembly]::LoadFrom( ( Join-Path $pwd OpenCvSharp.dll) )
  2. #画像を左右を入れ替える
  3. $iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg") )
  4. [OpenCvSharp.Cv]::Flip($iplImage, $iplImage, [OpenCvSharp.FlipMode]::Y )
  5. $iplImage.SaveImage((Join-Path $pwd "bar1.jpg"))
  6. $iplImage.Dispose()
  7. #画像を180度回転させる
  8. $iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg") )
  9. [OpenCvSharp.Cv]::Flip($iplImage, $iplImage, [OpenCvSharp.FlipMode]::XY )
  10. $iplImage.SaveImage((Join-Path $pwd "bar2.jpg"))
  11. $iplImage.Dispose()
  12. #画像を左右を入れ替えて180度回転させる
  13. $iplImage = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "foo.jpg") )
  14. [OpenCvSharp.Cv]::Flip($iplImage, $iplImage, [OpenCvSharp.FlipMode]::X )
  15. $iplImage.SaveImage((Join-Path $pwd "bar3.jpg"))
  16. $iplImage.Dispose()

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