Cv2.GetTextSize の使い方【OpenCV/C#(OpenCvSharp)】〜描画する文字のサイズを測る〜

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

Cv2.GetTextSize は、Cv2.PutText で描画する文字列のピクセルサイズ(幅・高さ)を事前に取得する関数です。これを使うことで、テキストの中央揃えや背景矩形の自動サイズ調整が実現できます。

Size textSize = Cv2.GetTextSize("Hello", HersheyFonts.HersheySimplex, 1.0, 2, out int baseline);

動作環境

  • OpenCV 4.x(OpenCvSharp4)
  • .NET 8 コンソールアプリ
  • NuGet: OpenCvSharp4 + OpenCvSharp4.runtime.win(Windows 実行時)

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

基本の使い方

Cv2.GetTextSize の戻り値は文字列全体を囲む Size(幅・高さ)で、out 引数でベースラインのオフセットも同時に取得できます。

using OpenCvSharp;

// 測定対象の文字列とフォント設定
string text = "OpenCvSharp";
HersheyFonts font = HersheyFonts.HersheySimplex;
double fontScale = 1.5;
int thickness = 2;

// 文字サイズを取得
Size textSize = Cv2.GetTextSize(text, font, fontScale, thickness, out int baseline);

Console.WriteLine($"幅: {textSize.Width}, 高さ: {textSize.Height}, ベースライン: {baseline}");

実行すると次のように表示されます(フォント設定によって数値は変わります)。

幅: 248, 高さ: 36, ベースライン: 10
  • Cv2.GetTextSize の第1引数に測定したい文字列を渡します。
  • フォント・スケール・太さは Cv2.PutText に渡す値と完全に一致させる必要があります。一致しないとサイズがずれます。
  • out int baseline には、文字の最下点からベースラインまでの距離(ピクセル)が入ります。降字(g、y など)の下に出る部分の高さです。
  • 戻り値の Size.Height はベースラインより上の高さのみです。文字全体の高さが必要な場合は textSize.Height + baseline を使います。

引数と戻り値

引数 型 説明
text string サイズを測定したい文字列
fontFace HersheyFonts フォント種別(PutText に渡すものと同じ)
fontScale double フォントスケール(PutText に渡すものと同じ)
thickness int 線の太さ(PutText に渡すものと同じ)
baseLine out int ベースラインのオフセット(ピクセル)
戻り値 Size テキストを囲む矩形の幅と高さ

実践例

テキストを画像の中央に揃える

Cv2.GetTextSize の典型的なユースケースです。取得したサイズを使って描画位置を計算します。

using OpenCvSharp;

// 400x200 の黒画像を作成
using var img = new Mat(200, 400, MatType.CV_8UC3, Scalar.Black);

string text = "Centered Text";
HersheyFonts font = HersheyFonts.HersheySimplex;
double fontScale = 1.2;
int thickness = 2;

// 文字サイズを取得
Size textSize = Cv2.GetTextSize(text, font, fontScale, thickness, out int baseline);

// 中央揃えの座標を計算
// PutText の原点は文字のベースライン左端なので、Y は高さの半分を足す
int x = (img.Cols - textSize.Width) / 2;
int y = (img.Rows + textSize.Height) / 2;

Cv2.PutText(img, text, new Point(x, y), font, fontScale, Scalar.White, thickness);
Cv2.ImWrite("centered.png", img);
Console.WriteLine("centered.png を保存しました");

⚠️ Cv2.PutText の描画原点は「文字の左下(ベースライン)」です。Cv2.Rectangle などの「左上」とは異なるため、Y 座標の計算に注意してください。


背景付きラベルを描画する

画像認識の結果を重ねて表示する際によく使うパターンです。テキストサイズに合わせた背景矩形を先に描き、その上にテキストを重ねます。

using OpenCvSharp;

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

string label = "Detected: Cat  92%";
HersheyFonts font = HersheyFonts.HersheySimplex;
double fontScale = 0.8;
int thickness = 1;
int padding = 6; // 背景矩形の余白

// テキストサイズを取得
Size textSize = Cv2.GetTextSize(label, font, fontScale, thickness, out int baseline);

// テキスト描画の起点(ベースライン左端)
var origin = new Point(30, 120);

// 背景矩形の座標を計算
// 矩形は左上〜右下で指定するため、ベースラインを基準に上下に調整
var bgTopLeft = new Point(origin.X - padding, origin.Y - textSize.Height - padding);
var bgBottomRight = new Point(origin.X + textSize.Width + padding, origin.Y + baseline + padding);

// 背景矩形を塗りつぶして描画
Cv2.Rectangle(img, bgTopLeft, bgBottomRight, new Scalar(30, 144, 255), -1);

// テキストを重ねて描画
Cv2.PutText(img, label, origin, font, fontScale, Scalar.White, thickness);

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

実行すると、テキストサイズにぴったり合ったオレンジ背景のラベルが描画された label.png が生成されます。

つまずきポイント

⚠️ PutText と引数を完全に一致させないとサイズがずれる

Cv2.GetTextSize に渡す fontFace・fontScale・thickness は、Cv2.PutText に渡す値と必ず同じにしてください。thickness が 1 違うだけでも幅が数ピクセルずれ、背景矩形からテキストがはみ出します。

⚠️ PutText の原点は「左下(ベースライン)」

OpenCV のテキスト描画は、指定した Point が文字の左下(ベースライン)になります。Cv2.Rectangle や Cv2.Ellipse などの描画関数が「左上」を原点とするのとは異なります。中央揃えや背景矩形の計算でよくはまるポイントです。

⚠️ Size.Height はベースライン上の高さのみ

GetTextSize の戻り値 Size.Height は、ベースラインより上の部分の高さです。g・y のように下に伸びる降字を含む文字列を囲む場合は textSize.Height + baseline を使わないと矩形が短くなります。

関連する関数

  • Cv2.PutText — GetTextSize とセットで使うテキスト描画関数。同じ引数を渡すことでサイズが一致します。
  • Cv2.Rectangle の使い方(Cv2.Ellipse 記事内でも紹介) — 背景矩形の描画に使います。
  • Cv2.ImWrite / Cv2.ImShow — 描画結果の確認・保存に使う定番関数。

まとめ

Cv2.GetTextSize を使えば、テキスト描画前にピクセル幅・高さを取得でき、中央揃えや背景矩形のサイズ計算が正確にできます。Cv2.PutText に渡す引数と必ず揃えること、および PutText の原点が「左下」であることを押さえれば、実装上の混乱はほぼ防げます。

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

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

→ 顔認証のなりすまし対策 設計チェックリスト(当ブログ)
→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

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