3 Commits

Author SHA1 Message Date
glmdev
f60af7a9cc update 2019-02-09 15:38:10 -06:00
glmdev
2ffafa6719 update 2019-02-09 15:33:44 -06:00
glmdev
31c6293576 .env stuff 2019-02-09 03:50:39 -06:00
14 changed files with 144 additions and 115 deletions

1
.gitignore vendored
View File

@@ -1,6 +1,7 @@
### FIREBASE STUFF ### ### FIREBASE STUFF ###
hackku-*.json hackku-*.json
.env
# Created by https://www.gitignore.io/api/git,python,opencv,pycharm,visualstudio,visualstudiocode # Created by https://www.gitignore.io/api/git,python,opencv,pycharm,visualstudio,visualstudiocode
# Edit at https://www.gitignore.io/?templates=git,python,opencv,pycharm,visualstudio,visualstudiocode # Edit at https://www.gitignore.io/?templates=git,python,opencv,pycharm,visualstudio,visualstudiocode

124
.idea/workspace.xml generated
View File

@@ -1,23 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="f410c5c2-3ffe-4260-93eb-e3d83256d263" name="Default Changelist" comment=""> <list default="true" id="f410c5c2-3ffe-4260-93eb-e3d83256d263" name="Default Changelist" comment="" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<change beforePath="$PROJECT_DIR$/image_diff_color.py" beforeDir="false" afterPath="$PROJECT_DIR$/image_tools.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/index.py" beforeDir="false" afterPath="$PROJECT_DIR$/index.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" /> <option name="LAST_RESOLUTION" value="IGNORE" />
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="true"> <file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/index.py"> <entry file="file://$PROJECT_DIR$/index.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="270"> <state relative-caret-position="161">
<caret line="18" column="46" selection-start-line="18" selection-start-column="46" selection-end-line="18" selection-end-column="46" /> <caret line="30" column="54" selection-start-line="30" selection-start-column="54" selection-end-line="30" selection-end-column="54" />
<folding> <folding>
<element signature="e#0#21#0" expanded="true" /> <element signature="e#0#21#0" expanded="true" />
</folding> </folding>
@@ -25,6 +22,16 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-1-car.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-3-cars.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
</file>
<file pinned="false" current-in-tab="false"> <file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-5-cars-B.jpg"> <entry file="file://$PROJECT_DIR$/lib/test-images/lot-5-cars-B.jpg">
<provider selected="true" editor-type-id="images" /> <provider selected="true" editor-type-id="images" />
@@ -33,8 +40,8 @@
<file pinned="false" current-in-tab="false"> <file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/camera.py"> <entry file="file://$PROJECT_DIR$/camera.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165"> <state relative-caret-position="105">
<caret line="11" column="14" selection-start-line="11" selection-start-column="14" selection-end-line="11" selection-end-column="14" /> <caret line="7" column="44" selection-start-line="7" selection-start-column="44" selection-end-line="7" selection-end-column="44" />
<folding> <folding>
<element signature="e#0#13#0" expanded="true" /> <element signature="e#0#13#0" expanded="true" />
</folding> </folding>
@@ -45,8 +52,8 @@
<file pinned="false" current-in-tab="false"> <file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/.gitignore"> <entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15"> <state relative-caret-position="45">
<caret line="1" column="13" selection-start-line="1" selection-start-column="13" selection-end-line="1" selection-end-column="13" /> <caret line="3" column="4" selection-start-line="3" selection-start-column="4" selection-end-line="3" selection-end-column="4" />
</state> </state>
</provider> </provider>
</entry> </entry>
@@ -54,8 +61,35 @@
<file pinned="false" current-in-tab="false"> <file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/image_tools.py"> <entry file="file://$PROJECT_DIR$/image_tools.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-379"> <state relative-caret-position="45">
<caret line="27" column="1" selection-start-line="27" selection-start-column="1" selection-end-line="27" selection-end-column="1" /> <caret line="3" column="23" lean-forward="true" selection-start-line="3" selection-start-column="23" selection-end-line="3" selection-end-column="23" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/example.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="13" selection-start-line="2" selection-end-line="2" selection-end-column="13" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="15" selection-start-line="3" selection-start-column="15" selection-end-line="3" selection-end-column="15" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/config.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" selection-start-line="5" selection-end-line="5" />
</state> </state>
</provider> </provider>
</entry> </entry>
@@ -75,10 +109,14 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
<option value="$PROJECT_DIR$/.gitignore" />
<option value="$PROJECT_DIR$/image_diff_color.py" /> <option value="$PROJECT_DIR$/image_diff_color.py" />
<option value="$PROJECT_DIR$/.gitignore" />
<option value="$PROJECT_DIR$/config.py" />
<option value="$PROJECT_DIR$/example.env" />
<option value="$PROJECT_DIR$/camera.py" /> <option value="$PROJECT_DIR$/camera.py" />
<option value="$PROJECT_DIR$/image_tools.py" />
<option value="$PROJECT_DIR$/index.py" /> <option value="$PROJECT_DIR$/index.py" />
<option value="$PROJECT_DIR$/.env" />
</list> </list>
</option> </option>
</component> </component>
@@ -139,7 +177,7 @@
</component> </component>
<component name="TaskManager"> <component name="TaskManager">
<task active="true" id="Default" summary="Default task"> <task active="true" id="Default" summary="Default task">
<changelist id="57f4d31d-2726-4888-8d46-d2583bdc9c3d" name="Default Changelist" comment="" /> <changelist id="f410c5c2-3ffe-4260-93eb-e3d83256d263" name="Default Changelist" comment="" />
<created>1549681542752</created> <created>1549681542752</created>
<option name="number" value="Default" /> <option name="number" value="Default" />
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
@@ -176,26 +214,44 @@
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-empty.jpg"> <entry file="file://$PROJECT_DIR$/lib/test-images/lot-empty.jpg">
<provider selected="true" editor-type-id="images" /> <provider selected="true" editor-type-id="images" />
</entry> </entry>
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-3-cars.jpg"> <entry file="file://$PROJECT_DIR$/test.jpg" />
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/test.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/capture.jpg"> <entry file="file://$PROJECT_DIR$/capture.jpg">
<provider selected="true" editor-type-id="images" /> <provider selected="true" editor-type-id="images" />
</entry> </entry>
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-5-cars-B.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore"> <entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15"> <state relative-caret-position="45">
<caret line="1" column="13" selection-start-line="1" selection-start-column="13" selection-end-line="1" selection-end-column="13" /> <caret line="3" column="4" selection-start-line="3" selection-start-column="4" selection-end-line="3" selection-end-column="4" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/example.env">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="13" selection-start-line="2" selection-end-line="2" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" selection-start-line="5" selection-end-line="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/ref-img.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-3-cars.jpg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/camera.py"> <entry file="file://$PROJECT_DIR$/camera.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165"> <state relative-caret-position="105">
<caret line="11" column="14" selection-start-line="11" selection-start-column="14" selection-end-line="11" selection-end-column="14" /> <caret line="7" column="44" selection-start-line="7" selection-start-column="44" selection-end-line="7" selection-end-column="44" />
<folding> <folding>
<element signature="e#0#13#0" expanded="true" /> <element signature="e#0#13#0" expanded="true" />
</folding> </folding>
@@ -204,21 +260,25 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/image_tools.py"> <entry file="file://$PROJECT_DIR$/image_tools.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-379"> <state relative-caret-position="45">
<caret line="27" column="1" selection-start-line="27" selection-start-column="1" selection-end-line="27" selection-end-column="1" /> <caret line="3" column="23" lean-forward="true" selection-start-line="3" selection-start-column="23" selection-end-line="3" selection-end-column="23" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-1-car.jpg"> <entry file="file://$PROJECT_DIR$/lib/test-images/lot-1-car.jpg">
<provider selected="true" editor-type-id="images" /> <provider selected="true" editor-type-id="images" />
</entry> </entry>
<entry file="file://$PROJECT_DIR$/lib/test-images/lot-5-cars-B.jpg"> <entry file="file://$PROJECT_DIR$/.env">
<provider selected="true" editor-type-id="images" /> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="15" selection-start-line="3" selection-start-column="15" selection-end-line="3" selection-end-column="15" />
</state>
</provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/index.py"> <entry file="file://$PROJECT_DIR$/index.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="270"> <state relative-caret-position="161">
<caret line="18" column="46" selection-start-line="18" selection-start-column="46" selection-end-line="18" selection-end-column="46" /> <caret line="30" column="54" selection-start-line="30" selection-start-column="54" selection-end-line="30" selection-end-column="54" />
<folding> <folding>
<element signature="e#0#21#0" expanded="true" /> <element signature="e#0#21#0" expanded="true" />
</folding> </folding>

