110
社区成员
发帖
与我相关
我的任务
分享python 3.9 3.8
numpy
json
opency-python
这里的sample就是修改数字的时候填进图片里的数字图片
主要是切片图片固定位置的内容并保存到当前目录下的/samples文件夹下,同时保存位置信息到config.json文件夹下(建议一次采完,分多次采需要重新写一下json文件)
config = {}
while True:
num = input('保存的数字:')
if num == '-1':
break
(xmin, ymin), (xmax, ymax) = eval(input('xmin ymin xmax ymax '))
path = input('path:')
img = cv2.imread(f'{path}')
img = np.array(img)
sample = img[ymin: ymax, xmin: xmax]
cv2.imwrite('./samples/{}.jpg'.format(num), sample)
config[num] = {
'loaction': [(xmin, ymin), (xmax, ymax)],
'size': (ymax - ymin, xmax - xmin, 3),
'path': './samples/{}.jpg'.format(num)
}
with open('./samples/config.json', 'a') as f:
f.write(json.dumps(config))
config.json里的内容大概是这样的(下一次保存的config.json文件会在前一个文件之后再生成一个并排的config字典,需要把两个dict合并一下,不然会报错):
config = {
'3_u':{
'loaction': [(115, 847), (157, 929)],
'size': (82, 42, 3),
'path': './samples/3_u.jpg'
},
'3_l':{
'loaction': [(57, 1024), (79, 1060)],
'size': (36, 22, 3),
'path': './samples/3_l.jpg'
}
}
这个类的功能就是把sample插入到对应位置,实现公里数和时间的修改,只需要当天打开keep,随便走一点然后保存,再用这个修改就可以蒙混过关,但是有的老师还会检查keep,或者看配速,这些东西如果感兴趣的同学可以自己开发一下,我懒得弄了
import cv2
import json
import numpy as np
from string import punctuation
import re, os
class Transform:
def __init__(self, config_path='./samples/config.json', ):
with open(config_path, 'r') as f:
self.config = json.loads(f.read())
self._position = {
'distance': {
'0': ((60, 847), (102, 929)),
'1': ((115, 847), (157, 929)),
'2': ((156, 847), (198, 929))
},
'time': {
'0': ((313, 1023), (335, 1060)),
'1': ((335, 1023), (357, 1060))
}
}
self.abandon = ''.join([r'\\' + s for s in punctuation if s != '*'])
def transform(self, transform_locations: dict, img_path, cover=False, save_path='./new.jpg'):
self.img = np.array(cv2.imread(img_path))
for location, num in transform_locations.items():
sample = cv2.imread(self.config[num]['path'])
sample = np.array(sample)
target = self.img[location[0][1]: location[1][1], location[0][0]: location[1][0]]
if sample.size != target.size:
sample = cv2.resize(sample, target)
self.img[location[0][1]: location[1][1], location[0][0]: location[1][0]] = sample
if cover:
save_path = img_path
cv2.imwrite(save_path, self.img)
def __call__(self, transform, img_path, save_path='./new.jpg'):
transform_locations = {}
position = self._position
for mode in transform:
s = re.sub(f'''[{self.abandon}]''', '', transform[mode])
transform[mode] = s
if 'distance' in transform:
distance = transform['distance']
for i in range(len(distance)):
if distance[i] != '*':
transform_locations[position['distance'][str(i)]] = '%s_u' % transform['distance'][i]
else:
continue
transform.pop('distance')
if 'time' in transform:
time = transform['time']
for i in range(len(time)):
if time[i] != '*':
transform_locations[position['time'][str(i)]] = '%s_l' % transform['time'][i]
else:
continue
transform.pop('time')
transform_locations.update(transform)
print(os.path.split(img_path)[0] + '/new.jpg')
self.transform(transform_locations, img_path, save_path)

会先提示输入数字,这里的输入格式是:

然后需要输入数字的坐标,这里我已经找好了一些,可以直接复制粘贴:
# location
'''
distance
(60, 847), (102, 929) 公里数的第一个数
(115, 847), (157, 929) 公里数的第二个数
(156, 847), (198, 929) 公里数的第三个数
time
(313, 1023), (335, 1060) 分钟的十位数
(335, 1023), (357, 1060) 分钟的个位数
'''

最后输入文件路径,文件路径可以在,右键->属性->安全->对象名称 下面找到

然后回车即可,可以在代码所在目录下面找到samples文件夹,里面就是我们保存的图片和json文件

需要指定原图片的路径,修改img_path
需要指定每个数修改为多少, ‘distance’: ‘3*’ 就是把公里数修改为3公里,表示不改变
同理 'time': '3*' 就是把时间的分钟数的十位修改为 3,比如时间原本是06分钟,修改后就是36分钟
然后是save_path保存路径,默认是代码目录下的new.jpg文件
img_path = 'E:/Desktop/new.jpg'
transform_locations = {
'distance': '3**',
'time': '3*'
}
t = Transform()
t(transform_locations, img_path)
第一次发帖,感觉比写代码累。代码仅供学习使用,希望大家还是好好打卡,就算用了,也请别把我供出来。整体的流程还是有些繁琐,不过最麻烦的只是sample的部分,之后直接一键生成即可。祝各位学业有成。
