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 の Scalar は B, G, R の順です。new Scalar(0, 0, 255) は赤、new Scalar(255, 0, 0) は青になります。RGB に慣れている方は逆になるため注意してください。
⚠️ Mat の Dispose 漏れに注意
Mat は IDisposable です。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 を使ったサブピクセル指定
shift に 4 を渡すと座標が 1/16 ピクセル単位になります。その場合は pt1・pt2 の値を 16 倍して渡す必要があります。通常用途では shift = 0(デフォルト)のままにしてください。意図せず shift に正の値を渡すと、直線が全く見えない位置に描画されることがあります。
関連する関数
- Cv2.Rectangle の使い方【OpenCV/C#】〜画像に矩形を描画する〜
- Cv2.PutText の使い方【OpenCV/C#】〜画像に文字を書き込む〜
- Mat の使い方【OpenCV/C#(OpenCvSharp)】作成・初期化・基本操作
Cv2.Circle、Cv2.Ellipse、Cv2.Polylinesなど図形描画セットの他の関数も同様のシグネチャで使えます
まとめ
Cv2.Line は始点・終点・色・太さを渡すだけで直線を描画できるシンプルな関数です。LineTypes.AntiAlias を使うと斜め線が滑らかになります。Scalar の BGR 順と Mat の using 解放だけ押さえておけば、すぐ実務で使えます。
🛠 画像処理のプロが開発するSDK/API
本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/APIを開発しています。SDK は C#/.NET 8 に正式対応しており、OpenCvSharp を使うプロジェクトからそのまま組み込めます。