View File

@@ -2,10 +2,10 @@ import pygame
import pygame.camera import pygame.camera
def capture(): def capture(camera_stream = "/dev/video4"):
pygame.camera.init() pygame.camera.init()
pygame.camera.list_cameras() pygame.camera.list_cameras()
cam = pygame.camera.Camera('/dev/video4', (640, 480)) cam = pygame.camera.Camera(camera_stream, (640, 480))
cam.start() cam.start()
img = cam.get_image() img = cam.get_image()
pygame.image.save(img, './capture.jpg') pygame.image.save(img, './capture.jpg')

5
config.py Normal file
View File

@@ -0,0 +1,5 @@
from dotenv import load_dotenv
def bootstrap(envfile='./.env'):
load_dotenv(dotenv_path=envfile)

6
example.env Normal file
View File

@@ -0,0 +1,6 @@
POLL_FREQUENCY=15
FIREBASE_CERT_FILE="hackku-ffffffffffff.json"
CAMERA_DEVICE="/dev/video4"
LOT_NAME="Lot1"
REFERENCE_IMAGE="./lib/test-images/lot-empty.jpg"
E_HAT_TRIGGER_LEVEL=4

View File

@@ -1,10 +1,9 @@
from PIL import Image def average_color(x, y, w, h, image):
def average_color(x, y, n, image):
r, g, b = 0, 0, 0 r, g, b = 0, 0, 0
count = 0 count = 0
for s in range(x, x + n + 1): print([x, y, w, h])
for t in range(y, y + n + 1): for s in range(x, x + w + 1):
for t in range(y, y + h + 1):
pixlr, pixlg, pixlb = image[s, t] pixlr, pixlg, pixlb = image[s, t]
r += pixlr r += pixlr
g += pixlg g += pixlg
@@ -21,64 +20,3 @@ def differences(rgb_tuple1, rgb_tuple2):
def threshold(diff_tuple, trigger=4): def threshold(diff_tuple, trigger=4):
dr, dg, db = diff_tuple dr, dg, db = diff_tuple
return (((( dr**4 + dg**4 + db**4 ) / 3)**0.25) > trigger) # Thanks to Thomas Atkins, math whiz return (((( dr**4 + dg**4 + db**4 ) / 3)**0.25) > trigger) # Thanks to Thomas Atkins, math whiz
#
# reference_image = Image.open('./lib/test-images/lot-empty.jpg').load()
# compare_image = Image.open('./lib/test-images/lot-1-car.jpg').load()
#
# stall_1 = {
# 'location': (54, 79, 109),
# 'reference': average_color(54, 79, 109, reference_image),
# 'compare': average_color(54, 79, 109, compare_image)
# }
#
# stall_2 = {
# 'location': (186, 81, 116),
# 'reference': average_color(186, 81, 116, reference_image),
# 'compare': average_color(186, 81, 116, compare_image)
# }
#
# stall_3 = {
# 'location': (317, 71, 127),
# 'reference': average_color(317, 71, 127, reference_image),
# 'compare': average_color(317, 71, 127, compare_image)
# }
#
# stall_4 = {
# 'location': (469, 76, 100),
# 'reference': average_color(469, 76, 100, reference_image),
# 'compare': average_color(469, 76, 100, compare_image)
# }
#
# stall_5 = {
# 'location': (27, 237, 119),
# 'reference': average_color(27, 237, 119, reference_image),
# 'compare': average_color(27, 237, 119, compare_image)
# }
#
# stall_6 = {
# 'location': (172, 240, 130),
# 'reference': average_color(172, 240, 130, reference_image),
# 'compare': average_color(172, 240, 130, compare_image)
# }
#
# stall_7 = {
# 'location': (317, 234, 144),
# 'reference': average_color(317, 234, 144, reference_image),
# 'compare': average_color(317, 234, 144, compare_image)
# }
#
# stall_8 = {
# 'location': (481, 233, 112),
# 'reference': average_color(481, 233, 112, reference_image),
# 'compare': average_color(481, 233, 112, compare_image)
# }
#
# print(threshold(differences(stall_1['reference'], stall_1['compare'])))
# print(threshold(differences(stall_2['reference'], stall_2['compare'])))
# print(threshold(differences(stall_3['reference'], stall_3['compare'])))
# print(threshold(differences(stall_4['reference'], stall_4['compare'])))
# print(threshold(differences(stall_5['reference'], stall_5['compare'])))
# print(threshold(differences(stall_6['reference'], stall_6['compare'])))
# print(threshold(differences(stall_7['reference'], stall_7['compare'])))
# print(threshold(differences(stall_8['reference'], stall_8['compare'])))

