cv2.rectangleのBounding Boxの指定でハマった
Posted On 2022-09-11
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の中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー