OpenCvSharp.Scalar の使い方【OpenCV/C#】色・スカラー値の型と使い方

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

OpenCvSharp.Scalar の使い方【OpenCV/C#】色・スカラー値の型と使い方

Scalar は OpenCV で色や数値を4要素のベクトルとして表す構造体です。描画関数の色指定から Mat の初期化まで、ほぼあらゆる場面で登場します。最小の使い方は次の通りです。

var red = new Scalar(0, 0, 255); // BGR順に指定(R=255)

動作環境

項目 バージョン
OpenCV 4.x 系
OpenCvSharp4 4.x 系(NuGet)
.NET 8(コンソールアプリ)
OS Windows(OpenCvSharp4.runtime.win が必要)

NuGet パッケージ: OpenCvSharp4OpenCvSharp4.runtime.win の両方をインストールしてください。

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


基本の使い方

using OpenCvSharp;

// 300×300 の黒画像を作成
using var canvas = new Mat(300, 300, MatType.CV_8UC3, Scalar.Black);

// BGR 順で色を指定(赤・緑・青・白)
var red   = new Scalar(0, 0, 255);
var green = new Scalar(0, 255, 0);
var blue  = new Scalar(255, 0, 0);
var white = Scalar.White;

// 各色で矩形を描画して色を確認
Cv2.Rectangle(canvas, new Rect(10,  10,  80, 80), red,   -1);
Cv2.Rectangle(canvas, new Rect(110, 10,  80, 80), green, -1);
Cv2.Rectangle(canvas, new Rect(210, 10,  80, 80), blue,  -1);

// グレースケール用(1チャンネル値のみ使う)
using var gray = new Mat(100, 300, MatType.CV_8UC1, new Scalar(128));

Cv2.ImShow("Scalar Demo", canvas);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

実行すると、黒いキャンバスに赤・緑・青の塗りつぶし矩形が横に並んだウィンドウが表示されます。

コード解説

行の内容 ポイント
new Scalar(0, 0, 255) コンストラクタ引数は (B, G, R) 順。RGB と逆なので注意
Scalar.Black / Scalar.White よく使う色は静的プロパティで取得できる
new Mat(..., Scalar.Black) 第4引数に Scalar を渡すと Mat 全体をその値で初期化する
new Scalar(128) 引数1つの場合は V0 のみ設定、残りは 0。グレースケール Mat に便利

引数と戻り値

コンストラクタ

シグネチャ 説明
Scalar(double v0) V0 のみ設定(グレースケール用途など)
Scalar(double v0, double v1) V0, V1 を設定
Scalar(double v0, double v1, double v2) B, G, R の3チャンネル用途
Scalar(double v0, double v1, double v2, double v3) B, G, R, A の4チャンネル用途

主要プロパティ

プロパティ 説明
Val0 double 第1要素(BGR なら B)
Val1 double 第2要素(BGR なら G)
Val2 double 第3要素(BGR なら R)
Val3 double 第4要素(アルファなど)

よく使う静的プロパティ(OpenCV 4.x 時点)

プロパティ 値 (B,G,R)
Scalar.Black (0, 0, 0)
Scalar.White (255, 255, 255)
Scalar.Red (0, 0, 255)
Scalar.Green (0, 255, 0)
Scalar.Blue (255, 0, 0)

実践例

① 描画関数への色指定まとめ

描画関数(Line・Circle・Rectangle・PutText)はすべて Scalar で色を受け取ります。

using OpenCvSharp;

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

// 直線
Cv2.Line(img, new Point(0, 0), new Point(400, 400), new Scalar(0, 255, 255), 3);

// 円(塗りつぶし: thickness = -1)
Cv2.Circle(img, new Point(200, 200), 80, new Scalar(255, 0, 255), -1);

// 矩形(枠線のみ)
Cv2.Rectangle(img, new Rect(50, 50, 300, 300), new Scalar(0, 200, 0), 2);

// テキスト
Cv2.PutText(img, "Hello OpenCV", new Point(60, 360),
    HersheyFonts.HersheySimplex, 1.0, Scalar.White, 2);

Cv2.ImShow("Drawing", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

実行すると、黒地にシアンの斜線・マゼンタの塗り円・緑の矩形枠・白いテキストが描画されたウィンドウが表示されます。


② Mat.SetTo で画像領域を特定色で塗りつぶす

using OpenCvSharp;

using var img = new Mat(300, 300, MatType.CV_8UC3, Scalar.White);

// ROI(関心領域)を指定して特定色で塗りつぶす
using var roi = new Mat(img, new Rect(50, 50, 200, 200));
roi.SetTo(new Scalar(0, 128, 255)); // オレンジ系

Cv2.ImShow("SetTo Demo", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

Mat.SetTo(Scalar) を使うと、マスクなしで Mat 全体(または ROI)を指定値で一括置換できます。背景の初期化やデバッグ用の塗りつぶしに便利です。


③ Cv2.InRange でのスカラー範囲指定(色抽出)

HSV 変換後に特定色相を抽出する場面でも Scalar が活躍します。

using OpenCvSharp;

using var src = Cv2.ImRead("input.jpg");
using var hsv = new Mat();
using var mask = new Mat();

Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);

// 赤系の色相範囲(HSV)を Scalar で指定
var lower = new Scalar(0, 120, 70);
var upper = new Scalar(10, 255, 255);
Cv2.InRange(hsv, lower, upper, mask);

Cv2.ImShow("Mask", mask);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

Cv2.InRange の第2・第3引数はそれぞれ下限・上限の Scalar です。各チャンネルの範囲を個別に指定できます。


つまずきポイント

⚠️ BGR 順を RGB と間違える

OpenCV の色順は BGR です。赤を指定したいときに new Scalar(255, 0, 0) と書くと青になります。必ず new Scalar(B, G, R) の順を意識してください。

// ✅ 赤
var red = new Scalar(0, 0, 255);

// ❌ 青になってしまう
var wrong = new Scalar(255, 0, 0);

⚠️ グレースケール Mat に3チャンネルの Scalar を渡す

CV_8UC1(1チャンネル)の Mat に対して描画する場合、Scalar の V0 のみが使われます。new Scalar(128) のように1引数で書くのが意図を明確にするベストプラクティスです。3要素で書いても動作しますが、混乱を招きやすいです。

⚠️ Scalar 自体は IDisposable ではない

Scalar は値型(struct)なので using は不要です。一方、Mat は必ず using で解放が必要です。両者を混同して Scalarusing を書いてもコンパイルエラーになるだけですが、逆に Matusing を忘れるとネイティブメモリがリークします。


関連する関数


まとめ

  • Scalar(B, G, R) 順の4要素構造体で、描画関数・Mat 初期化・範囲指定など OpenCV 全般で使う。
  • よく使う色は Scalar.Red / Scalar.White などの静的プロパティで簡潔に書ける。
  • Scalar 自体は値型なので using 不要だが、組み合わせて使う Mat は必ず using で解放する。

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

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

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

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