Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

AttributeError: module 'cv2.aruco' has no attribute 'detectMarkers'

数カ月前に作ったArUcoアプリを再稼働させたところ

AttributeError: module 'cv2.aruco' has no attribute 'detectMarkers'

などというエラーが。
……何もしてないのに壊れた??

これ、何のことはなく、別のプロジェクトでOpenCVをアップデートした事が原因でした。
4.7.X系からdetectmarkersメソッドからdetectメソッドを使うように変わったそうです。

実際のところ

非推奨……というかエラーを吐いた原因であるdetectMarkersメソッドを使ったバージョンが以下の時

import cv2
import numpy as np
import sys

aruco = cv2.aruco
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)

stdin = sys.stdin.buffer.read()
array = np.frombuffer(stdin, dtype="uint8")
img_src = cv2.imdecode(array, 1)

corners, ids, rejectedImgPoints = aruco.detectMarkers(img_src, dictionary)

if ids is not None:
    img_src = aruco.drawDetectedMarkers(img_src, corners, ids)

cv2.imshow("Image with detected ArUco markers", img_src)
cv2.waitKey(0)
cv2.destroyAllWindows()

detectメソッド使って書き換えると

import cv2
import numpy as np
import sys

aruco = cv2.aruco
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)

stdin = sys.stdin.buffer.read()
array = np.frombuffer(stdin, dtype="uint8")
img_src = cv2.imdecode(array, 1)

parameters = aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = aruco.detect(img_src, dictionary, parameters=parameters)

if ids is not None:
    img_src = aruco.drawDetectedMarkers(img_src, corners, ids)

cv2.imshow("Image with detected ArUco markers", img_src)
cv2.waitKey(0)
cv2.destroyAllWindows()