Cv2.Circle の使い方【OpenCV/C#(OpenCvSharp)】画像に円を描画する

OpenCV for C#
📌 準備: OpenCV の環境構築がまだの方はこちら → C++ 環境構築ガイドC#(OpenCvSharp)セットアップ

Cv2.Circle の使い方【OpenCV/C#(OpenCvSharp)】画像に円を描画する

Cv2.Circle は、Mat 上に円を描画する関数です。中心座標・半径・色・線幅を指定するだけで使えます。塗りつぶし円にするには線幅に -1 を渡すだけで切り替えられます。

Cv2.Circle(mat, center, radius, color, thickness);

動作環境

  • OpenCvSharp4(OpenCV 4.x 系)
  • NuGet パッケージ: OpenCvSharp4 + OpenCvSharp4.runtime.win(Windows 実行時)
  • .NET 8 コンソールアプリ想定

環境構築がまだの方は環境構築ガイドを先にどうぞ。

基本の使い方

まず、白いキャンバスに青い円を描画するシンプルなサンプルです。

using OpenCvSharp;

// 白いキャンバスを作成(500x500、BGR 3チャンネル)
using var mat = new Mat(500, 500, MatType.CV_8UC3, Scalar.White);

// 中心 (250, 250)、半径 100、青色、線幅 3 で円を描画
var center = new Point(250, 250);
int radius = 100;
var color = new Scalar(255, 0, 0); // BGR: 青
int thickness = 3;

Cv2.Circle(mat, center, radius, color, thickness);

// 結果をファイルに保存
Cv2.ImWrite("circle_basic.png", mat);

Console.WriteLine("circle_basic.png を保存しました。");

実行結果:

circle_basic.png を保存しました。

circle_basic.png を開くと、白い背景に青い円(外枠のみ)が描画されています。

コードのポイント

説明
new Mat(500, 500, MatType.CV_8UC3, Scalar.White) 白背景の 500×500 画像を生成
new Point(250, 250) 円の中心座標(x, y)
radius = 100 円の半径(ピクセル単位)
new Scalar(255, 0, 0) BGR 順で青色を指定
thickness = 3 輪郭線の太さ。-1 で塗りつぶし
Cv2.ImWrite(...) 結果を PNG ファイルに保存

引数と戻り値

void Cv2.Circle(
    InputOutputArray img,   // 描画対象の Mat
    Point center,           // 円の中心座標
    int radius,             // 半径(ピクセル)
    Scalar color,           // 描画色(BGR)
    int thickness = 1,      // 線幅。-1 で塗りつぶし
    LineTypes lineType = LineTypes.Link8,  // 線の種類
    int shift = 0           // 座標のビットシフト数(通常は 0)
)
引数 説明
img InputOutputArray 描画先の Mat(上書き)
center Point 円の中心座標
radius int 円の半径(ピクセル)
color Scalar 描画色(BGR 順)
thickness int 輪郭の線幅。-1 または LineTypes.Filled で塗りつぶし
lineType LineTypes Link8(デフォルト), Link4, AntiAlias
shift int 座標値のビットシフト(高精度描画用)。通常 0

戻り値はありません(void)。

lineType の選び方

説明
LineTypes.Link8 8連結線(デフォルト・高速)
LineTypes.Link4 4連結線
LineTypes.AntiAlias アンチエイリアス(なめらか・やや低速)

実践例

塗りつぶし円を複数描画する

検出結果の可視化やマーカー表示でよく使うパターンです。

using OpenCvSharp;

using var mat = new Mat(500, 500, MatType.CV_8UC3, Scalar.Black);

// 塗りつぶし円(thickness = -1)
var circles = new (Point center, int radius, Scalar color)[]
{
    (new Point(120, 250), 80, new Scalar(0, 0, 200)),   // 赤
    (new Point(250, 250), 80, new Scalar(0, 200, 0)),   // 緑
    (new Point(380, 250), 80, new Scalar(200, 0, 0)),   // 青
};

foreach (var (center, radius, color) in circles)
{
    Cv2.Circle(mat, center, radius, color, thickness: -1);
}

