OpenCVのfindContours関数などで得られた点の座標から、点を囲う矩形領域(四角形の領域)を取得するにはboundingRect関数を用います。
さらに、傾きを考慮した矩形領域を取得するにはminAreaRect関数を用います。
まずは、両方の関数を用いたサンプルを示します。
import cv2
import numpy as np
# 8ビット1チャンネルのグレースケールとして画像を読み込む
img = cv2.imread("sample.bmp", cv2.IMREAD_GRAYSCALE)
contours, hierarchy = cv2.findContours(
img,
cv2.RETR_EXTERNAL, # 一番外側の輪郭のみを取得する
cv2.CHAIN_APPROX_NONE # 輪郭座標の省略なし
)
# 画像表示用に入力画像をカラーデータに変換する
img_disp = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
# 輪郭の点の描画
for i, contour in enumerate(contours):
# 輪郭を描画
cv2.drawContours(img_disp, contours, i, (255, 0, 0), 2)
# 傾いていない外接する矩形領域
x,y,w,h = cv2.boundingRect(contour)
cv2.rectangle(img_disp,(x,y),(x+w-1,y+h-1),(0,255,0),2)
# 傾いた外接する矩形領域
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.intp(box)
cv2.drawContours(img_disp,[box],0,(0,0,255), 2)
# 画像の表示
cv2.imshow("Image", img_disp)
# キー入力待ち(ここで画像が表示される)
cv2.waitKey()
実行結果
緑の線がboundingRect関数を用いて取得した領域、赤の線がminAreaRect関数を用いた領域となります。
矩形領域の取得(boundingRect関数)
boundingRect( array ) -> x, y, width, height
array | (x,y)座標の配列 もしくは グレースケールの画像を指定します。 |
(戻り値) x | 取得した矩形領域の左上のx座標を取得します。 |
(戻り値) y | 取得した矩形領域の左上のy座標を取得します。 |
(戻り値) width | 取得した矩形領域の幅を取得します。 |
(戻り値) height | 取得した矩形領域の高さを取得します。 |
注意点
戻り値で取得した幅(width)および高さ(height)の値は、実際の幅、高さ(2点間の距離)の +1 の値を取得します。
例えば、下図のように、(1, 2), (5, 2), (5, 4), (1, 4)の点を囲う矩形領域を取得すると、
x = 1
y = 2
width = 5
height = 3
となります。
import cv2
import numpy as np
contour = np.array(
[
[1, 2],
[5, 2],
[5, 4],
[1, 4]
],
dtype = np.int32
)
# 傾いていない外接する矩形領域
ret = cv2.boundingRect(contour)
print(ret) # (1, 2, 5, 3)
傾きを考慮した矩形領域の取得(minAreaRect関数)
minAreaRect( points) -> rect
points | (x,y)座標の配列 |
(戻り値) rect | 傾いた矩形領域の 中心のxy座標 (x, y) 矩形の幅、高さ(width, height) 矩形の回転角度 のタプルで取得します。 |
点(1, 1), (0, 2), (4, 4), (5, 3) を囲う傾きを考慮したときの最小となる矩形領域の取得のサンプルを以下に示します。
import cv2
import numpy as np
contour = np.array(
[
[1, 1],
[0, 2],
[4, 4],
[5, 3]
],
dtype = np.int32
)
# 傾いた外接する矩形領域
rect = cv2.minAreaRect(contour) # rectは中心座標(x,y), (width, height), 回転角度
cnter, size, rot = rect
print(rect) # ((2.500000238418579, 2.5), (4.919349670410156, 1.3416407108306885), 26.56505012512207)
関連記事
【OpenCV-Python】findContoursによる輪郭検出
OpenCV(Python)で二値化された画像中の白の部分の外側の輪郭のデータを取得するにはfindContours()関数を用います。 黒の部分の輪郭は、白の部分の内側の輪郭という認識になります。 findContours()関数で取得で...
【OpenCV-Python】矩形抽出(矩形度)
以前、輪郭の内側の面積と周囲長の関係から円形度なる値を求め、円らしき領域を抽出する方法を行いました。 この考え方を応用して、今度は、矩形度(長方形らしさ)なる値を求めて、矩形らしき領域を抽出する方法を考えてみたいと思います。 矩形(長方形)...
コメント