148 lines
5.1 KiB
Python
148 lines
5.1 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
# @Time :
|
|||
|
# @Author :
|
|||
|
import cv2
|
|||
|
import numpy as np
|
|||
|
|
|||
|
sift = cv2.SIFT_create()
|
|||
|
|
|||
|
|
|||
|
def compuerSift2GetPts(img1, img2):
|
|||
|
# sift 查找关键点,关键点 And 描述
|
|||
|
kp1, des1 = sift.detectAndCompute(img1, None)
|
|||
|
kp2, des2 = sift.detectAndCompute(img2, None)
|
|||
|
|
|||
|
matcher = cv2.BFMatcher()
|
|||
|
raw_matches = matcher.knnMatch(des1, des2, k=2)
|
|||
|
good_matches = []
|
|||
|
ratio = 0.75
|
|||
|
for m1, m2 in raw_matches:
|
|||
|
# 如果最接近和次接近的比值大于一个既定的值,那么我们保留这个最接近的值,认为它和其匹配的点为good_match
|
|||
|
if m1.distance < ratio * m2.distance:
|
|||
|
good_matches.append([m1])
|
|||
|
matches = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good_matches, None, flags=2)
|
|||
|
ptsA = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
|
|||
|
ptsB = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
|
|||
|
|
|||
|
ransacReprojThreshold = 4
|
|||
|
# 单应性矩阵可以将一张图通过旋转、变换等方式与另一张图对齐
|
|||
|
# print(len(ptsA), len(ptsB))
|
|||
|
if len(ptsA) == 0: return ptsA, ptsB, 0
|
|||
|
H, status = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, ransacReprojThreshold)
|
|||
|
cv2.imshow("matcher", matches)
|
|||
|
cv2.waitKey(100)
|
|||
|
|
|||
|
return ptsA, ptsB, 1
|
|||
|
|
|||
|
|
|||
|
def findBestDistanceAndPts(ptsA, ptsB):
|
|||
|
x_dct = {}
|
|||
|
y_dct = {}
|
|||
|
best_x, best_y = int(ptsA[0][0][0] - ptsB[0][0][0]), int(ptsA[0][0][1] - ptsB[0][0][1])
|
|||
|
x_cnt, y_cnt = 0, 0
|
|||
|
for i in range(len(ptsA)):
|
|||
|
# print(ptsA[i], ' ', ptsB[i])
|
|||
|
x_dis = int(ptsA[i][0][0] - ptsB[i][0][0])
|
|||
|
y_dis = int(ptsA[i][0][1] - ptsB[i][0][1])
|
|||
|
# print(x_dis)
|
|||
|
if x_dis in x_dct:
|
|||
|
x_dct.update({x_dis: int(x_dct.get(x_dis) + 1)})
|
|||
|
if x_dct.get(x_dis) > x_cnt:
|
|||
|
best_x = x_dis
|
|||
|
x_cnt = x_dct.get(x_dis)
|
|||
|
# print(x_dct.get(x_dis))
|
|||
|
else:
|
|||
|
x_dct.update({x_dis: 1})
|
|||
|
# print(x_dct.get(x_dis))
|
|||
|
# print(y_dis)
|
|||
|
if y_dis in y_dct:
|
|||
|
y_dct.update({y_dis: int(y_dct.get(y_dis) + 1)})
|
|||
|
if y_dct.get(y_dis) > y_cnt:
|
|||
|
best_y = y_dis
|
|||
|
y_cnt = y_dct.get(y_dis)
|
|||
|
# print(y_dct.get(y_dis))
|
|||
|
else:
|
|||
|
y_dct.update({y_dis: 1})
|
|||
|
# print(y_dct.get(y_dis))
|
|||
|
print(best_x, best_y)
|
|||
|
|
|||
|
pt = []
|
|||
|
ptb = []
|
|||
|
for i in range(len(ptsA)):
|
|||
|
x_dis = int(ptsA[i][0][0] - ptsB[i][0][0])
|
|||
|
y_dis = int(ptsA[i][0][1] - ptsB[i][0][1])
|
|||
|
if abs(best_x - x_dis) <= 0:
|
|||
|
pt.append([ptsA[i][0][0], ptsA[i][0][1]])
|
|||
|
# print(pt)
|
|||
|
return pt, best_x, best_y
|
|||
|
|
|||
|
|
|||
|
def minDistanceHasXy(ptsA, ptsB):
|
|||
|
dct = {}
|
|||
|
cnt = 0
|
|||
|
best = 's'
|
|||
|
for i in range(len(ptsA)):
|
|||
|
disx = int(ptsA[i][0][0] - ptsB[i][0][0] + 0.5)
|
|||
|
disy = int(ptsA[i][0][1] - ptsB[i][0][1] + 0.5)
|
|||
|
s = str(disx) + ',' + str(disy)
|
|||
|
# print(s)
|
|||
|
if s in dct:
|
|||
|
dct.updata({s: int(dct.get(s) + 1)})
|
|||
|
if dct.get(s) >= cnt:
|
|||
|
cnt = dct.get(s)
|
|||
|
best = s
|
|||
|
print(s)
|
|||
|
else:
|
|||
|
dct.update({s: int(1)})
|
|||
|
for i, j in dct.items():
|
|||
|
print(i, j)
|
|||
|
print(best)
|
|||
|
|
|||
|
|
|||
|
def detectImg(img1, img2, pta, best_x, best_y):
|
|||
|
# print(pta)
|
|||
|
min_x = int(min(x[0] for x in pta))
|
|||
|
max_x = int(max(x[0] for x in pta))
|
|||
|
min_y = int(min(x[1] for x in pta))
|
|||
|
max_y = int(max(x[1] for x in pta))
|
|||
|
# print(min_x, max_x)
|
|||
|
# print(min_x - best_x, max_x - best_x)
|
|||
|
# print(min_y, max_y)
|
|||
|
# print(min_y - best_y, max_y - best_y)
|
|||
|
newimg1 = img1[min_y: max_y, min_x: max_x]
|
|||
|
newimg2 = img2[min_y - best_y: max_y - best_y, min_x - best_x: max_x - best_x]
|
|||
|
# cv2.imshow("newimg1", newimg1)
|
|||
|
# cv2.imshow("newimg2", newimg2)
|
|||
|
# cv2.waitKey(0)
|
|||
|
return newimg1, newimg2
|
|||
|
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
j = 0
|
|||
|
for i in range(20, 4771, 1):
|
|||
|
print(i)
|
|||
|
path1 = './data/907dat/gray/camera1-' + str(i) + '.png'
|
|||
|
path2 = './data/907dat/color/camera0-' + str(i) + '.png'
|
|||
|
img1 = cv2.imread(path1)
|
|||
|
img2 = cv2.imread(path2)
|
|||
|
if (img1 is None or img2 is None): continue
|
|||
|
PtsA, PtsB, f = compuerSift2GetPts(img1, img2)
|
|||
|
if (f == 0): continue
|
|||
|
pt, best_x, best_y = findBestDistanceAndPts(PtsA, PtsB)
|
|||
|
newimg1, newimg2 = detectImg(img1, img2, pt, best_x, best_y)
|
|||
|
if newimg1.shape[0] < 10 or newimg1.shape[1] < 10: continue
|
|||
|
print(newimg1.shape, newimg2.shape)
|
|||
|
# newimg1 = cv2.resize(newimg1, (320, 240))
|
|||
|
# newimg2 = cv2.resize(newimg2, (320, 240))
|
|||
|
wirtePath1 = './result/dat_result_2/gray/camera1-' + str(j) + '.png'
|
|||
|
wirtePath2 = './result/dat_result_2/color/camera0-' + str(j) + '.png'
|
|||
|
if newimg1.shape[0] > 255 and newimg1.shape[1] > 255 and newimg1.shape == newimg2.shape:
|
|||
|
# cv2.imwrite(wirtePath1, newimg1)
|
|||
|
# cv2.imwrite(wirtePath2, newimg2)
|
|||
|
j += 1
|
|||
|
cv2.imshow("newimg1", newimg1)
|
|||
|
cv2.imshow("newimg2", newimg2)
|
|||
|
cv2.waitKey()
|
|||
|
print(j)
|
|||
|
pass
|