You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
5.1 KiB

# -*- 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()