こしあん
2022-09-11

cv2.rectangleのBounding Boxの指定でハマった


5.8k{icon} {views}


OpenCVのrectangleはBounding Boxを描画する際によく使う関数ですが、引数の数によって座標指定のフォーマットが違います。これを知らなくてえらいハマったので忘備録として残しておきます。

結論

思わず「マジかよー」となってしまったやつ。結論

  • 「cv2.rectangle(img, pt, color)」と指定すると、ptは「左上のx座標、左上のy座標、Bounding Boxの幅、Bounding Boxの高さ」と解釈される。
  • 「cv2.rectangle(img, pt1, pt2, color)」と指定すると、pt1は「左上のx座標、左上のy座標」、pt2は「右下のx座標、右下のy座標」と解釈される。

検証環境:OpenCV v4.6.0

Bounding Boxのフォーマットが違うだと……」??

検証

1つ目のケース

import matplotlib.pyplot as plt
import cv2
import numpy as np


img = np.zeros((512,512,3), np.uint8)
img = cv2.rectangle(img, [80, 100, 400, 300], color=(255,0,0), thickness=4)
plt.imshow(img)
plt.show()

2つ目のケース

img = np.zeros((512,512,3), np.uint8)
img = cv2.rectangle(img, [80, 100], [400, 300], color=(255,0,0), thickness=4)
plt.imshow(img)
plt.show()

比較してみると

  • 1つ目のケース:右下のx座標が480、右下のy座標が400になっているので、Bounding Boxの3~4のパラメーターは幅と高さとして解釈されている
  • 2つ目のケース:右下のx座標が400、右下のy座標が300なので、2つ目のパラメーターは純粋に右下のxy座標として解釈されている

公式ドキュメントでは

https://docs.opencv.org/4.x/d6/d6e/group__imgproc__draw.html#ga07d2f74cadcf8e305e810ce8eed13bc9

オーバーロードとして紹介されているが、フォーマットの違いについては書かれていない。

感想

わかるかこんなの!!!

これで6時間溶かしました(だからOpenCVは嫌なんだ)



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です