Cv2.Line の使い方【OpenCV/C#(OpenCvSharp)】〜画像に直線を描画する〜

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

Cv2.Line は、Mat 上に2点間の直線を描画する関数です。座標・色・太さ・線種を指定するだけで使えます。最小の呼び出しは次のとおりです。

Cv2.Line(img, new Point(50, 50), new Point(200, 200), Scalar.Red, thickness: 2);

動作環境

  • OpenCV 4.x 系(OpenCvSharp4)
  • .NET 8 コンソールアプリ(トップレベルステートメント)
  • NuGet: OpenCvSharp4 + OpenCvSharp4.runtime.win(Windows 実行時)

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


基本の使い方

次のプログラムは、黒い背景に3種類の直線を描画して PNG に保存します。

using OpenCvSharp;

// 500×500 の黒画像(3チャネル)を作成
using var img = new Mat(500, 500, MatType.CV_8UC3, Scalar.Black);

// 白い直線(デフォルト線種: 8連結)
Cv2.Line(img,
    pt1: new Point(50, 100),
    pt2: new Point(450, 100),
    color: Scalar.White,
    thickness: 2,
    lineType: LineTypes.Link8);

// 赤い太線(アンチエイリアス)
Cv2.Line(img,
    pt1: new Point(50, 250),
    pt2: new Point(450, 250),
    color: new Scalar(0, 0, 255),   // BGR順: 赤
    thickness: 6,
    lineType: LineTypes.AntiAlias);

// 緑の破線風に見える細線(4連結)
Cv2.Line(img,
    pt1: new Point(50, 400),
    pt2: new Point(450, 400),
    color: new Scalar(0, 255, 0),   // BGR順: 緑
    thickness: 1,
    lineType: LineTypes.Link4);

// ファイルに保存
Cv2.ImWrite("line_sample.png", img);

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

実行すると line_sample.png が出力され、コンソールに次が表示されます。

line_sample.png を保存しました

コード解説

ポイント
new Mat(500, 500, ...) 描画先の Mat を生成。using で確実に解放する
new Point(x, y) 始点・終点の座標。左上が原点、X が右方向、Y が下方向
Scalar.White / Scalar.Red 定義済み Scalar。カスタム色は new Scalar(B, G, R) の BGR 順で指定
LineTypes.AntiAlias ガウシアンフィルタによるアンチエイリアス。斜め線が滑らかになる
Cv2.ImWrite 結果を PNG として保存。詳細は Cv2.ImWrite の使い方 を参照

引数と戻り値

void Cv2.Line(
    InputOutputArray  img,
    Point             pt1,
    Point             pt2,
    Scalar            color,
    int               thickness = 1,
    LineTypes         lineType  = LineTypes.Link8,
    int               shift     = 0
)
引数 説明
img InputOutputArray 描画対象の Mat(書き換えられる)
pt1 Point 直線の始点(ピクセル座標)
pt2 Point 直線の終点(ピクセル座標)
color Scalar 線の色(BGR 順)
thickness int 線の太さ(ピクセル)。デフォルト 1
lineType LineTypes 線種。Link8(8連結)/ Link4(4連結)/ AntiAlias
shift int 座標のビットシフト数。サブピクセル描画に使う。通常は 0

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

LineTypes の選び方

用途
LineTypes.Link8 一般用途。既定値
LineTypes.Link4 細く描きたい場合
LineTypes.AntiAlias 斜め線を滑らかに見せたい場合

実践例

1. 格子線を描画する

画像に一定間隔の水平・垂直の格子線を引きます。計測やキャリブレーション画像の生成によく使います。

using OpenCvSharp;

const int W = 400, H = 400, Step = 40;
using var grid = new Mat(H, W, MatType.CV_8UC3, Scalar.Black);

var lineColor = new Scalar(64, 64, 64); // 暗いグレー

// 垂直線
for (int x = 0; x <= W; x += Step)
    Cv2.Line(grid, new Point(x, 0), new Point(x, H), lineColor, 1);

// 水平線
for (int y = 0; y <= H; y += Step)
    Cv2.Line(grid, new Point(0, y), new Point(W, y), lineColor, 1);

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

2. 検出結果の可視化(バウンディングボックス+対角線)

矩形検出の結果に対して、中心を示す対角線を重ねる例です。

using OpenCvSharp;

// 640×480 の白い検証画像を用意
using var canvas = new Mat(480, 640, MatType.CV_8UC3, Scalar.White);

// 仮のバウンディングボックス
var roi = new Rect(100, 80, 200, 150);

// 矩形を描画(Cv2.Rectangle と組み合わせる例)
Cv2.Rectangle(canvas, roi, new Scalar(0, 200, 0), 2);

// 対角線を2本引いて中心を示す
Cv2.Line(canvas,
    new Point(roi.X, roi.Y),
    new Point(roi.X + roi.Width, roi.Y + roi.Height),
    new Scalar(0, 0, 255), 1, LineTypes.AntiAlias);

Cv2.Line(canvas,
    new Point(roi.X + roi.Width, roi.Y),
    new Point(roi.X, roi.Y + roi.Height),
    new Scalar(0, 0, 255), 1, LineTypes.AntiAlias);

Cv2.ImWrite("bbox_cross.png", canvas);
Console.WriteLine("bbox_cross.png を保存しました");

Cv2.Rectangle の使い方 と組み合わせると、検出結果の可視化が手軽にできます。


つまずきポイント

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

OpenCV の ScalarB, G, R の順です。new Scalar(0, 0, 255) は赤、new Scalar(255, 0, 0) は青になります。RGB に慣れている方は逆になるため注意してください。

⚠️ Mat の Dispose 漏れに注意

MatIDisposable です。using を付け忘れると、ネイティブ側のメモリが即座に解放されません。長時間動作するアプリでは確実にリークします。短いサンプルでも using を徹底する習慣をつけてください。

// NG: Dispose されない
var img = new Mat(500, 500, MatType.CV_8UC3, Scalar.Black);

// OK: スコープを抜けると自動 Dispose
using var img = new Mat(500, 500, MatType.CV_8UC3, Scalar.Black);

⚠️ shift を使ったサブピクセル指定

shift4 を渡すと座標が 1/16 ピクセル単位になります。その場合は pt1pt2 の値を 16 倍して渡す必要があります。通常用途では shift = 0(デフォルト)のままにしてください。意図せず shift に正の値を渡すと、直線が全く見えない位置に描画されることがあります。


関連する関数


まとめ

Cv2.Line は始点・終点・色・太さを渡すだけで直線を描画できるシンプルな関数です。LineTypes.AntiAlias を使うと斜め線が滑らかになります。Scalar の BGR 順と Matusing 解放だけ押さえておけば、すぐ実務で使えます。

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

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

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

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