この記事はOpenCV Advent Calendar 2015の9日目の記事です。初めてこういうのに参加します。
目次
- 筆者の環境
- ネタ概要
- C++/CLIによるラッパークラス
- メモリ不足になるシーン
- メモリ使用量を見てみる
- MatAllocatorを自作する
- MatAllocatorについて
- 自作してどうする?
- 作ってみた
- ManagedAllocatorをcv::Matに使わせる
- 試す
- おわりに
- (参考)別の方法
狭いスコープでusing
しておくのは大事だなと再認識。
byte[] original = File.ReadAllBytes(@"C:\Windows\explorer.exe"); var memory = new System.IO.MemoryStream(); var gzip = new System.IO.Compression.GZipStream( memory, System.IO.Compression.CompressionMode.Compress); gzip.Write(original, 0, original.Length); byte[] deflated = memory.ToArray(); Console.WriteLine(deflated.Length); // 1712138
それらしい結果ですが、壊れています。
byte[] original = File.ReadAllBytes(@"C:\Windows\explorer.exe"); var memory = new System.IO.MemoryStream(); var gzip = new System.IO.Compression.GZipStream( memory, System.IO.Compression.CompressionMode.Compress); gzip.Write(original, 0, original.Length); gzip.Dispose(); // !!! byte[] deflated = memory.ToArray(); Console.WriteLine(deflated.Length); // 1727359
Length
が変わりました。なお環境はWindows10 x64です。
Dispose (Close)せずにFlush
でも同じ効果かと思いましたが、変化は見られませんでした。
ラベリング3度目です。好きですね。露骨に作者の需要が現れています。
OpenCV3.0では、cv::connectedComponents
という待望のラベリング(連結成分の抽出)関数が追加されました。
この関数を3.0.0.20150819版以降のラッパーでサポートしましたので、それを紹介します。
好みかもしれませんが、素のcv::connectedComponents
は、あまり使いやすい設計とは思えません。そこで、昔から添付しているOpenCvSharp.Blob
に使い勝手を近づけたラッパーも作成しました。それも紹介します。
またまただいぶ間隔が空いてしまいすみません・・・
前回の記事(http://schima.hatenablog.com/entry/2014/09/08/220420)で罵詈雑言を浴びせたOpenCV3.0にOpenCvSharpをひとまず対応させました。
以下、簡潔に変更点・注意点を示していきます。
続きを読む