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 の Scalar は BGR 順です。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.Rectangle の使い方【OpenCV/C#】〜画像に矩形を描画する〜 — 四角形を描画する
- Cv2.PutText の使い方【OpenCV/C#】〜画像に文字を書き込む〜 — 検出結果のラベルと組み合わせて使うことが多い
- Cv2.ImWrite の使い方【OpenCV/C#】〜画像をファイルに保存する〜 — 描画結果の保存
Cv2.Ellipse— 楕円を描画する(Cv2.Circleの上位互換)Cv2.Line— 直線を描画する
まとめ
Cv2.Circleは中心・半径・色・線幅を指定するだけで円を描画できるthickness: -1(またはLineTypes.Filled)を指定すると塗りつぶし円になるLineTypes.AntiAliasでなめらかな輪郭を描画でき、品質が求められる場面に有効
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

