PYTHON实现手机截图拼接功能,原理参考https://xiangwangfeng.com/2015/11/30/记一个截图拼接的小工具/
概括一下几个知识点:
1.为了减少计算量可以提取照片指纹,我采用的是CRC16.
2.用动态规划求出两个字符串的最大公共子串。
接下来就是流程:
首先可以自己先截取几张手机截图,举个例子,如下图。
按先后顺序放入一个文件夹中。
运行代码,就可以得到以下结果。
最后奉上我的代码
import cv2 import os import numpy as np import binascii import crcmod.predefined import crc16 def find_lcsubstr(s1, s2): m = [[0 for i in range(len(s2) + 1)] for j in range(len(s1) + 1)] mmax = 0 p = 0 for i in range(len(s1)): for j in range(len(s2)): if s1[i] == s2[j]: m[i + 1][j + 1] = m[i][j] + 1 if m[i + 1][j + 1] > mmax: mmax = m[i + 1][j + 1] p = i + 1 return s1[p-mmax:p],p-mmax,mmax image_list = os.listdir('/Users/evawang/Desktop/untitled/image2') dict = {} all_crc16_list = [] for image in sorted(image_list): img = cv2.imread(os.path.join('/Users/evawang/Desktop/untitled/image2',image)) gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) crc16_list = [] for l in gray: crc16_list.append(crc16.crc16xmodem(l)) dict[image]= crc16_list all_crc16_list.append(crc16_list) final_img = [] first_img = cv2.imread(os.path.join('/Users/evawang/Desktop/untitled/image2', sorted(image_list)[0])) final_img.extend(first_img) for i in range(len(all_crc16_list)): crc16_list_1 = all_crc16_list[i] if i+2>len(all_crc16_list): break else: crc16_list_2 = all_crc16_list[i+1] longest_common_substring, img1_cut_length,length = find_lcsubstr(crc16_list_1,crc16_list_2) if length == 0: continue img1 = cv2.imread(os.path.join('/Users/evawang/Desktop/untitled/image2', sorted(image_list)[i])) new_image_1 = img1[:img1_cut_length,:,:] img2 = cv2.imread(os.path.join('/Users/evawang/Desktop/untitled/image2', sorted(image_list)[i+1])) idx = crc16_list_2.index(longest_common_substring[0]) new_image_2 = img2[crc16_list_2.index(longest_common_substring[0])+length:, :,:] final_img.extend(new_image_2) cv2.imwrite('final.jpg', np.array(final_img))