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 パッケージ: OpenCvSharp4 と OpenCvSharp4.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 で解放が必要です。両者を混同して Scalar に using を書いてもコンパイルエラーになるだけですが、逆に Mat の using を忘れるとネイティブメモリがリークします。
関連する関数
- Cv2.Line の使い方【OpenCV/C#(OpenCvSharp)】〜画像に直線を描画する〜
- Cv2.Circle の使い方【OpenCV/C#(OpenCvSharp)】画像に円を描画する
- Cv2.Rectangle の使い方【OpenCV/C#】〜画像に矩形を描画する〜
- Cv2.CvtColor の使い方【OpenCV/C#】色空間をグレースケール・HSVに変換する
- Mat の使い方【OpenCV/C#(OpenCvSharp)】作成・初期化・基本操作
まとめ
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 を使うプロジェクトからそのまま組み込めます。

