Cv2.Rectangle の使い方【OpenCV/C#】〜画像に矩形を描画する〜

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

Cv2.Rectangle の使い方【OpenCV/C#】〜画像に矩形を描画する〜

Cv2.Rectangle は、Mat 画像上に矩形(長方形)を描画する関数です。バウンディングボックスの可視化や検出領域のマーキングなど、画像処理の現場で最もよく使う描画関数の一つです。

最小の呼び出しは以下のとおりです。

Cv2.Rectangle(img, new Rect(x, y, width, height), Scalar.Red, 2);

動作環境

項目 バージョン
OpenCV 4.x(OpenCV 4.x 時点の情報)
OpenCvSharp4 4.9.x 系
.NET .NET 8
OS Windows 10/11

NuGet パッケージは以下の2つを導入してください。

OpenCvSharp4
OpenCvSharp4.runtime.win

基本の使い方

using OpenCvSharp;

// 500x500 の白画像を用意
using var img = new Mat(500, 500, MatType.CV_8UC3, Scalar.White);

// 矩形を描画(塗りつぶしなし・赤・線幅2px)
Cv2.Rectangle(img, new Rect(50, 50, 200, 150), new Scalar(0, 0, 255), 2);

// 矩形を描画(塗りつぶしあり・青)
Cv2.Rectangle(img, new Rect(300, 100, 150, 200), new Scalar(255, 0, 0), -1);

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

// ウィンドウに表示
Cv2.ImShow("Rectangle Sample", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

実行すると、output.png に以下の内容が保存されます。

- 左上(50, 50)から幅200・高さ150の赤い枠線の矩形
- 左上(300, 100)から幅150・高さ200の青で塗りつぶされた矩形

コード解説

説明
new Mat(500, 500, MatType.CV_8UC3, Scalar.White) 白い3チャンネルカラー画像を生成
new Rect(50, 50, 200, 150) 左上座標(x=50, y=50)、幅200、高さ150の矩形領域
new Scalar(0, 0, 255) BGR順で赤色を指定
thickness: 2 線幅2ピクセル
thickness: -1 負の値を渡すと矩形を塗りつぶす

引数と戻り値

void Cv2.Rectangle(
    InputOutputArray img,
    Rect rect,
    Scalar color,
    int thickness = 1,
    LineTypes lineType = LineTypes.Link8,
    int shift = 0
)
引数 説明
img InputOutputArray 描画対象の画像(上書きされる)
rect Rect 矩形領域(左上座標・幅・高さ)
color Scalar 描画色(BGR順)
thickness int 線幅(px)。-1 で塗りつぶし。省略時は 1
lineType LineTypes 線の種類(Link8 / Link4 / AntiAlias)。省略時は Link8
shift int 座標のビットシフト量。通常は 0

戻り値はありません(void)。描画結果は img に直接反映されます。

Cv2.Rectangle には Rect を受け取るオーバーロードのほかに、Point pt1, Point pt2(対角の2点)を受け取るオーバーロードも存在します。

Cv2.Rectangle(img, new Point(50, 50), new Point(250, 200), Scalar.Red, 2);

実践例

物体検出結果のバウンディングボックス描画

物体検出の出力として得られた矩形リストを一括描画する典型パターンです。

using OpenCvSharp;

// 検出結果を想定した矩形リスト
var detections = new[]
{
    new Rect(30,  40, 120, 90),
    new Rect(200, 80, 150, 110),
    new Rect(380, 200, 100, 80),
};

using var img = new Mat(480, 640, MatType.CV_8UC3, Scalar.Black);

foreach (var rect in detections)
{
    // バウンディングボックスを緑で描画
    Cv2.Rectangle(img, rect, new Scalar(0, 255, 0), 2);

    // ラベルテキストを矩形の左上に重ねて表示
    Cv2.PutText(
        img,
        "Object",
        new Point(rect.X, rect.Y - 5),
        HersheyFonts.HersheySimplex,
        0.6,
        new Scalar(0, 255, 0),
        1
    );
}

Cv2.ImWrite("detections.png", img);
Cv2.ImShow("Detections", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

ROI(関心領域)を半透明ハイライトで強調

塗りつぶした矩形を AddWeighted でブレンドし、半透明の強調表示を実現します。

using OpenCvSharp;

using var src = Cv2.ImRead("input.jpg");
if (src.Empty()) throw new Exception("画像を読み込めませんでした");

using var overlay = src.Clone();

// ROI を青で塗りつぶし
var roi = new Rect(100, 80, 300, 200);
Cv2.Rectangle(overlay, roi, new Scalar(255, 100, 0), -1);

// src と overlay をアルファブレンド(alpha=0.35)
using var result = new Mat();
Cv2.AddWeighted(overlay, 0.35, src, 0.65, 0, result);

// ROI の枠線を上から描画
Cv2.Rectangle(result, roi, new Scalar(255, 100, 0), 2);

Cv2.ImWrite("highlight.png", result);
Cv2.ImShow("Highlight", result);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

つまずきポイント

⚠️ Mat の using を忘れるとネイティブメモリリークが起きる

Mat はネイティブヒープにピクセルデータを持つため、C# の GC では回収されません。using を付け忘れると、長時間動作するアプリで確実にメモリリークします。Clone() で複製した Mat も同様です。

using var img = new Mat(...);   // ✅ スコープ終了時に自動解放
var img2 = new Mat(...);        // ⚠️ Dispose を自分で呼ばないと漏れる

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

OpenCV の Scalar はチャンネル順が BGR です。「赤」を指定したいのに new Scalar(255, 0, 0) と書くと青になります。

new Scalar(0, 0, 255)   // ✅ 赤 (B=0, G=0, R=255)
new Scalar(255, 0, 0)   // ⚠️ 青 (B=255, G=0, R=0)

⚠️ 矩形が画像境界をはみ出すと例外になる

Rect の領域が Mat の範囲を超えていると実行時例外が発生します。外部入力(検出結果など)をそのまま渡す場合は、Rect.Intersect などでクリッピングしてから渡すことを推奨します。

// 画像サイズにクリップしてから描画
var clipped = new Rect(rect.X, rect.Y, rect.Width, rect.Height)
    & new Rect(0, 0, img.Width, img.Height);
if (clipped.Width > 0 && clipped.Height > 0)
    Cv2.Rectangle(img, clipped, Scalar.Green, 2);

関連する関数

  • Cv2.Line — 直線を描画する。矩形を構成する4辺を個別に制御したい場合に使う
  • Cv2.Circle — 円を描画する。バウンディングサークルの可視化に
  • Cv2.PutText — テキストを描画する。矩形と組み合わせてラベル表示する用途が多い
  • Cv2.AddWeighted — 2枚の画像をブレンドする。半透明ハイライト実装に必須

まとめ

Cv2.Rectangle は座標と色・線幅を渡すだけで矩形を描画できるシンプルな関数です。thickness = -1 で塗りつぶし、AddWeighted と組み合わせれば半透明ハイライトも実現できます。Matusing による確実な解放と BGR 順の色指定を徹底して、現場の実装に役立ててください。

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

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

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

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