短辺を高さ、長辺を幅など決められているのであれば1以下にはならないと思うのですが・・・。
OpenCV で幅、高さというワードが出てきた場合、幅は 「x 軸方向の長さ」、「高さは y 軸方向の長さ」を表します。
なので、長辺を求める場合は max(幅, 高さ)、短辺を求めたい場合は min(幅, 高さ) とすればよいでしょう。
OpenCV - 輪郭を近似する、面積を求める、Bounding Box を求める方法について - Pynote
本当のプログラムでは画像を分割して、その画像内にアスペクト比の長い棒のようなものがあり、各分割画像でアスペクト比の平均値を求めています。たまにアスペクト比が0というデータもあるのでもしかしましたらデータが0の点があるせいで平均のアスペクト比が1以下になっているのかもしれません。そもそもなぜ0が出てくるのかもよくわからないのですが・・・。
boundingRect() に渡す cnt を print() で確認してみてください。
点数が1点とかの輪郭が混じっているのかもしれないので、len(cnt) < 3 とかの条件式で排除してください。
サンプルコード
python
1import cv2
2import numpy as np
3
4# 画像を読み込む。
5img = cv2.imread("contours.png")
6
7# 輪郭を抽出する。
8gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
9contours = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
10
11for cnt in contours:
12 if len(cnt) <= 2:
13 continue # 2点未満は無視する。
14
15 # 輪郭に外接する長方形を取得する。
16 x, y, width, height = cv2.boundingRect(cnt)
17 # 長辺 / 短辺
18 aspect = max(width, height) / min(width, height)
19
20 # 長方形を描画する。
21 cv2.rectangle(img, (x, y), (x + width, y + height), color=(0, 255, 0))
22 # アスペクト比を描画する。
23 cv2.putText(
24 img,
25 f"{aspect:.2f}",
26 (x, y),
27 fontFace=cv2.FONT_HERSHEY_SIMPLEX,
28 fontScale=0.5,
29 color=(0, 255, 0),
30 )
31
32cv2.imwrite("result.png", img)
入出力