はじめに
OpenCVでは輪郭(contour)に関連する処理を行うための多くの機能を提供しています。
この記事では、輪郭の長さを計算するcv2.arcLength
関数を紹介します。
輪郭とは、画像内の連続した点の集合で、物体や形状の境界線を表します。この関数は、輪郭の形状解析や特徴抽出、物体認識など、様々な画像処理タスクにおいて重要な役割を果たします。輪郭は下の記事で紹介しているcv2.findContoures
関数により検出することができます。
cv2.arcLength関数
cv2.arcLength
関数は、指定された輪郭または曲線の周囲長を計算する関数です。
輪郭の形状分析や図形の性質を理解するために非常に便利です。
引数
名称 | 説明 |
---|---|
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の参考書としてどうぞ!■
参考リンク
OpenCV: arcLength()
Calculates a contour perimeter or a curve length.