PowerShellで静止画の差分をとる

| 2009年11月13日金曜日
OpenCVSharpを使用して二つの画像から差分をとって保存してみる。

同じ背景の画像を撮影して、一回目に撮ったものと二回目に撮ったものの差分をとる。
差分画像は、違う部分に色が付いていて、まったく同じ部分は黒で表示される。
ただ、それをそのまま見てもわかりにくかったので、二極化して白黒にした。
白黒にすると差分の部分だけが白くなるので見た目にわかりやすい。

ここでは、差分処理がどう動くのかを知りたかったので、差分画像を保存してから、それを読み込んで白黒にしてみた。
そのまま保存した画像と比較して見るとわかりやすいと思う。
  1. [void][System.Reflection.Assembly]::LoadFrom((Join-Path $pwd OpenCvSharp.dll))
  2. # 背景画像
  3. $srcIplImage1 = [OpenCvSharp.Cv]::LoadImage((Join-Path $pwd "a.jpg"))
  4. # 背景の前に何か写した画像
  5. $srcIplImage2 = [OpenCvSharp.Cv]::LoadImage((Join-Path $pwd "b.jpg"))
  6. # 差分出力先
  7. $dstIplImage1 = New-Object OpenCvSharp.IplImage($srcIplImage1.Size, $srcIplImage1.Depth, $srcIplImage1.NChannels)
  8. # 差分をとる
  9. [OpenCvSharp.Cv]::AbsDiff($srcIplImage1, $srcIplImage2, $dstIplImage1)
  10. # 差分の画像を保存 変わらなかったところは黒
  11. $dstIplImage1.SaveImage((Join-Path $pwd "c.jpg"))
  12. $srcIplImage1.Dispose()
  13. $srcIplImage2.Dispose()
  14. $dstIplImage1.Dispose()
  15. # 2極化して白黒にした方がわかりやすい
  16. # 差分の部分だけが白くなる
  17. $srcIplImage3 = [OpenCvSharp.Cv]::LoadImage( (Join-Path $pwd "c.jpg"), [OpenCvSharp.LoadMode]::GrayScale)
  18. $dstIplImage2 = New-Object OpenCvSharp.IplImage( $srcIplImage3.Size, $srcIplImage3.Depth, 1)
  19. $srcIplImage3.Threshold($dstIplImage2, 128, 255, [OpenCvSharp.ThresholdType]::Binary)
  20. $dstIplImage2.SaveImage((Join-Path $pwd "d.jpg"))
  21. $srcIplImage3.Dispose()
  22. $dstIplImage2.Dispose()

0 コメント: