云计算期末大作业 论文图像复用的机器自动检查 魏如蓝 10172100262
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

169 lines
5.9 KiB

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)