最近、Arucoをやっていたときに、タグ生成時に生と死が失敗することに気づき、後からバージョンの問題だったことが分かりました。
pip install opencv-contrib-pythonコマンドを直接実行すると、直接インストールされたバージョンがopencv-contrib-python==4.7.0.72であることが判明したためです。
バージョン 4.6 およびバージョン 4.7 でタグを生成するコードを以下に示します。
1、opencv-contrib-python==4.6 バージョンのコード
2.opencv-contrib-python==4.7 バージョン コード
3. アルゴリズムの概要比較
バージョンが異なる場合は対応する機能を置き換える必要があります
バージョン4.6の機能 |
バージョン4.7の機能 |
|
1 |
cv2.aruco.GridBoard_create |
cv2.aruco.GridBoard |
2 |
cv2.aruco.Dictionary_get |
cv2.aruco.getPreDefinedDictionary |
3 |
cv2.aruco_GridBoard.draw |
cv2.aruco.Board.generateImage |
1、opencv-contrib-python==4.6 バージョンのコード
import cv2
import numpy as np
markersX = 1 #X轴上标记的数量
markersY = 1 #EY轴上标记的数量 本例生成2行6列的格子
markerLength = 100#标记的长度,单位是像素
markerSeparation = 20#每个标记之间的间隔,单位像素
margins = markerSeparation #标记与边界之间的间隔
borderBits = 10 #标记的边界所占的bit位数
showImage = True
width = markersX * (markerLength + markerSeparation) - markerSeparation + 2 * margins
height =markersY * (markerLength + markerSeparation) - markerSeparation + 2 * margins
dictionary = cv2.aruco.Dictionary_get( cv2.aruco.DICT_6X6_250)
board = cv2.aruco.GridBoard_create(markersX, markersY, float(markerLength),float(markerSeparation), dictionary)
print(cv2.aruco_GridBoard.getGridSize(board))
#根据aruco的宽度自动生成合适的图片尺寸
img= cv2.aruco_GridBoard.draw(board,(width,height),1)
cv2.imwrite('frame.png', img)
上記のコードを実行した結果は次のようになります
2、opencv-contrib-python==4.7 バージョンのコード
以下のコードは上記のコードを変更したものです
import cv2
import numpy as np
markersX = 1 #X轴上标记的数量
markersY = 1 #EY轴上标记的数量 本例生成1x1的棋盘
markerLength = 100#标记的长度,单位是像素
markerSeparation = 20#每个标记之间的间隔,单位像素
margins = markerSeparation #标记与边界之间的间隔
borderBits = 10 #标记的边界所占的bit位数
showImage = True
width = markersX * (markerLength + markerSeparation) - markerSeparation + 2 * margins
height =markersY * (markerLength + markerSeparation) - markerSeparation + 2 * margins
dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_7X7_250)
#生成CharucoBoard
#board = cv2.aruco.CharucoBoard((3, 3), 0.015, 0.011, dictionary)
#生成aruco的格子,或者生成1个aruco,(1, 1)表示生成了1行1列
board = cv2.aruco.GridBoard((1, 1), 0.015, 0.011, dictionary)
#board = cv2.aruco.GridBoard((markersX, markersY), float(markerLength),float(markerSeparation), dictionary)
print(cv2.aruco.Board.getIds(board))
# outSize[, img[, marginSize[, borderBits]
#img = cv2.aruco.Board.generateImage( board,(300,400), 0, 1)
img = cv2.aruco.Board.generateImage( board,(width,height), 0, 1)
cv2.imwrite('frame.png', img)
上記のコードを実行した結果を次の図に示します。
上記のコードは CharucoBoard コードも生成します。このコードは、コメントを削除することでオンデマンドで生成できます。
3 つの形式の区別に注意してください。以下の図を参照してください。
3. アルゴリズムの概要比較
バージョンが異なる場合は対応する機能を置き換える必要があります
バージョン4.6の機能 |
バージョン4.7の機能 |
|
1 |
cv2.aruco.GridBoard_create |
cv2.aruco.GridBoard |
2 |
cv2.aruco.Dictionary_get |
cv2.aruco.getPreDefinedDictionary |
3 |
cv2.aruco_GridBoard.draw |
cv2.aruco.Board.generateImage |
さらに、次の点に特別な注意を払う必要があります。
バージョン 4.6 では、opencv-contrib-python をインストールする必要があります
4.7 バージョンでは aruco モジュールがメインライブラリに置かれているため、opencv-python をインストールするだけで済み、引用する際に aruco を別途引用する必要はなく、cv2 を参照するだけで済みます。
著作権表示: 許可なく複製しないでください。