View File

@@ -2,31 +2,50 @@ import firebase_admin
from firebase_admin import credentials from firebase_admin import credentials
from firebase_admin import firestore from firebase_admin import firestore
from PIL import Image from PIL import Image
import time
import os
import urllib.request
import camera import camera
import image_tools import image_tools
import config
config.bootstrap()
# Use a service account # Use a service account
cred = credentials.Certificate('./hackku-272b6e79b2a9.json') cred = credentials.Certificate(os.getenv('FIREBASE_CERT_FILE'))
firebase_admin.initialize_app(cred) firebase_admin.initialize_app(cred)
db = firestore.client() db = firestore.client()
doc_ref_lot1 = db.collection(u'Lot1') def poll():
doc_ref_lot = db.collection('lots').document(os.getenv('LOT_NAME'))
# Get the reference image
lot_info = doc_ref_lot.collection('info').document('lotInfo').get().to_dict()
urllib.request.urlretrieve('http://localhost:8000/img/references/'+lot_info['refImage'], './ref-img.jpg')
reference = Image.open('./ref-img.jpg').load()
# Take the picture # Take the picture
# img = Image.open(camera.capture()).load() #img = Image.open(camera.capture(os.getenv('CAMERA_DEVICE'))).load()
img = Image.open('./lib/test-images/lot-3-cars.jpg').load() img = Image.open('./lib/test-images-vert/lot-1-car.jpg').load()
reference = Image.open('./lib/test-images/lot-empty.jpg').load()
stalls = doc_ref_lot1.get() doc_ref_stalls = doc_ref_lot.collection('stalls').get()
for stall in stalls: for stall in doc_ref_stalls:
#print(u'{} => {}'.format(stall.id, stall.to_dict()))
stall_obj = stall.to_dict() stall_obj = stall.to_dict()
color_reference = image_tools.average_color(stall_obj['locationX'], stall_obj['locationY'], stall_obj['sideN'], reference) color_reference = image_tools.average_color(stall_obj['locationX'], stall_obj['locationY'], stall_obj['width'], stall_obj['height'], reference)
color_compare = image_tools.average_color(stall_obj['locationX'], stall_obj['locationY'], stall_obj['sideN'], img) color_compare = image_tools.average_color(stall_obj['locationX'], stall_obj['locationY'], stall_obj['width'], stall_obj['height'], img)
stall_occupied = image_tools.threshold(image_tools.differences(color_reference, color_compare)) stall_occupied = image_tools.threshold(image_tools.differences(color_reference, color_compare), float(os.getenv('E_HAT_TRIGGER_LEVEL')))
stall_obj['open'] = not stall_occupied stall_obj['open'] = not stall_occupied
print("Updated: "+stall.id)
db.collection(u'Lot1').document(stall.id).set( stall_obj ) doc_ref_lot.collection('stalls').document(stall.id).set(stall_obj)
start_time = time.time()
while True:
poll()
poll_time = float(os.getenv('POLL_FREQUENCY'))
time.sleep(poll_time - ((time.time() - start_time) % poll_time))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 51 KiB

BIN
ref-img.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB