実装プロセス:
- エッジサーチ
- 輪郭検出
- 輪郭を描く
API:
- 輪郭を見つける
public static void FindContours(InputArray image, out Point[][] contours, out HierarchyIndex[] hierarchy, RetrievalModes mode, ContourApproximationModes method, Point? offset = null);
パラメータ
画像 | 入力画像、グレースケール画像 |
---|---|
輪郭 | 等高線出力 |
階層 | イメージ トポロジに関する情報を含むオプションの出力ベクトル |
モード | 輪郭探索モード |
方法 | 輪郭近似法 |
オフセット | (-10, 10) などのオプションのパラメータ offset は、輪郭点が X の負の方向に 10 ピクセル、Y の正の方向に 10 ピクセルだけオフセットされることを意味します。 |
輪郭検索モード:
- RetrievalModes.EXTERNAL - 最も外側の輪郭のみを抽出します
- RetrievalModes.LIST - すべての輪郭を抽出し、リストに配置します。
- RetrievalModes.CCOMP - すべての輪郭を抽出し、それらを 2 レベルの階層に編成します。最上層は接続されたドメインの外側の境界で、2 番目の層は穴の内側の境界です。
- RetrievalModes.TREE - すべての輪郭を抽出し、ネストされた輪郭の階層全体を再構築します。
輪郭近似法:
- ContourXXSimationModes.ApplicNone - すべての点をチェーン コード形式から点列形式に変換 (変換)
- ContourXXSimationModes.AccuSimple - 水平、垂直、対角の分割を圧縮します。つまり、この関数は端のピクセルのみを保持します。
- ContourXXSimationModes.AboutTC89L1/ContourXXSimationModes.AboutTC89KCOS - Teh-Chin チェーン近似アルゴリズムを適用します。 CV_LINK_RUNS - 1 に接続された水平フラグメントによるまったく異なる輪郭抽出アルゴリズムを使用します。このメソッドでは、CV_RETR_LIST 抽出モードのみを使用できます。
- 輪郭を描く
public static void DrawContours(InputOutputArray image, IEnumerable<IEnumerable<Point>> contours, int contourIdx, Scalar color, int thickness = 1, LineTypes lineType = LineTypes.Link8, IEnumerable<HierarchyIndex>? hierarchy = null, int maxLevel = int.MaxValue, Point? offset = null);
パラメータ
画像 | 入力画像 |
---|---|
輪郭 | 等高線出力 |
輪郭Idx | 等高線番号 |
色 | 輪郭の色 |
厚さ | 線幅 |
線種 | 線形 |
階層 | 等高線画像トポロジに関する情報 |
最大レベル | アウトラインを描画するための最大レベル |
コードデモ
private string picFile = "";
private Mat inputMat;
private Mat outMat;
private Mat displayMat;
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
if (fileDialog.ShowDialog() == DialogResult.OK)
{
picFile = fileDialog.FileName;
inputMat = Cv2.ImRead(picFile, ImreadModes.Grayscale);
displayMat = Cv2.ImRead(picFile, ImreadModes.AnyColor);
outMat = new Mat(new Size(inputMat.Cols, inputMat.Rows), inputMat.Type());
Cv2.Canny(inputMat, outMat, 30, 90);
//仅查找外轮廓
Cv2.FindContours(outMat, out OpenCvSharp.Point[][] contours,out HierarchyIndex[] outputArray, RetrievalModes.External,ContourApproximationModes.ApproxNone);
//绘制轮廓
Scalar color = new Scalar(255, 0, 0);
for (int i = 0; i < contours.Length; i++)
{
if (contours[i].Length > 100)
{
Cv2.DrawContours(displayMat,contours, i,color,5,LineTypes.Link8, outputArray, 0);
}
}
picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(inputMat);
picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(displayMat);
}
}
すべての輪郭を描く
外側の輪郭だけを描く
追記:
この場合、.NET で使用される OpenCV ライブラリはOpenCvSharp4です。