【Python・OpenCV】輪郭の長さを測る(cv2.arcLength)

※当サイトではアフィリエイト広告を利用しています

Python プログラミング 画像処理

【Python・OpenCV】輪郭の長さを測る(cv2.arcLength)

2024-09-16

はじめに

OpenCVでは輪郭(contour)に関連する処理を行うための多くの機能を提供しています。
この記事では、輪郭の長さを計算するcv2.arcLength関数を紹介します。

輪郭とは、画像内の連続した点の集合で、物体や形状の境界線を表します。この関数は、輪郭の形状解析や特徴抽出、物体認識など、様々な画像処理タスクにおいて重要な役割を果たします。輪郭は下の記事で紹介しているcv2.findContoures関数により検出することができます。

(広告) OpenCV関連書籍をAmazonで探す

cv2.arcLength関数

cv2.arcLength関数は、指定された輪郭または曲線の周囲長を計算する関数です。
輪郭の形状分析や図形の性質を理解するために非常に便利です。

cv2.arcLength(curve, closed)

引数

名称説明
curve(必須)・長さを計算したい輪郭
cv2.findContours()関数の出力などが指定可
numpy.ndarrayオブジェクトで表現され、形状は(N,1,2)または(N,2)です。Nは輪郭を構成する点の数です。
closed(必須)・輪郭が閉じているかどうかを指定
Trueの場合は閉じた輪郭、Falseの場合は開いた輪郭として扱われます。
True の場合、関数は輪郭の方向 (時計回りまたは反時計回り) に応じて符号付きの領域値を返します。戻り値の符号で輪郭の方向を判断できます。
False を指定すると、絶対値が返されす。
・bool型

戻り値

輪郭の長さ(float型)が返されます。
単位は「ピクセル」です。

使い方

以下にサンプルコードを示します。

import cv2
import numpy as np

# 四角形の頂点座標
pts = np.array([[50, 50], [200, 50], [200, 200], [50, 200]], dtype=np.int32)

# 頂点座標から四角形を作成
contour = np.array([pts])
print("輪郭:")
print(contour)

# 四角形の周長を計算
perimeter = cv2.arcLength(contour, True)
print(f"四角形の周長: {perimeter:.2f}ピクセル")

このコードでは、5行目で四角形の頂点座標を定義し、8行目でnp.array()を使って輪郭のデータを作成しています。
13行目以降で、cv2.arcLenght関数を使い、輪郭の長さを計算し出力しています。

結果は下の様になりました。

輪郭:
[[[ 50  50]
  [200  50]
  [200 200]
  [ 50 200]]]
四角形の周長: 600.00ピクセル

次のコードでは、入力画像にcv2.fincContours関数の紹介記事で使用したものと同じ下の画像を使用し、cv2.fincContours関数で検出した輪郭データの各輪郭の長さを計算します。

複数のオブジェクトが存在する階層構造
入力画像
import cv2

# 画像読み込み(グレースケール)
image = cv2.imread("py-opencv-arclength/images/image.png", cv2.IMREAD_GRAYSCALE)

# 二値化
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 輪郭を検出
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 輪郭の面積を計算
for i, contour in enumerate(contours):
    perimeter = cv2.arcLength(contour, True)
    print(f"輪郭のインデックス: {i}, 輪郭の周長: {perimeter}ピクセル")

結果は次の通りです。

輪郭のインデックス: 0, 輪郭の周長: 2036.0ピクセル
輪郭のインデックス: 1, 輪郭の周長: 1539.6568541526794ピクセル
輪郭のインデックス: 2, 輪郭の周長: 1136.0ピクセル
輪郭のインデックス: 3, 輪郭の周長: 549.6568541526794ピクセル
輪郭のインデックス: 4, 輪郭の周長: 551.6568541526794ピクセル
輪郭のインデックス: 5, 輪郭の周長: 695.6568541526794ピクセル
輪郭のインデックス: 6, 輪郭の周長: 713.6568541526794ピクセル

応用:曲線の長さ計算

cv2.arcLength関数 は、開いた曲線に対しても使うことができます。
例えば、手描きの曲線やベジェ曲線の長さを計算することが可能です。
次のコードでは、開いた曲線に対して cv2.arcLength関数を使用します。

import cv2
import numpy as np

# 開いた曲線を作成
curve = np.array([[50, 300], [150, 100], [250, 200], [350, 100]], dtype=np.int32)
curve = curve.reshape((-1, 1, 2))

# 曲線の長さを計算
curve_length = cv2.arcLength(curve, False)  # 開いた曲線の場合

print(f"曲線の長さ: {curve_length}")

このコードでは、定義した4つの座標で作成される下図の線の長さを計算します。

曲線の長さ計算


実行結果は下の通りです。

曲線の長さ: 506.4495086669922

おわりに

cv2.arcLength関数は、輪郭や曲線の周囲長を簡単に計算できる便利な関数です。
図形の正確なサイズを測定するのに役立つだけでなく、形状分析や物体認識、セグメンテーション、幾何学特徴抽出、マッチングなど、幅広い応用に活用される重要な関数と言えます。

ご質問や取り上げて欲しい内容などがありましたら、コメントをお願いします。
最後までご覧いただきありがとうございました。

■(広告)OpenCVの参考書としてどうぞ!■

参考リンク

-Python, プログラミング, 画像処理
-