OpenCV
OpenCvSharp

OpenCVSharpのFindContoursAsArray()は破壊的である

More than 3 years have passed since last update.

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の関数はこういうシグネチャになっているが、これも破壊的なのである。
csharp
public Point[][] FindContoursAsArray(ContourRetrieval mode, ContourChain method, Point? offset = null)

元のものが壊されたくなければ、こうすればよい。
csharp
mat.Clone().FindContoursAsArray(ContourRetrieval.External, ContourChain.ApproxSimple)

気をつけるべし。