Skip to content

Instantly share code, notes, and snippets.

@akirayou
Created September 11, 2022 06:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akirayou/5fa28948e0a26e1a8dcbacfb6e401c06 to your computer and use it in GitHub Desktop.
Save akirayou/5fa28948e0a26e1a8dcbacfb6e401c06 to your computer and use it in GitHub Desktop.
arucoIDで記入欄位置を特定して、マスク合成して切りだすサンプル。  記入用紙IDもArucoで処理。 Arucoマーカーを手書きするやつはerror扱い。
from xml.dom import INDEX_SIZE_ERR
import cv2
import numpy as np
import os
import glob
from cv2 import aruco
W=400
H=400
dir=r"C:\scan"
dict_aruco = aruco.Dictionary_get(aruco.DICT_4X4_50)
parameters = aruco.DetectorParameters_create()
def on_error(path):
print("読み込めませんでした、やりなおし",path)
for path in glob.glob(dir+"/*.jpg"):
raw = cv2.imread(path)
gray = cv2.cvtColor(raw, cv2.COLOR_RGB2GRAY)
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, dict_aruco, parameters=parameters)
if ids is None or len(ids)!=5:
print("マーカーがうまく読み取れなかった")
on_error(path)
continue
ids=np.array([i[0] for i in ids])
idx=np.argsort(ids)
ids=ids[idx]
pos= np.array([np.mean(c,axis=1).reshape(-1) for c in corners] ) [idx,:]
marker_id=ids[-1]-10
if (ids[:4] != np.array([0,1,2,3])).any() or marker_id<0:
print("マーカー番号が変だった")
on_error(path)
continue
print(path,ids,pos)
dist_pos=np.array(((0,0),(0,H),(W,H),(W,0) )).astype(np.float32)
src_pos=pos[:4,:].astype(np.float32)
print(src_pos,dist_pos)
M= cv2.getPerspectiveTransform(src_pos,dist_pos)
src = cv2.warpPerspective(raw, M,(W,H))
mask = cv2.imread("mask_%d.png"%(marker_id),0)
# Point 2: 元画像をBGR形式からBGRA形式に変換
dst = cv2.cvtColor(src, cv2.COLOR_BGR2BGRA)
dst[:,:,3] = mask
# png画像として出力
cv2.imwrite(dir+"/in/%d_"%(marker_id)+ os.path.splitext(os.path.basename(path))[0]+".png", dst)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment