Как аффинно преобразовать сто изображений OpenCV Python - PullRequest
0 голосов
/ 13 марта 2020

У меня есть сотни изображений одного печатного продукта. Чтобы проверить этот печатный материал, сначала мне нужно выровнять объект на изображении.

Я замаскировал область интереса и нашел совпадения шаров между первым изображением (которое я рассматриваю как мастер-образец) и входное изображение (должно быть выровнено как мастер).

Я выбрал наивысшую оценку с ближайшей оценкой местоположения, которая будет использоваться в качестве точки в аффинном преобразовании. Однако вместо перевода изображения оно выглядит перевернутым.

Вот фрагмент моего кода

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))

Но вывод появляется как это ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...