nowe shelfy
@ -3,5 +3,5 @@
|
||||
<component name="JavaScriptSettings">
|
||||
<option name="languageLevel" value="ES6" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (AL-2020)" project-jdk-type="Python SDK" />
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (AL-2020)" project-jdk-type="Python SDK" />
|
||||
</project>
|
@ -4,7 +4,7 @@
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.7 (AL-2020)" jdkType="Python SDK" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.8 (AL-2020)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
18
assigning.py
Normal file
@ -0,0 +1,18 @@
|
||||
import os
|
||||
|
||||
from codes_recognizer.rocognizer import recognizer
|
||||
|
||||
|
||||
def assigning(product_code_path, shelfs):
|
||||
c = None
|
||||
code = recognizer(product_code_path)
|
||||
print(code)
|
||||
product_color = str(code[0]) + str(code[1])
|
||||
print(product_color)
|
||||
for shelf in shelfs:
|
||||
if shelf.color == product_color:
|
||||
shelf.add_product(code)
|
||||
c = shelf.get_field()
|
||||
|
||||
print("Product", product_code_path, "is on", c)
|
||||
return c
|
74
board.py
@ -1,12 +1,14 @@
|
||||
import pygame
|
||||
from settings import Settings
|
||||
from field import Field
|
||||
from shelf import Shelf
|
||||
|
||||
settings = Settings()
|
||||
#(250, 650), (250, 750)
|
||||
|
||||
|
||||
def create_board(screen):
|
||||
board = []
|
||||
|
||||
shelfs = [
|
||||
(50, 50), (150, 50), (450, 50), (550, 50), (850, 50), (950, 50),
|
||||
(250, 250), (350, 250), (650, 250), (750, 250),
|
||||
@ -49,3 +51,73 @@ def draw_board(board):
|
||||
field.blitme()
|
||||
|
||||
|
||||
def get_shelfs(board):
|
||||
field_shelfs = []
|
||||
shelfs = []
|
||||
for row in board:
|
||||
for field in row:
|
||||
if field.isShelf():
|
||||
field_shelfs.append(field)
|
||||
|
||||
shelf = Shelf(field_shelfs[0], "01")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[1], "01")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[2], "02")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[3], "02")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[4], "03")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[5], "03")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[6], "04")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[7], "04")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[8], "05")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[9], "05")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[10], "06")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[11], "06")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[12], "07")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[13], "07")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[14], "08")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[15], "08")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[16], "09")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[17], "09")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[18], "10")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[19], "10")
|
||||
shelfs.append(shelf)
|
||||
|
||||
return shelfs
|
||||
|
||||
|
130
board.py.orig
Normal file
@ -0,0 +1,130 @@
|
||||
import pygame
|
||||
from settings import Settings
|
||||
from field import Field
|
||||
from shelf import Shelf
|
||||
|
||||
settings = Settings()
|
||||
#(250, 650), (250, 750)
|
||||
|
||||
def create_board(screen):
|
||||
board = []
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
|
||||
>>>>>>> upstream/master
|
||||
shelfs = [
|
||||
(50, 50), (150, 50), (450, 50), (550, 50), (850, 50), (950, 50),
|
||||
(250, 250), (350, 250), (650, 250), (750, 250),
|
||||
(50, 450), (150, 450), (450, 450), (550, 450), (850, 450), (950, 450),
|
||||
<<<<<<< HEAD
|
||||
(250, 650), (350, 650), (650, 650), (750, 650)
|
||||
=======
|
||||
(250, 650), (350, 650), (650, 650), (750, 650),
|
||||
>>>>>>> upstream/master
|
||||
]
|
||||
|
||||
for y in range(settings.y_fields):
|
||||
row = []
|
||||
for x in range(settings.x_fields):
|
||||
field = Field(screen, x, y, 50 + x * 100, 50 + y * 100, False, False, 1)
|
||||
for shelf in shelfs:
|
||||
if field.center_x == shelf[0] and field.center_y == shelf[1]:
|
||||
field.is_shelf = True
|
||||
field.image = pygame.image.load('img/shelf.png')
|
||||
|
||||
row.append(field)
|
||||
board.append(row)
|
||||
for row in board:
|
||||
for field in row:
|
||||
field.add_neighbors(board)
|
||||
|
||||
for row in board:
|
||||
for field in row:
|
||||
if field.x > 0 and board[field.y][field.x - 1].is_shelf:
|
||||
field.cost_of_travel += 1
|
||||
if field.x < 9 and board[field.y][field.x + 1].is_shelf:
|
||||
field.cost_of_travel += 1
|
||||
if field.y > 0 and board[field.y - 1][field.x].is_shelf:
|
||||
field.cost_of_travel += 1
|
||||
if field.y < 9 and board[field.y + 1][field.x].is_shelf:
|
||||
field.cost_of_travel += 1
|
||||
|
||||
return board
|
||||
|
||||
|
||||
def draw_board(board):
|
||||
for row in board:
|
||||
for field in row:
|
||||
field.blitme()
|
||||
|
||||
|
||||
def get_shelfs(board):
|
||||
field_shelfs = []
|
||||
shelfs = []
|
||||
for row in board:
|
||||
for field in row:
|
||||
if field.isShelf():
|
||||
field_shelfs.append(field)
|
||||
|
||||
shelf = Shelf(field_shelfs[0], "01")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[1], "01")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[2], "02")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[3], "02")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[4], "03")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[5], "03")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[6], "04")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[7], "04")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[8], "05")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[9], "05")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[10], "06")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[11], "06")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[12], "07")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[13], "07")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[14], "08")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[15], "08")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[16], "09")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[17], "09")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[18], "10")
|
||||
shelfs.append(shelf)
|
||||
|
||||
shelf = Shelf(field_shelfs[19], "10")
|
||||
shelfs.append(shelf)
|
||||
|
||||
return shelfs
|
||||
|
4
coder.py
@ -68,8 +68,8 @@ def create_image(product):
|
||||
print(string)
|
||||
img = Image.new('RGB', (560, 112), color='white')
|
||||
d = ImageDraw.Draw(img)
|
||||
fnt = ImageFont.truetype('D:\Studia\Projects\AL-2020\img\codes\\arial_bold.ttf', 75)
|
||||
d.text((30, 30), string, font=fnt, fill=(0, 0, 0))
|
||||
fnt = ImageFont.truetype('img\codes\\arial_bold.ttf', 75)
|
||||
d.text((28, 28), string, font=fnt, fill=(0, 0, 0))
|
||||
path = 'img/codes/' + product.name + '.png'
|
||||
img.save(path)
|
||||
return path
|
||||
|
@ -1,56 +0,0 @@
|
||||
import cv2
|
||||
import torch
|
||||
from nn_model import Net
|
||||
from torchvision.transforms import transforms
|
||||
|
||||
|
||||
def recognizer(paths):
|
||||
|
||||
codes = []
|
||||
code = []
|
||||
|
||||
transform = transforms.Compose([transforms.ToTensor(),
|
||||
transforms.Normalize((0.5,), (0.5,)),
|
||||
])
|
||||
|
||||
# load nn model
|
||||
model = Net()
|
||||
model.load_state_dict(torch.load('model.pt'))
|
||||
model.eval()
|
||||
|
||||
|
||||
for path in paths:
|
||||
img = cv2.imread(path)
|
||||
|
||||
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||
img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0)
|
||||
|
||||
ret, im_th = cv2.threshold(img_gray, 90, 255, cv2.THRESH_BINARY_INV)
|
||||
|
||||
ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||||
|
||||
rects = [cv2.boundingRect(ctr) for ctr in ctrs]
|
||||
|
||||
for rect in rects:
|
||||
# Crop image
|
||||
crop_img = img[rect[1]:rect[1] + rect[3] + 10, rect[0]:rect[0] + rect[2] + 10, 0]
|
||||
# Resize the image
|
||||
roi = cv2.resize(crop_img, (28, 28), interpolation=cv2.INTER_CUBIC)
|
||||
# roi = cv2.dilate(roi, (3, 3))
|
||||
# plt.imshow(roi)
|
||||
# plt.show()
|
||||
im = transform(roi)
|
||||
im = im.view(1, 1, 28, 28)
|
||||
with torch.no_grad():
|
||||
logps = model(im)
|
||||
ps = torch.exp(logps)
|
||||
probab = list(ps.numpy()[0])
|
||||
code.append(probab.index(max(probab)))
|
||||
|
||||
codes.append(code)
|
||||
# cv2.imshow("Code", img)
|
||||
# cv2.waitKey()
|
||||
|
||||
return codes
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
26238
codes_recognizer/dataset/ARIAL.csv
Normal file
@ -18,4 +18,4 @@ class Net(nn.Module):
|
||||
x = F.relu(self.fc1(x))
|
||||
x = F.dropout(x, training=self.training)
|
||||
x = self.fc2(x)
|
||||
return F.log_softmax(x)
|
||||
return F.log_softmax(x, 1)
|
51
codes_recognizer/rocognizer.py
Normal file
@ -0,0 +1,51 @@
|
||||
import cv2
|
||||
import torch
|
||||
from torchvision.transforms import transforms
|
||||
from codes_recognizer.network_model import Net
|
||||
|
||||
|
||||
def recognizer(path):
|
||||
codes = []
|
||||
code = []
|
||||
|
||||
transform = transforms.Compose([transforms.ToTensor(),
|
||||
transforms.Normalize((0.5,), (0.5,)),
|
||||
])
|
||||
|
||||
# load nn model
|
||||
model = Net()
|
||||
model.load_state_dict(torch.load('codes_recognizer/model.pt'))
|
||||
model.eval()
|
||||
img = cv2.imread(path)
|
||||
|
||||
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||
img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0)
|
||||
|
||||
ret, im_th = cv2.threshold(img_gray, 90, 255, cv2.THRESH_BINARY_INV)
|
||||
|
||||
ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||||
|
||||
rects = [cv2.boundingRect(ctr) for ctr in ctrs]
|
||||
|
||||
for rect in rects:
|
||||
# Crop image
|
||||
crop_img = img[rect[1]:rect[1] + rect[3] + 10, rect[0]:rect[0] + rect[2] + 10, 0]
|
||||
# Resize the image
|
||||
roi = cv2.resize(crop_img, (28, 28), interpolation=cv2.INTER_CUBIC)
|
||||
# roi = cv2.dilate(roi, (3, 3))
|
||||
# plt.imshow(roi)
|
||||
# plt.show()
|
||||
im = transform(roi)
|
||||
im = im.view(1, 1, 28, 28)
|
||||
with torch.no_grad():
|
||||
logps = model(im)
|
||||
ps = torch.exp(logps)
|
||||
probab = list(ps.numpy()[0])
|
||||
code.append(probab.index(max(probab)))
|
||||
|
||||
|
||||
# cv2.imshow("Code", img)
|
||||
# cv2.waitKey()
|
||||
|
||||
return code
|
||||
|
38
data.py
@ -54,31 +54,31 @@ learning_data = [
|
||||
['white', 'rectangle', 25, 'small', 'Duplo'],
|
||||
['brown', 'jar', 500, 'big', 'GoOn'],
|
||||
['brown', 'jar', 470, 'big', 'Active Orzechowe'],
|
||||
['red', 'jar', 250, 'medium', 'Strawberry Jam'],
|
||||
['black', 'jar', 250, 'medium', 'Blackberry Jam'],
|
||||
['orange', 'jar', 250, 'medium', 'Peach Jam'],
|
||||
['brown', 'rectangle', 140, 'big', 'Jezyki classic'],
|
||||
['blue', 'rectangle', 140, 'big', 'Jezyki kokos'],
|
||||
['white', 'rectangle', 100, 'big', 'Kinder Chocolate'],
|
||||
['red', 'jar', 250, 'medium', 'Strawberry-Jam'],
|
||||
['black', 'jar', 250, 'medium', 'Blackberry-Jam'],
|
||||
['orange', 'jar', 250, 'medium', 'Peach-Jam'],
|
||||
['brown', 'rectangle', 140, 'big', 'Jezyki-classic'],
|
||||
['blue', 'rectangle', 140, 'big', 'Jezyki-kokos'],
|
||||
['white', 'rectangle', 100, 'big', 'Kinder-Chocolate'],
|
||||
['yellow', 'rectangle', 300, 'big', 'belVita'],
|
||||
['blue', 'rectangle', 380, 'big', 'Wedel-Ptasie Mleczko'],
|
||||
['purple', 'rectangle', 330, 'big', 'Milka-Alpejskie Mleczko'],
|
||||
['blue', 'rectangle', 380, 'big', 'Wedel-Ptasie-Mleczko'],
|
||||
['purple', 'rectangle', 330, 'big', 'Milka-Alpejskie-Mleczko'],
|
||||
['blue', 'rectangle', 294, 'big', 'Delicje'],
|
||||
['silver', 'pack', 280, 'big', 'Wawel-Michalki'],
|
||||
['red', 'rectangle', 50, 'medium', 'Krakuski Petit Beurre'],
|
||||
['white', 'egg', 20, 'small', 'Kinder Niespodzianka'],
|
||||
['brown', 'rectangle', 180, 'big', 'Familijne Wafle'],
|
||||
['red', 'rectangle', 235, 'big', 'dr Gerard PryncyPałki'],
|
||||
['white', 'rectangle', 25, 'medium', 'Nestlé Cini Minis Batonik'],
|
||||
['black', 'pack', 70, 'big', 'Korsarz Draże'],
|
||||
['white', 'rectangle', 50, 'medium', 'Góralki'],
|
||||
['white', 'rectangle', 24, 'medium', 'Kinder Country'],
|
||||
['red', 'rectangle', 50, 'medium', 'Krakuski-Petit-Beurre'],
|
||||
['white', 'egg', 20, 'small', 'Kinder-Niespodzianka'],
|
||||
['brown', 'rectangle', 180, 'big', 'Familijne-Wafle'],
|
||||
['red', 'rectangle', 235, 'big', 'dr-Gerard-PryncyPalki'],
|
||||
['white', 'rectangle', 25, 'medium', 'Nestle-Cini-Minis-Batonik'],
|
||||
['black', 'pack', 70, 'big', 'Korsarz-Draze'],
|
||||
['white', 'rectangle', 50, 'medium', 'Goralki'],
|
||||
['white', 'rectangle', 24, 'medium', 'Kinder-Country'],
|
||||
['red', 'rectangle', 46, 'medium', '3Bit'],
|
||||
['yellow', 'rectangle', 25, 'medium', 'Nestlé Nesquik Batonik'],
|
||||
['yellow', 'rectangle', 47, 'medium', 'Wedel WW'],
|
||||
['yellow', 'rectangle', 25, 'medium', 'Nestle-Nesquik-Batonik'],
|
||||
['yellow', 'rectangle', 47, 'medium', 'Wedel-WW'],
|
||||
['brown', 'rectangle', 30, 'medium', 'Lubisie'],
|
||||
['purple', 'rectangle', 22, 'small', 'Maoam'],
|
||||
['brown', 'rectangle', 294, 'medium', 'Grześki'],
|
||||
['brown', 'rectangle', 294, 'medium', 'Grzeski'],
|
||||
['white', 'rectangle', 250, 'big', 'merci'],
|
||||
]
|
||||
|
||||
|
3
field.py
@ -52,3 +52,6 @@ class Field:
|
||||
def addShelf(self):
|
||||
shelf = Shelf(len(self.shelves) + 1)
|
||||
self.shelves.append(shelf)
|
||||
|
||||
def isShelf(self):
|
||||
return self.is_shelf
|
BIN
img/shelves/black/black001.png
Normal file
After Width: | Height: | Size: 860 B |
BIN
img/shelves/black/black010.png
Normal file
After Width: | Height: | Size: 857 B |
BIN
img/shelves/black/black011.png
Normal file
After Width: | Height: | Size: 867 B |
BIN
img/shelves/black/black100.png
Normal file
After Width: | Height: | Size: 856 B |
BIN
img/shelves/black/black101.png
Normal file
After Width: | Height: | Size: 867 B |
BIN
img/shelves/black/black110.png
Normal file
After Width: | Height: | Size: 864 B |
BIN
img/shelves/black/black111.png
Normal file
After Width: | Height: | Size: 872 B |
BIN
img/shelves/blue/blue001.png
Normal file
After Width: | Height: | Size: 896 B |
BIN
img/shelves/blue/blue010.png
Normal file
After Width: | Height: | Size: 894 B |
BIN
img/shelves/blue/blue011.png
Normal file
After Width: | Height: | Size: 927 B |
BIN
img/shelves/blue/blue100.png
Normal file
After Width: | Height: | Size: 886 B |
BIN
img/shelves/blue/blue101.png
Normal file
After Width: | Height: | Size: 922 B |
BIN
img/shelves/blue/blue110.png
Normal file
After Width: | Height: | Size: 918 B |
BIN
img/shelves/blue/blue111.png
Normal file
After Width: | Height: | Size: 950 B |
BIN
img/shelves/brown/brown001.png
Normal file
After Width: | Height: | Size: 900 B |
BIN
img/shelves/brown/brown010.png
Normal file
After Width: | Height: | Size: 898 B |
BIN
img/shelves/brown/brown011.png
Normal file
After Width: | Height: | Size: 930 B |
BIN
img/shelves/brown/brown100.png
Normal file
After Width: | Height: | Size: 890 B |
BIN
img/shelves/brown/brown101.png
Normal file
After Width: | Height: | Size: 925 B |
BIN
img/shelves/brown/brown110.png
Normal file
After Width: | Height: | Size: 921 B |
BIN
img/shelves/brown/brown111.png
Normal file
After Width: | Height: | Size: 955 B |
BIN
img/shelves/gold/gold001.png
Normal file
After Width: | Height: | Size: 901 B |
BIN
img/shelves/gold/gold010.png
Normal file
After Width: | Height: | Size: 899 B |
BIN
img/shelves/gold/gold011.png
Normal file
After Width: | Height: | Size: 931 B |
BIN
img/shelves/gold/gold100.png
Normal file
After Width: | Height: | Size: 891 B |
BIN
img/shelves/gold/gold101.png
Normal file
After Width: | Height: | Size: 926 B |
BIN
img/shelves/gold/gold110.png
Normal file
After Width: | Height: | Size: 922 B |
BIN
img/shelves/gold/gold111.png
Normal file
After Width: | Height: | Size: 956 B |
BIN
img/shelves/orange/orange001.png
Normal file
After Width: | Height: | Size: 893 B |
BIN
img/shelves/orange/orange010.png
Normal file
After Width: | Height: | Size: 891 B |
BIN
img/shelves/orange/orange011.png
Normal file
After Width: | Height: | Size: 924 B |
BIN
img/shelves/orange/orange100.png
Normal file
After Width: | Height: | Size: 884 B |
BIN
img/shelves/orange/orange101.png
Normal file
After Width: | Height: | Size: 919 B |
BIN
img/shelves/orange/orange110.png
Normal file
After Width: | Height: | Size: 915 B |
BIN
img/shelves/orange/orange111.png
Normal file
After Width: | Height: | Size: 947 B |
BIN
img/shelves/purple/purple001.png
Normal file
After Width: | Height: | Size: 898 B |
BIN
img/shelves/purple/purple010.png
Normal file
After Width: | Height: | Size: 896 B |
BIN
img/shelves/purple/purple011.png
Normal file
After Width: | Height: | Size: 929 B |
BIN
img/shelves/purple/purple100.png
Normal file
After Width: | Height: | Size: 889 B |
BIN
img/shelves/purple/purple101.png
Normal file
After Width: | Height: | Size: 924 B |
BIN
img/shelves/purple/purple110.png
Normal file
After Width: | Height: | Size: 920 B |
BIN
img/shelves/purple/purple111.png
Normal file
After Width: | Height: | Size: 953 B |
BIN
img/shelves/red/red001.png
Normal file
After Width: | Height: | Size: 900 B |
BIN
img/shelves/red/red010.png
Normal file
After Width: | Height: | Size: 898 B |
BIN
img/shelves/red/red011.png
Normal file
After Width: | Height: | Size: 930 B |
BIN
img/shelves/red/red100.png
Normal file
After Width: | Height: | Size: 890 B |
BIN
img/shelves/red/red101.png
Normal file
After Width: | Height: | Size: 925 B |
BIN
img/shelves/red/red110.png
Normal file
After Width: | Height: | Size: 921 B |
BIN
img/shelves/red/red111.png
Normal file
After Width: | Height: | Size: 955 B |
BIN
img/shelves/silver/silver001.png
Normal file
After Width: | Height: | Size: 891 B |
BIN
img/shelves/silver/silver010.png
Normal file
After Width: | Height: | Size: 890 B |
BIN
img/shelves/silver/silver011.png
Normal file
After Width: | Height: | Size: 922 B |
BIN
img/shelves/silver/silver100.png
Normal file
After Width: | Height: | Size: 882 B |