|
|
# -*- coding: utf-8 -*-
|
|
|
import cv2 as cv
|
|
|
import numpy as np
|
|
|
import sys
|
|
|
import math
|
|
|
from matplotlib import pyplot as plt
|
|
|
import os
|
|
|
|
|
|
filename = "D:/dataset/gt-4622.png"
|
|
|
if (len(sys.argv) > 1):
|
|
|
filename = str(sys.argv[1])
|
|
|
|
|
|
fname, file_extension = os.path.splitext(filename)
|
|
|
|
|
|
height = 0
|
|
|
width = 0
|
|
|
|
|
|
i = []
|
|
|
if file_extension.lower() == ".raw":
|
|
|
f = open(filename,"r")
|
|
|
i = np.fromfile(f, dtype='uint16', sep="")
|
|
|
f.close()
|
|
|
|
|
|
size = i.shape[0]
|
|
|
if (size / 1280 == 720):
|
|
|
height = 720
|
|
|
width = 1280
|
|
|
elif (size / 848 == 480):
|
|
|
height = 480
|
|
|
width = 848
|
|
|
elif (size / 640 == 480):
|
|
|
height = 480
|
|
|
width = 640
|
|
|
else:
|
|
|
print("Unknown dimentions")
|
|
|
if file_extension.lower() == ".png":
|
|
|
i = cv.imread(filename, -1).astype(np.uint16)
|
|
|
width = i.shape[1]
|
|
|
height = i.shape[0]
|
|
|
|
|
|
m = np.percentile(i, 5)
|
|
|
M = np.percentile(i, 95)
|
|
|
|
|
|
i = i.reshape([height, width])
|
|
|
|
|
|
orig = i.copy()
|
|
|
|
|
|
x0 = 0
|
|
|
y0 = 0
|
|
|
x1 = 0
|
|
|
y1 = 0
|
|
|
xx = 0
|
|
|
yy = 0
|
|
|
mx = 0
|
|
|
Mx = 0
|
|
|
my = 0
|
|
|
My = 0
|
|
|
|
|
|
def click_and_crop(event, x, y, flags, param):
|
|
|
global x0
|
|
|
global y0
|
|
|
global x1
|
|
|
global y1
|
|
|
global xx
|
|
|
global yy
|
|
|
global orig
|
|
|
global mx, my, Mx, My
|
|
|
|
|
|
xx = x
|
|
|
yy = y
|
|
|
|
|
|
if event == cv.EVENT_LBUTTONDOWN:
|
|
|
return
|
|
|
# check to see if the left mouse button was released
|
|
|
elif event == cv.EVENT_LBUTTONUP:
|
|
|
if (x0 == 0):
|
|
|
x0 = x
|
|
|
y0 = y
|
|
|
else:
|
|
|
if (x1 == 0):
|
|
|
x1 = x
|
|
|
y1 = y
|
|
|
|
|
|
mx = min(x0, x1)
|
|
|
Mx = max(x0, x1)
|
|
|
my = min(y0, y1)
|
|
|
My = max(y0, y1)
|
|
|
else:
|
|
|
x0 = x
|
|
|
y0 = y
|
|
|
x1 = 0
|
|
|
y1 = 0
|
|
|
mx = 0
|
|
|
Mx = 0
|
|
|
my = 0
|
|
|
My = 0
|
|
|
# record the ending (x, y) coordinates and indicate that
|
|
|
return
|
|
|
|
|
|
cv.namedWindow("image")
|
|
|
cv.setMouseCallback("image", click_and_crop)
|
|
|
|
|
|
i = np.divide(i, np.array([M - m], dtype=np.float)).astype(np.float)
|
|
|
i = (i - m).astype(np.float)
|
|
|
|
|
|
i8 = (i * 255.0).astype(np.uint8)
|
|
|
|
|
|
if i8.ndim == 3:
|
|
|
i8 = cv.cvtColor(i8, cv.COLOR_BGRA2GRAY)
|
|
|
|
|
|
i8 = cv.equalizeHist(i8)
|
|
|
|
|
|
colorized = cv.applyColorMap(i8, cv.COLORMAP_JET)
|
|
|
|
|
|
colorized[i8 == int(m)] = 0
|
|
|
|
|
|
font = cv.FONT_HERSHEY_COMPLEX_SMALL
|
|
|
colorized = cv.putText(colorized, str(m) + " .. " + str(M), (20,50), font, 1, (255, 255, 255), 2, cv.LINE_AA)
|
|
|
|
|
|
while cv.getWindowProperty('image', 0) >= 0:
|
|
|
im = colorized.copy()
|
|
|
|
|
|
if (x0 > 0 and x1 == 0):
|
|
|
im = cv.rectangle(im, (x0, y0), (xx, yy), (255, 255, 255), 2)
|
|
|
if (x0 > 0 and x1 > 0):
|
|
|
im = cv.rectangle(im, (x0, y0), (x1, y1), (255, 255, 255), 2)
|
|
|
|
|
|
if (mx < Mx):
|
|
|
crop = orig[int(my):int(My), int(mx):int(Mx)].astype(np.float)
|
|
|
|
|
|
X = []
|
|
|
Y = []
|
|
|
Z = []
|
|
|
|
|
|
Xcrop = np.zeros_like(crop).astype(np.float)
|
|
|
Ycrop = np.zeros_like(crop).astype(np.float)
|
|
|
Zcrop = np.zeros_like(crop).astype(np.float)
|
|
|
|
|
|
for i in range(my, My):
|
|
|
for j in range(mx, Mx):
|
|
|
z = crop[i - my, j - mx] * 0.001
|
|
|
x = (float(j) / width - 0.5) * z
|
|
|
y = (float(i) / height - 0.5) * z
|
|
|
if (z > 0):
|
|
|
X.append(x)
|
|
|
Y.append(y)
|
|
|
Z.append(z)
|
|
|
Xcrop[i - my, j - mx] = x
|
|
|
Ycrop[i - my, j - mx] = y
|
|
|
Zcrop[i - my, j - mx] = z
|
|
|
|
|
|
xyz = np.dstack((X, Y, Z))
|
|
|
xyz = xyz.reshape(xyz.shape[0] * xyz.shape[1], xyz.shape[2])
|
|
|
C_x = np.cov(xyz.T)
|
|
|
eig_vals, eig_vecs = np.linalg.eig(C_x)
|
|
|
|
|
|
variance = np.min(eig_vals)
|
|
|
min_eig_val_index = np.argmin(eig_vals)
|
|
|
direction_vector = eig_vecs[:, min_eig_val_index].copy()
|
|
|
|
|
|
rmse = math.sqrt(variance)
|
|
|
#print(math.sqrt(variance) * 100)
|
|
|
|
|
|
normal = direction_vector / np.linalg.norm(direction_vector)
|
|
|
|
|
|
point = np.mean(xyz, axis=0)
|
|
|
|
|
|
#print(normal)
|
|
|
#print(point)
|
|
|
|
|
|
d = -np.dot(point, normal)
|
|
|
#print(d)
|
|
|
|
|
|
a = normal[0]
|
|
|
b = normal[1]
|
|
|
c = normal[2]
|
|
|
e = math.sqrt(a * a + b * b + c * c)
|
|
|
|
|
|
Dcrop = np.zeros_like(crop).astype(np.float)
|
|
|
|
|
|
for i in range(my, My):
|
|
|
for j in range(mx, Mx):
|
|
|
x = Xcrop[i - my, j - mx]
|
|
|
y = Ycrop[i - my, j - mx]
|
|
|
z = Zcrop[i - my, j - mx]
|
|
|
#print(x)
|
|
|
dist = abs(a * x + b * y + c * z + d) / e
|
|
|
if (z > 0):
|
|
|
#print(Dcrop[i - my, j - mx])
|
|
|
#print(dist)
|
|
|
Dcrop[i - my, j - mx] = dist
|
|
|
|
|
|
Dcrop = np.divide(Dcrop, (3 * rmse) / 255).astype(np.float)
|
|
|
Dcrop = np.clip(Dcrop, 0, 255).astype(np.uint8)
|
|
|
Dmap = np.dstack((Dcrop, Dcrop, Dcrop))
|
|
|
im[int(my):int(My), int(mx):int(Mx)] = Dmap
|
|
|
|
|
|
rmse_mm = rmse * 1000
|
|
|
im = cv.putText(im, "%.2f mm" % rmse_mm, (mx + 2,my + 16), font, 1, (255, 255, 255), 2, cv.LINE_AA)
|
|
|
|
|
|
# display the image and wait for a keypress
|
|
|
cv.imshow("image", im)
|
|
|
key = cv.waitKey(100) & 0xFF
|
|
|
|
|
|
cv.destroyAllWindows() |