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()