from __future__ import print_function import cv2 import numpy as np import os from flask import render_template import zipfile MAX_MATCHES = 500 GOOD_MATCH_PERCENT = 0.15 class feat: def call_feature_extraction_1(self, folder_path, list, index, tmp): # 按相似度排序 list = sorted(list, key=(lambda x: [x[2], x[5]]),reverse=True) print(list) print('---------------') print(index) for i in range(int(index/10)): # 取第一组比较并返回 refFilename = list[i][0] # imgname1 = '/home/Jupyterlab/wrl/pic/xiagao/pic/11.jpeg' print("Reading reference image : ", refFilename) imReference = cv2.imread(refFilename, cv2.IMREAD_COLOR) imFilename = list[i][1] # imgname2 = '/home/Jupyterlab/wrl/pic/xiagao/pic/12.jpeg' print("Reading image to align : ", imFilename); im = cv2.imread(imFilename, cv2.IMREAD_COLOR) print(refFilename) print(imFilename) print(folder_path[7:]) p1 = refFilename.rfind('/') name1 = refFilename[p1:-4] print(name1) p2 = imFilename.rfind('/') name2 = imFilename[p2 + 1:] print(name2) # Write aligned image to disk. outFilename = "output/" + folder_path[7:] pre = os.getcwd() print("Saving aligned image : ", outFilename) print("Aligning images ...") # Registered image will be resotred in imReg. # The estimated homography will be stored in h. imReg, h, img5 = feat().alignImages(im, imReference) if (str(img5) == 'white'): print('white') # continue else: print(outFilename) # imgwrite需要建好路径!!!!!! if not os.path.exists(outFilename): os.makedirs(outFilename) outFilename1 = outFilename + name1 + name2 cv2.imwrite(outFilename1, img5) # continue outFullName = feat.zipDir(outFilename) pre1 = "/home/wwwroot/default/" + outFilename + ".zip" # return str(pre) + '/' + outFilename # return pre1 return outFullName def alignImages(self, im1, im2): # Convert images to grayscale im1Gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY) im2Gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) # Detect ORB features and compute descriptors. orb = cv2.ORB_create(MAX_MATCHES) keypoints1, descriptors1 = orb.detectAndCompute(im1Gray, None) keypoints2, descriptors2 = orb.detectAndCompute(im2Gray, None) if keypoints1 and keypoints2: # Match features. matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING) matches = matcher.match(descriptors1, descriptors2, None) # Sort matches by score matches.sort(key=lambda x: x.distance, reverse=False) # Remove not so good matches numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT) matches = matches[:numGoodMatches] # Draw top matches imMatches = cv2.drawMatches(im1, keypoints1, im2, keypoints2, matches, None) cv2.imwrite("matches.jpg", imMatches) # Extract location of good matches points1 = np.zeros((len(matches), 2), dtype=np.float32) points2 = np.zeros((len(matches), 2), dtype=np.float32) for i, match in enumerate(matches): points1[i, :] = keypoints1[match.queryIdx].pt points2[i, :] = keypoints2[match.trainIdx].pt if (points1.size == 0) or (points2.size == 0): return 'white', 'white', 'white' # Find homography h, mask = cv2.findHomography(points1, points2, cv2.RANSAC) # Use homography height, width, channels = im2.shape im1Reg = cv2.warpPerspective(im1, h, (width, height)) img1 = cv2.drawKeypoints(im1, keypoints1, im1, color=(255, 0, 255)) img2 = cv2.drawKeypoints(im2, keypoints2, im2, color=(255, 0, 255)) img5 = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches, None, flags=2) return im1Reg, h, img5 else: return 'white', 'white', 'white' def return_img_stream(self, img_local_path): # """ # 工具函数: # 获取本地图片流 # :param img_local_path:文件单张图片的本地绝对路径 # :return: 图片流 # """ import base64 img_stream = '' with open(img_local_path, 'r') as img_f: img_stream = img_f.read() img_stream = base64.b64encode(img_stream) return img_local_path def zipDir(dirpath): """ 压缩指定文件夹 :param dirpath: 目标文件夹路径 :param outFullName: 压缩文件保存路径+xxxx.zip :return: 无 """ outFullName = "/home/wwwroot/default/" + dirpath[21:] + ".zip" outFullName1 = "http://106.75.226.23/" + dirpath[21:] + ".zip" # if not os.path.exists(outFullName): # os.makedirs(outFullName) zip = zipfile.ZipFile(outFullName, "w", zipfile.ZIP_DEFLATED) for path, dirnames, filenames in os.walk(dirpath): # 去掉目标跟路径,只对目标文件夹下边的文件及文件夹进行压缩 fpath = path.replace(dirpath, '') for filename in filenames: zip.write(os.path.join(path, filename), os.path.join(fpath, filename)) zip.close() return outFullName1 # im1 = '/Users/wrl/Desktop/test0506/pic/2303.png' # im2 = '/Users/wrl/Desktop/test0506/pic/2304.png' # img1 = cv2.imread(im1, cv2.IMREAD_COLOR) # img2 = cv2.imread(im2, cv2.IMREAD_COLOR) # imReg, h, img5 =feat().alignImages(img1,img2)