Cv2.ImWrite("circle_filled.png", mat);
Console.WriteLine("circle_filled.png を保存しました。");

thickness: -1 を指定することで塗りつぶし円になります。物体検出の結果を視覚化するときなど、中心点を目立たせたい場面で重宝します。


アンチエイリアス付きで描画する

UI や帳票出力など、見た目の品質が求められる場面では AntiAlias を使います。

using OpenCvSharp;

using var mat = new Mat(400, 400, MatType.CV_8UC3, Scalar.White);

// アンチエイリアスあり
Cv2.Circle(
    mat,
    center: new Point(200, 200),
    radius: 120,
    color: new Scalar(0, 100, 255),  // BGR: オレンジ系
    thickness: 4,
    lineType: LineTypes.AntiAlias
);

Cv2.ImWrite("circle_antialias.png", mat);
Console.WriteLine("circle_antialias.png を保存しました。");

LineTypes.AntiAlias を指定すると円の輪郭がなめらかになります。低解像度画像ではほとんど差がありませんが、高解像度画像の輪郭が目立つ場面で効果があります。


既存画像に円を重ねる(検出結果の可視化)

実務では読み込んだ画像に円を描画することが大半です。

using OpenCvSharp;

// 画像を読み込む
using var src = Cv2.ImRead("input.jpg");
if (src.Empty())
{
    Console.Error.WriteLine("画像の読み込みに失敗しました。");
    return;
}

// 画像のコピーに描画(元画像を変えたくない場合)
using var dst = src.Clone();

// 画像中央に塗りつぶし円を描画
var center = new Point(dst.Width / 2, dst.Height / 2);
Cv2.Circle(dst, center, radius: 50, color: new Scalar(0, 0, 255), thickness: -1);

Cv2.ImWrite("output.jpg", dst);
Console.WriteLine("output.jpg を保存しました。");

元画像を変更したくない場合は .Clone() でコピーしてから描画します。Cv2.ImRead についてはCv2.ImRead の使い方【OpenCV/C#(OpenCvSharp)】〜画像ファイルを読み込む〜を参照してください。

つまずきポイント

⚠️ Mat の using 忘れによるメモリリーク

Mat はネイティブメモリを管理する IDisposable です。using を付け忘れると、GC が動くまでネイティブメモリが解放されません。

// NG: using なし
var mat = new Mat(500, 500, MatType.CV_8UC3, Scalar.White);
Cv2.Circle(mat, ...);
// mat.Dispose() を呼び忘れるとリークする

// OK: using で確実に解放
using var mat = new Mat(500, 500, MatType.CV_8UC3, Scalar.White);
Cv2.Circle(mat, ...);

ループ内で Mat を生成するコードでは特に注意が必要です。

⚠️ 色の指定は BGR 順(RGB ではない)

OpenCV の ScalarBGR 順です。RGB に慣れているとチャンネルを逆に指定してしまいます。

// 赤を描画したいとき
new Scalar(0, 0, 255)   // OK: B=0, G=0, R=255
new Scalar(255, 0, 0)   // NG: これは青

Cv2.CvtColor で BGR → RGB 変換することもできますが、描画用の色指定では常に BGR を意識してください(Cv2.CvtColor の使い方も参照)。

⚠️ thickness = -1 と LineTypes.Filled は同義

塗りつぶしに LineTypes.Filled(値 = -1)を使う書き方もあります。どちらでも動作は同じです。読みやすいほうを選んでください。

Cv2.Circle(mat, center, radius, color, thickness: -1);
Cv2.Circle(mat, center, radius, color, thickness: (int)LineTypes.Filled);
// 上記 2 行は同一の結果

関連する関数

まとめ

  • Cv2.Circle は中心・半径・色・線幅を指定するだけで円を描画できる
  • thickness: -1(または LineTypes.Filled)を指定すると塗りつぶし円になる
  • LineTypes.AntiAlias でなめらかな輪郭を描画でき、品質が求められる場面に有効

🛠 画像処理のプロが開発するSDK/API

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

タイトルとURLをコピーしました