У меня есть сотни изображений одного печатного продукта. Чтобы проверить этот печатный материал, сначала мне нужно выровнять объект на изображении.
Я замаскировал область интереса и нашел совпадения шаров между первым изображением (которое я рассматриваю как мастер-образец) и входное изображение (должно быть выровнено как мастер).
Я выбрал наивысшую оценку с ближайшей оценкой местоположения, которая будет использоваться в качестве точки в аффинном преобразовании. Однако вместо перевода изображения оно выглядит перевернутым.
Вот фрагмент моего кода
def findMatches(img,mask):
size = mask.shape[0]*mask.shape[1]
orb = cv2.ORB_create(size,
edgeThreshold=15,
patchSize=31,
nlevels=8,
fastThreshold=20,
scaleFactor=1.2,
WTA_K=2,
scoreType=cv2.ORB_HARRIS_SCORE,
firstLevel=0)
#Compute ORB KeyPoints and Descriptor in mask area
kp_ori, dc_ori = orb.detectAndCompute(mask, None)
img2 = cv2.drawKeypoints(mask,kp_ori,outImage = None,color=(0,255,0), flags=0)
plt.imshow(img2)
plt.show()
#Match the point with the original image back
#Compute ORB KeyPoints and Descriptor in input image
kp_inp, dc_inp = orb.detectAndCompute(inp, None)
#kp_inp = [i for i in kp_inp if i.pt[1] > cnt_raveled[0][1] and i.pt[1] < cnt_raveled[1][1]
# and i.pt[0] > cnt_raveled[0][0] and i.pt[0] > cnt_raveled[2][0]]
img3 = cv2.drawKeypoints(inp,kp_inp,outImage = None,color=(0,255,0), flags=0)
plt.imshow(img3)
plt.show()
matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
matches = matcher.match(dc_ori, dc_inp, None)
matches.sort(key=lambda x: x.distance, reverse=False)
matches = [x for x in matches if x.distance < 5]
img4 = cv2.drawMatches(mask,kp_ori,inp,kp_inp,matches[:10],None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img4)
plt.show()
return matches,kp_ori,kp_inp
, а затем
pt1 = ((0,0),kp_ori1[matches1[0].imgIdx].pt,kp_ori2[matches2[0].imgIdx].pt)
pt2 = ((0,0),kp_inp1[matches1[0].queryIdx].pt,kp_inp2[matches2[0].queryIdx].pt)
rows,cols = inp.shape
M = cv2.getAffineTransform(np.float32(pt1),np.float32(pt2))
dst = cv2.warpAffine(inp,M,(cols,rows))
dst = cv2.warpAffine(inp,M,(cols,rows))
Но вывод появляется как это ..