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

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

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