OpenCVの輪郭検出関数findContours()は破壊的である。
void findContours(const Mat& image, vector >& contours, vector& hierarchy, int mode, int method, Point offset=Point())
void findContours(const Mat& image, vector >& contours, int mode, int method, Point offset=Point())
2値画像中の輪郭を検出します.
(略)
注意: 元の image は,この関数によって書き換えられます.
http://opencv.jp/opencv-2svn/cpp/imgproc_structural_analysis_and_shape_descriptors.html#cv-findcontours
これはまぁ気をつければなんとか。
一方、これをwrapしたOpenCVSharpの関数はこういうシグネチャになっているが、これも破壊的なのである。
public Point[][] FindContoursAsArray(ContourRetrieval mode, ContourChain method, Point? offset = null)
元のものが壊されたくなければ、こうすればよい。
mat.Clone().FindContoursAsArray(ContourRetrieval.External, ContourChain.ApproxSimple)
気をつけるべし。