Changes, hopeflly fixes + debug tools
This commit is contained in:
parent
5212e3aab2
commit
61d0418edf
5 changed files with 502 additions and 231 deletions
20
calibrate-capture.py
Normal file
20
calibrate-capture.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
c = cv2.VideoCapture(2)
|
||||||
|
# if not ding this we only have jittery 10fps
|
||||||
|
c.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
|
||||||
|
|
||||||
|
# set camera resoltion
|
||||||
|
c.set(3, 1280)
|
||||||
|
c.set(4, 720)
|
||||||
|
|
||||||
|
for i in range(15):
|
||||||
|
_,im = c.read()
|
||||||
|
cv2.imwrite('calibrate/left-{:06d}.png'.format(i), im)
|
||||||
|
cv2.imshow('left', im)
|
||||||
|
|
||||||
|
if cv2.waitKey(1000) & 0xFF == ord('q'):
|
||||||
|
break
|
||||||
|
|
||||||
|
c.release()
|
||||||
|
cv2.destroyAllWindows()
|
44
calibrate.py
Normal file
44
calibrate.py
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
import numpy as np
|
||||||
|
import cv2
|
||||||
|
import glob
|
||||||
|
|
||||||
|
# termination criteria
|
||||||
|
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 50, 0.001)
|
||||||
|
# criteria=cv2.CALIB_CB_FAST_CHECK
|
||||||
|
|
||||||
|
# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
|
||||||
|
objp = np.zeros((6*7,3), np.float32)
|
||||||
|
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
|
||||||
|
|
||||||
|
# Arrays to store object points and image points from all the images.
|
||||||
|
objpoints = [] # 3d point in real world space
|
||||||
|
imgpoints = [] # 2d points in image plane.
|
||||||
|
|
||||||
|
images = glob.glob('calibrate/*.png')
|
||||||
|
|
||||||
|
for fname in images:
|
||||||
|
print(fname)
|
||||||
|
img = cv2.imread(fname)
|
||||||
|
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
|
||||||
|
# gray = cv2.resize(gray, (640, 360))
|
||||||
|
|
||||||
|
# Find the chess board corners
|
||||||
|
ret, corners = cv2.findChessboardCorners(gray, (3,3),None)
|
||||||
|
print(ret)
|
||||||
|
|
||||||
|
# If found, add object points, image points (after refining them)
|
||||||
|
if ret == True:
|
||||||
|
objpoints.append(objp)
|
||||||
|
|
||||||
|
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
|
||||||
|
imgpoints.append(corners2)
|
||||||
|
|
||||||
|
# Draw and display the corners
|
||||||
|
img = cv2.drawChessboardCorners(gray, (7,6), corners2,ret)
|
||||||
|
cv2.imshow('img',img)
|
||||||
|
cv2.waitKey(5000)
|
||||||
|
|
||||||
|
cv2.destroyAllWindows()
|
||||||
|
|
||||||
|
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
|
||||||
|
print(ret, mtx, dist, rvecs, tvecs)
|
131
get_coordinates.py
Normal file
131
get_coordinates.py
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
import pickle
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
metricsSize = [960,600]
|
||||||
|
screenDrawCorners = np.array([[0,0], [metricsSize[0]-1,0], [0, metricsSize[1]-1], [metricsSize[0]-1,metricsSize[1]-1]])
|
||||||
|
|
||||||
|
def create_perspective_transform_matrix(src, dst):
|
||||||
|
""" Creates a perspective transformation matrix which transforms points
|
||||||
|
in quadrilateral ``src`` to the corresponding points on quadrilateral
|
||||||
|
``dst``.
|
||||||
|
|
||||||
|
Will raise a ``np.linalg.LinAlgError`` on invalid input.
|
||||||
|
"""
|
||||||
|
# See:
|
||||||
|
# * http://xenia.media.mit.edu/~cwren/interpolator/
|
||||||
|
# * http://stackoverflow.com/a/14178717/71522
|
||||||
|
in_matrix = []
|
||||||
|
for (x, y), (X, Y) in zip(src, dst):
|
||||||
|
in_matrix.extend([
|
||||||
|
[x, y, 1, 0, 0, 0, -X * x, -X * y],
|
||||||
|
[0, 0, 0, x, y, 1, -Y * x, -Y * y],
|
||||||
|
])
|
||||||
|
|
||||||
|
A = np.matrix(in_matrix, dtype=np.float)
|
||||||
|
B = np.array(dst).reshape(8)
|
||||||
|
af = np.dot(np.linalg.inv(A.T * A) * A.T, B)
|
||||||
|
m = np.append(np.array(af).reshape(8), 1).reshape((3, 3))
|
||||||
|
return m
|
||||||
|
|
||||||
|
# got this amazing thing from here: https://stackoverflow.com/a/24088499
|
||||||
|
def create_perspective_transform(src, dst, round=False, splat_args=False):
|
||||||
|
""" Returns a function which will transform points in quadrilateral
|
||||||
|
``src`` to the corresponding points on quadrilateral ``dst``::
|
||||||
|
|
||||||
|
>>> transform = create_perspective_transform(
|
||||||
|
... [(0, 0), (10, 0), (10, 10), (0, 10)],
|
||||||
|
... [(50, 50), (100, 50), (100, 100), (50, 100)],
|
||||||
|
... )
|
||||||
|
>>> transform((5, 5))
|
||||||
|
(74.99999999999639, 74.999999999999957)
|
||||||
|
|
||||||
|
If ``round`` is ``True`` then points will be rounded to the nearest
|
||||||
|
integer and integer values will be returned.
|
||||||
|
|
||||||
|
>>> transform = create_perspective_transform(
|
||||||
|
... [(0, 0), (10, 0), (10, 10), (0, 10)],
|
||||||
|
... [(50, 50), (100, 50), (100, 100), (50, 100)],
|
||||||
|
... round=True,
|
||||||
|
... )
|
||||||
|
>>> transform((5, 5))
|
||||||
|
(75, 75)
|
||||||
|
|
||||||
|
If ``splat_args`` is ``True`` the function will accept two arguments
|
||||||
|
instead of a tuple.
|
||||||
|
|
||||||
|
>>> transform = create_perspective_transform(
|
||||||
|
... [(0, 0), (10, 0), (10, 10), (0, 10)],
|
||||||
|
... [(50, 50), (100, 50), (100, 100), (50, 100)],
|
||||||
|
... splat_args=True,
|
||||||
|
... )
|
||||||
|
>>> transform(5, 5)
|
||||||
|
(74.99999999999639, 74.999999999999957)
|
||||||
|
|
||||||
|
If the input values yield an invalid transformation matrix an identity
|
||||||
|
function will be returned and the ``error`` attribute will be set to a
|
||||||
|
description of the error::
|
||||||
|
|
||||||
|
>>> tranform = create_perspective_transform(
|
||||||
|
... np.zeros((4, 2)),
|
||||||
|
... np.zeros((4, 2)),
|
||||||
|
... )
|
||||||
|
>>> transform((5, 5))
|
||||||
|
(5.0, 5.0)
|
||||||
|
>>> transform.error
|
||||||
|
'invalid input quads (...): Singular matrix
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
transform_matrix = create_perspective_transform_matrix(src, dst)
|
||||||
|
error = None
|
||||||
|
except np.linalg.LinAlgError as e:
|
||||||
|
transform_matrix = np.identity(3, dtype=np.float)
|
||||||
|
error = "invalid input quads (%s and %s): %s" %(src, dst, e)
|
||||||
|
error = error.replace("\n", "")
|
||||||
|
|
||||||
|
to_eval = "def perspective_transform(%s):\n" %(
|
||||||
|
splat_args and "*pt" or "pt",
|
||||||
|
)
|
||||||
|
to_eval += " res = np.dot(transform_matrix, ((pt[0], ), (pt[1], ), (1, )))\n"
|
||||||
|
to_eval += " res = res / res[2]\n"
|
||||||
|
if round:
|
||||||
|
to_eval += " return (int(round(res[0][0])), int(round(res[1][0])))\n"
|
||||||
|
else:
|
||||||
|
to_eval += " return (res[0][0], res[1][0])\n"
|
||||||
|
locals = {
|
||||||
|
"transform_matrix": transform_matrix,
|
||||||
|
}
|
||||||
|
locals.update(globals())
|
||||||
|
exec to_eval in locals, locals
|
||||||
|
res = locals["perspective_transform"]
|
||||||
|
res.matrix = transform_matrix
|
||||||
|
res.error = error
|
||||||
|
return res
|
||||||
|
|
||||||
|
def coordinatesToSrc(coordinates):
|
||||||
|
return np.array([coordinates['tl'], coordinates['tr'],coordinates['bl'], coordinates['br']])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("Coordinates in pickle file:")
|
||||||
|
with open('coordinates.p', 'r') as fp:
|
||||||
|
c = pickle.load(fp)
|
||||||
|
for name, coord in c.items():
|
||||||
|
print("\t", name, coord[0], coord[1])
|
||||||
|
|
||||||
|
transform = create_perspective_transform(coordinatesToSrc(c), screenDrawCorners, True)
|
||||||
|
|
||||||
|
print("Metrics")
|
||||||
|
print(metricsSize)
|
||||||
|
|
||||||
|
print("Test halfway point:")
|
||||||
|
x = ((c['tl'][0]+c['bl'][0])/2 + (c['tr'][0]+c['br'][0])/2) / 2
|
||||||
|
y = ((c['tl'][1]+c['tr'][1])/2 + (c['bl'][1]+c['br'][1])/2) / 2
|
||||||
|
print("\t",x,y)
|
||||||
|
print(transform((x,y)))
|
||||||
|
|
||||||
|
print("tl", transform((c['tl'])))
|
||||||
|
print("tr", transform((c['tr'])))
|
||||||
|
print("bl", transform((c['bl'])))
|
||||||
|
print("br", transform((c['br'])))
|
||||||
|
|
||||||
|
|
123
head_pose.py
123
head_pose.py
|
@ -76,6 +76,11 @@ argParser.add_argument(
|
||||||
default=4,
|
default=4,
|
||||||
help="Nr of total processes (min 3)"
|
help="Nr of total processes (min 3)"
|
||||||
)
|
)
|
||||||
|
argParser.add_argument(
|
||||||
|
'--only-metrics',
|
||||||
|
action="store_true",
|
||||||
|
help="Render only metrics instead of the heatmap. Convenient for debugging."
|
||||||
|
)
|
||||||
|
|
||||||
args = argParser.parse_args()
|
args = argParser.parse_args()
|
||||||
|
|
||||||
|
@ -88,10 +93,7 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# im = cv2.imread("headPose.jpg");
|
# im = cv2.imread("headPose.jpg");
|
||||||
|
|
||||||
spotSize = (100,100)
|
|
||||||
spot = Image.open(os.path.join(cur_dir,"spot.png")).convert('L')
|
|
||||||
spot = spot.resize(spotSize)
|
|
||||||
spot = np.array(spot)
|
|
||||||
|
|
||||||
|
|
||||||
predictor_path = os.path.join(cur_dir,"shape_predictor_68_face_landmarks.dat")
|
predictor_path = os.path.join(cur_dir,"shape_predictor_68_face_landmarks.dat")
|
||||||
|
@ -106,11 +108,28 @@ screenDrawCorners = np.array([[10,60], [90, 60], [10, 110], [90, 110]])
|
||||||
|
|
||||||
# metrics matrix
|
# metrics matrix
|
||||||
metricsSize = [1920,1080]
|
metricsSize = [1920,1080]
|
||||||
metricsSize = [1280,800]
|
# metricsSize = [1280,800]
|
||||||
metricsSize = [960,600]
|
# metricsSize = [960,600]
|
||||||
|
metricsSize = [1080,1080] # no point in having it different from to the render size
|
||||||
dataframe = pd.DataFrame(columns=['x','y'])
|
dataframe = pd.DataFrame(columns=['x','y'])
|
||||||
|
|
||||||
renderSize = [1280,800]
|
renderSize = [1280,800]
|
||||||
|
renderSize = [1080,1080]
|
||||||
|
|
||||||
|
# Used to create a black backdrop, instead of the ugly Qt-gray, if neccessary
|
||||||
|
screenSize = [1920,1080]
|
||||||
|
|
||||||
|
spotS = int(100./720*renderSize[1])
|
||||||
|
spotSize = (spotS, spotS)
|
||||||
|
|
||||||
|
spot = Image.open(os.path.join(cur_dir,"spot.png")).convert('L')
|
||||||
|
spot = spot.resize(spotSize)
|
||||||
|
spot = np.array(spot)
|
||||||
|
|
||||||
|
backdrop = None
|
||||||
|
if screenSize != renderSize:
|
||||||
|
shape = [screenSize[1],screenSize[0], 3]
|
||||||
|
backdrop = np.zeros(shape, dtype=np.uint8)
|
||||||
|
|
||||||
metrics = None
|
metrics = None
|
||||||
if lastMetricsFilename and os.path.isfile(lastMetricsFilename):
|
if lastMetricsFilename and os.path.isfile(lastMetricsFilename):
|
||||||
|
@ -231,7 +250,7 @@ def coordinatesToSrc(coordinates):
|
||||||
# coordinates of the screen boundaries
|
# coordinates of the screen boundaries
|
||||||
if os.path.exists("coordinates.p"):
|
if os.path.exists("coordinates.p"):
|
||||||
coordinates = pickle.load(open("coordinates.p", "rb"))
|
coordinates = pickle.load(open("coordinates.p", "rb"))
|
||||||
transform = create_perspective_transform(coordinatesToSrc(coordinates), screenDrawCorners)
|
transform = create_perspective_transform(coordinatesToSrc(coordinates), screenDrawCorners, True)
|
||||||
|
|
||||||
a = [np.array([ 1312.15541183]), np.array([ 244.56278002]), 0]
|
a = [np.array([ 1312.15541183]), np.array([ 244.56278002]), 0]
|
||||||
logger.info("Loaded coordinates: %s", coordinatesToSrc(coordinates))
|
logger.info("Loaded coordinates: %s", coordinatesToSrc(coordinates))
|
||||||
|
@ -306,6 +325,7 @@ def captureFacesPoints(i):
|
||||||
|
|
||||||
# We use this later for calibrating
|
# We use this later for calibrating
|
||||||
currentPoint = None
|
currentPoint = None
|
||||||
|
currentVectors = None
|
||||||
currentPoints = []
|
currentPoints = []
|
||||||
|
|
||||||
if len(dets) > 0:
|
if len(dets) > 0:
|
||||||
|
@ -420,13 +440,14 @@ def captureFacesPoints(i):
|
||||||
# x = translation_vector[0] + rotation_vector[0]* a
|
# x = translation_vector[0] + rotation_vector[0]* a
|
||||||
# y = translation_vector[1] + rotation_vector[1] * a
|
# y = translation_vector[1] + rotation_vector[1] * a
|
||||||
# logger.warn("First {} {},{}".format(a,x,y))
|
# logger.warn("First {} {},{}".format(a,x,y))
|
||||||
a = - translation_vector[2]# / viewDirectionVector[2]
|
a = translation_vector[2] / viewDirectionVector[2]
|
||||||
x = translation_vector[0] + viewDirectionVector[0] * a
|
x = translation_vector[0] + viewDirectionVector[0] * a
|
||||||
y = translation_vector[1] + viewDirectionVector[1] * a
|
y = translation_vector[1] + viewDirectionVector[1] * a
|
||||||
# logger.warn("Second {} {},{}".format(a,x,y))
|
# logger.warn("Second {} {},{}".format(a,x,y))
|
||||||
point = np.array([x,y])
|
point = np.array([x,y])
|
||||||
|
|
||||||
currentPoint = point
|
currentPoint = point
|
||||||
|
currentVectors = {'translation': translation_vector, 'rotation': viewDirectionVector}
|
||||||
currentPoints.append(point)
|
currentPoints.append(point)
|
||||||
|
|
||||||
td3 = time.time()
|
td3 = time.time()
|
||||||
|
@ -434,7 +455,7 @@ def captureFacesPoints(i):
|
||||||
|
|
||||||
# TODO only draw nose line now, so we can change color depending whether on screen or not
|
# TODO only draw nose line now, so we can change color depending whether on screen or not
|
||||||
|
|
||||||
results = {'currentPoint': currentPoint, 'currentPoints': currentPoints}
|
results = {'currentPoint': currentPoint, 'currentPoints': currentPoints, 'currentVectors': currentVectors}
|
||||||
results['im'] = im if not args.hide_preview else None
|
results['im'] = im if not args.hide_preview else None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -445,11 +466,14 @@ def captureFacesPoints(i):
|
||||||
|
|
||||||
def captureVideo():
|
def captureVideo():
|
||||||
c = cv2.VideoCapture(args.camera)
|
c = cv2.VideoCapture(args.camera)
|
||||||
|
# if not ding this we only have jittery 10fps
|
||||||
|
c.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
|
||||||
|
|
||||||
# set camera resoltion
|
# set camera resoltion
|
||||||
# c.set(3, 1280)
|
c.set(3, 1280)
|
||||||
# c.set(4, 720)
|
c.set(4, 720)
|
||||||
c.set(3, 960)
|
# c.set(3, 960)
|
||||||
c.set(4, 540)
|
# c.set(4, 540)
|
||||||
logger.debug("Camera FPS: {}".format(c.get(5)))
|
logger.debug("Camera FPS: {}".format(c.get(5)))
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
@ -462,6 +486,7 @@ def captureVideo():
|
||||||
logger.debug("Que sizes: image: {}, points: {} ".format(photoQueue.qsize(), pointsQueue.qsize()))
|
logger.debug("Que sizes: image: {}, points: {} ".format(photoQueue.qsize(), pointsQueue.qsize()))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
processes = []
|
processes = []
|
||||||
for i in range(args.processes - 2):
|
for i in range(args.processes - 2):
|
||||||
p = multiprocessing.Process(target=captureFacesPoints, args=(i,))
|
p = multiprocessing.Process(target=captureFacesPoints, args=(i,))
|
||||||
|
@ -479,16 +504,18 @@ lastRunTime = 0
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
result = None
|
result = None
|
||||||
try:
|
|
||||||
te1 = time.time()
|
te1 = time.time()
|
||||||
|
try:
|
||||||
result = pointsQueue.get()
|
result = pointsQueue.get()
|
||||||
te1b = time.time()
|
te1b = time.time()
|
||||||
im = result['im']
|
im = result['im']
|
||||||
currentPoint = result['currentPoint']
|
currentPoint = result['currentPoint']
|
||||||
currentPoints = result['currentPoints']
|
currentPoints = result['currentPoints']
|
||||||
|
currentVectors = result['currentVectors']
|
||||||
except queue.Empty as e:
|
except queue.Empty as e:
|
||||||
logger.warn('Result queue empty')
|
logger.warn('Result queue empty')
|
||||||
|
|
||||||
|
tr1 = time.time()
|
||||||
if result is not None:
|
if result is not None:
|
||||||
if not args.hide_preview:
|
if not args.hide_preview:
|
||||||
# draw little floorplan for 10 -> 50, sideplan 60 -> 100 (40x40 px)
|
# draw little floorplan for 10 -> 50, sideplan 60 -> 100 (40x40 px)
|
||||||
|
@ -528,9 +555,13 @@ while True:
|
||||||
targetInt = (int(targetPoint[0]), int(targetPoint[1]))
|
targetInt = (int(targetPoint[0]), int(targetPoint[1]))
|
||||||
# check if point fits on screen:
|
# check if point fits on screen:
|
||||||
# if so, measure it
|
# if so, measure it
|
||||||
if targetInt[0]+spotSize[0] >= 0 and targetInt[1]+spotSize[1] >= 0 and targetInt[0]-spotSize[0] < metricsSize[0] and targetInt[1]-spotSize[0] < metricsSize[1]:
|
if targetInt[0]+spotSize[0] >= 0 and targetInt[1]+spotSize[1] >= 0 and targetInt[0]-spotSize[0] < metricsSize[0] and targetInt[1]-spotSize[1] < metricsSize[1]:
|
||||||
|
if not args.hide_graph:
|
||||||
dataframe = dataframe.append({'x':targetInt[0],'y':targetInt[1]}, ignore_index=True)
|
dataframe = dataframe.append({'x':targetInt[0],'y':targetInt[1]}, ignore_index=True)
|
||||||
logger.info("Put metric {},{} in metrix of {},{}".format(targetInt[1],targetInt[0], metricsSize[1], metricsSize[0]))
|
|
||||||
|
logger.info("Put metric {},{} in metrics of {},{}".format(targetInt[1],targetInt[0], metricsSize[1], metricsSize[0]))
|
||||||
|
# newMetrics[targetInt[1]-1,targetInt[0]-1] += 1
|
||||||
|
|
||||||
#TODO: make it one numpy array action:
|
#TODO: make it one numpy array action:
|
||||||
for sx in range(spotSize[0]):
|
for sx in range(spotSize[0]):
|
||||||
for sy in range(spotSize[1]):
|
for sy in range(spotSize[1]):
|
||||||
|
@ -539,7 +570,6 @@ while True:
|
||||||
|
|
||||||
if mx >= 0 and my >= 0 and mx < metricsSize[0] and my < metricsSize[1]:
|
if mx >= 0 and my >= 0 and mx < metricsSize[0] and my < metricsSize[1]:
|
||||||
newMetrics[my,mx] += spot[sx,sy] #/ 20
|
newMetrics[my,mx] += spot[sx,sy] #/ 20
|
||||||
# print("MAX",np.max(newMetrics))
|
|
||||||
|
|
||||||
|
|
||||||
# after we collected all new metrics, blur them foor smoothness
|
# after we collected all new metrics, blur them foor smoothness
|
||||||
|
@ -555,12 +585,12 @@ while True:
|
||||||
if result is not None and not args.hide_preview:
|
if result is not None and not args.hide_preview:
|
||||||
cv2.imshow("Output", im)
|
cv2.imshow("Output", im)
|
||||||
te3 = time.time()
|
te3 = time.time()
|
||||||
|
logger.debug("Pre processing took: {}s".format(te2-tr1))
|
||||||
logger.debug("showed webcam image in %fs", te3-te2)
|
logger.debug("showed webcam image in %fs", te3-te2)
|
||||||
logger.debug("Rendering took %fs", te3-te1)
|
logger.debug("Rendering took %fs", te3-te1)
|
||||||
logger.debug("Waited took %fs", te1b-te1)
|
logger.debug("Waited took %fs", te1b-te1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# blur smooth the heatmap
|
# blur smooth the heatmap
|
||||||
# logger.debug("Max blurred metrics: %f", np.max(metrics))
|
# logger.debug("Max blurred metrics: %f", np.max(metrics))
|
||||||
|
|
||||||
|
@ -568,7 +598,6 @@ while True:
|
||||||
tm21 = time.time()
|
tm21 = time.time()
|
||||||
t = tm21
|
t = tm21
|
||||||
|
|
||||||
|
|
||||||
diffT = min(1, t - lastRunTime)
|
diffT = min(1, t - lastRunTime)
|
||||||
lastRunTime = t
|
lastRunTime = t
|
||||||
# animDuration = 1
|
# animDuration = 1
|
||||||
|
@ -581,15 +610,65 @@ while True:
|
||||||
# smooth impact of first hits by having at least 0.05
|
# smooth impact of first hits by having at least 0.05
|
||||||
normalisedMetrics = metrics / (max(255*7 ,np.max(metrics)))
|
normalisedMetrics = metrics / (max(255*7 ,np.max(metrics)))
|
||||||
# convert to colormap, thanks to: https://stackoverflow.com/a/10967471
|
# convert to colormap, thanks to: https://stackoverflow.com/a/10967471
|
||||||
|
|
||||||
|
if args.only_metrics:
|
||||||
|
# output only metrics instead of heatmap. Usefull for debugging O:)
|
||||||
|
nmax = np.max(newMetrics)
|
||||||
|
renderMetrics = newMetrics/nmax if nmax > 0 else newMetrics
|
||||||
|
normalisedMetricsColored = np.uint8(renderMetrics *255 )
|
||||||
|
normalisedMetricsColoredBGR = cv2.cvtColor(normalisedMetricsColored, cv2.COLOR_GRAY2BGR)
|
||||||
|
# draw grid lines
|
||||||
|
for i in range(int(metricsSize[0]/100)):
|
||||||
|
cv2.line(normalisedMetricsColoredBGR, (i*100, 0), (i*100, metricsSize[1]), (150,150,150), 1)
|
||||||
|
else:
|
||||||
normalisedMetricsColored = np.uint8(cm.nipy_spectral(normalisedMetrics)*255)
|
normalisedMetricsColored = np.uint8(cm.nipy_spectral(normalisedMetrics)*255)
|
||||||
normalisedMetricsColoredBGR = cv2.cvtColor(normalisedMetricsColored, cv2.COLOR_RGB2BGR)
|
normalisedMetricsColoredBGR = cv2.cvtColor(normalisedMetricsColored, cv2.COLOR_RGB2BGR)
|
||||||
|
|
||||||
|
|
||||||
|
if currentPoint is not None and args.verbose:
|
||||||
|
cv2.putText(normalisedMetricsColoredBGR, "x: {}".format(currentPoint[0]), (10,70), cv2.FONT_HERSHEY_PLAIN, .7, (255,255,255))
|
||||||
|
cv2.putText(normalisedMetricsColoredBGR, "y: {}".format(currentPoint[1]), (10,90), cv2.FONT_HERSHEY_PLAIN, .7, (255,255,255))
|
||||||
|
|
||||||
|
cv2.putText(normalisedMetricsColoredBGR, "pos: x: {}, y: {}, z: {}".format(
|
||||||
|
currentVectors['translation'][0],
|
||||||
|
currentVectors['translation'][1],
|
||||||
|
currentVectors['translation'][2]
|
||||||
|
), (10,110), cv2.FONT_HERSHEY_PLAIN, .7, (255,255,255))
|
||||||
|
cv2.putText(
|
||||||
|
normalisedMetricsColoredBGR,
|
||||||
|
"rot: x: {}, y: {}, z{}".format(
|
||||||
|
currentVectors['rotation'][0],
|
||||||
|
currentVectors['rotation'][1],
|
||||||
|
currentVectors['rotation'][2],
|
||||||
|
), (10,130), cv2.FONT_HERSHEY_PLAIN, .7, (255,255,255))
|
||||||
|
targetPoint = transform(currentPoint)
|
||||||
|
logger.info("Are we really looking at {}".format(targetPoint))
|
||||||
|
logger.info("Size: {}".format(normalisedMetricsColoredBGR.shape))
|
||||||
|
cv2.circle(normalisedMetricsColoredBGR, targetPoint, 2, (0,255,0), -1)
|
||||||
|
cv2.line(
|
||||||
|
normalisedMetricsColoredBGR,
|
||||||
|
(metricsSize[0]/2,metricsSize[1]/2),
|
||||||
|
tuple(targetPoint),
|
||||||
|
(255,0,0), 2
|
||||||
|
)
|
||||||
|
|
||||||
|
# cv2.putText(normalisedMetricsColoredBGR, "z: {}".format(currentPoint[2]), (10,70), cv2.FONT_HERSHEY_PLAIN, .7, (255,255,255))
|
||||||
|
|
||||||
tm22 = time.time()
|
tm22 = time.time()
|
||||||
logger.debug("Max normalised metrics: %f", np.max(normalisedMetrics))
|
logger.debug("Max normalised metrics: %f", np.max(normalisedMetrics))
|
||||||
# logger.info(normalisedMetrics)
|
# logger.info(normalisedMetrics)
|
||||||
tm23 = time.time()
|
tm23 = time.time()
|
||||||
|
|
||||||
cv2.imshow("test",normalisedMetricsColoredBGR)
|
# normalisedMetricsColoredBGR = cv2.resize(normalisedMetricsColoredBGR, tuple(renderSize))
|
||||||
|
if backdrop is not None:
|
||||||
|
dx = (screenSize[0] - renderSize[0]) / 2
|
||||||
|
dy = (screenSize[1] - renderSize[1]) / 2
|
||||||
|
print(dx, dy)
|
||||||
|
backdrop[dy:dy+renderSize[1], dx:dx+renderSize[0]] = normalisedMetricsColoredBGR
|
||||||
|
renderImage = backdrop
|
||||||
|
else:
|
||||||
|
renderImage = normalisedMetricsColoredBGR
|
||||||
|
cv2.imshow("test", renderImage)
|
||||||
# image = Image.fromarray(normalisedMetricsColored)
|
# image = Image.fromarray(normalisedMetricsColored)
|
||||||
# wpercent = (imageWindowSize[0] / float(image.size[0]))
|
# wpercent = (imageWindowSize[0] / float(image.size[0]))
|
||||||
# hsize = int((float(image.size[1]) * float(wpercent)))
|
# hsize = int((float(image.size[1]) * float(wpercent)))
|
||||||
|
@ -607,7 +686,7 @@ while True:
|
||||||
# imagesprite = imageCanvas.create_image(renderSize[0]/2, renderSize[1]/2,image=tkpi, tags="IMG")
|
# imagesprite = imageCanvas.create_image(renderSize[0]/2, renderSize[1]/2,image=tkpi, tags="IMG")
|
||||||
# imageWindowRoot.update()
|
# imageWindowRoot.update()
|
||||||
tm24 = time.time()
|
tm24 = time.time()
|
||||||
logger.debug("PIL image generated in %fs", tm24 - tm23)
|
logger.debug("Render in generated in %fs", tm24 - tm23)
|
||||||
# logger.debug("Total matrix time is %fs", tm4 - tm3 + tm2 - tm1 + tm24 - tm21)
|
# logger.debug("Total matrix time is %fs", tm4 - tm3 + tm2 - tm1 + tm24 - tm21)
|
||||||
|
|
||||||
if not args.hide_graph:
|
if not args.hide_graph:
|
||||||
|
@ -677,7 +756,7 @@ while True:
|
||||||
pickle.dump( coordinates, open( "coordinates.p", "wb" ) )
|
pickle.dump( coordinates, open( "coordinates.p", "wb" ) )
|
||||||
logger.info("Saved coordinates")
|
logger.info("Saved coordinates")
|
||||||
|
|
||||||
transform = create_perspective_transform(coordinatesToSrc(coordinates), screenDrawCorners)
|
transform = create_perspective_transform(coordinatesToSrc(coordinates), screenDrawCorners, True)
|
||||||
|
|
||||||
duration = time.time()-te1
|
duration = time.time()-te1
|
||||||
fps = 1/duration
|
fps = 1/duration
|
||||||
|
|
3
output/.gitignore
vendored
3
output/.gitignore
vendored
|
@ -1,3 +0,0 @@
|
||||||
*
|
|
||||||
!.gitignore
|
|
||||||
|
|
Loading…
Reference in a new issue