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

| 2009年11月14日土曜日
OpenCVSharpを使用して画像の中の輪郭?色の境界?を検出する。
処理のイメージは、画像の中心からいっぱいに一つの丸を描いて輪郭が出てくるまで徐々に狭めていく。
どれくらいまで敏感に輪郭に反応するかは、

$tremCriteria = New-Object OpenCvSharp.CvTermCriteria(270)

の値を大きくすれば、よりはっきりと囲まれる。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. # グレースケールで読み込む
  3. $srcIplImage = [OpenCvSharp.Cv]::LoadImage((Join-Path $pwd "src.jpg"), [OpenCvSharp.LoadMode]::GrayScale)
  4. $dstIplImage = New-Object OpenCvSharp.IplImage($srcIplImage.Size, [OpenCvSharp.BitDepth]::U8, 3)
  5. [OpenCvSharp.CvPoint[]]$contour = New-Object OpenCvSharp.CvPoint[] 100
  6. # 中心点
  7. $center = New-Object OpenCvSharp.CvPoint(($srcIplImage.Width / 2), ($srcIplImage.Height / 2))
  8. # 全体をかこむ丸を作る
  9. for ($i = 0; $i -lt $contour.Length; $i++) {
  10. $contour[$i] = New-Object OpenCvSharp.CvPoint([int]($center.X * [System.Math]::Cos(2 * [System.Math]::PI * $i / $contour.Length) + $center.X), [int]($center.Y * [System.Math]::Sin(2 * [System.Math]::PI * $i / $contour.Length) + $center.Y))
  11. }
  12. $size = New-Object OpenCvSharp.CvSize(15, 15)
  13. $tremCriteria = New-Object OpenCvSharp.CvTermCriteria(270)
  14. $alpha = [System.Single]0.45
  15. $beta = [System.Single]0.35
  16. $gamma = [System.Single]0.2
  17. # 輪郭を検出
  18. $srcIplImage.SnakeImage($contour, $alpha, $beta, $gamma, $size, $tremCriteria, $true)
  19. [OpenCvSharp.Cv]::CvtColor($srcIplImage, $dstIplImage, [OpenCvSharp.ColorConversion]::GrayToRgb)
  20. # 赤で輪郭を描く
  21. $color = [OpenCvSharp.CvColor]::Red
  22. for ($i = 0; $i -lt ($contour.Length - 1); $i++) {
  23. $dstIplImage.Line($contour[$i], $contour[($i + 1)], $color, 2)
  24. }
  25. $dstIplImage.Line($contour[($contour.Length -1)], $contour[0], $color, 2)
  26. $dstIplImage.SaveImage((Join-Path $pwd "dst.jpg"))
  27. $srcIplImage.Dispose()
  28. $dstIplImage.Dispose()

0 コメント: