前面我们输出的灰度图是没有鼻孔的(只能是上小下大),这里我们把它转换为点云。
流程简图:
由于保存192*192*200个点数据比较慢,我们从双线性插值前的48*48*200的数据导出,后面的到C++中处理。
# coding=gbk
from tensorflow.core.framework import graph_pb2
from num_save_mat import K_save_mat
import cv2
import tensorflow as tf
import numpy as np
import time
start_time = time.time()
with open('vrn-unguided-keras.h5.pb', "rb") as f:
output_graph_def = graph_pb2.GraphDef()
output_graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(output_graph_def, name="")
#print(output_graph_def)
end_time = time.time()
print('载入模型用时: %f秒' % (end_time - start_time)) # 23.96
start_time = time.time()
sess = tf.Session()
x = sess.graph.get_tensor_by_name('input_1:0')
y = sess.graph.get_tensor_by_name('conv_276/add:0')
img = cv2.imread('joey.jpg')
img = cv2.resize(img, (192, 192))
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
img = np.swapaxes(img, 2, 0)
img = np.swapaxes(img, 2, 1)
img = np.array([img])
out_layer_name='pred0'
pred = sess.run(y, feed_dict={x: img})
vol = pred[0]
end_time = time.time()
print('运行模型用时: %f秒' % (end_time - start_time)) #38.86秒
start_time = time.time()
print(vol.shape)
K_save_mat('vol',vol)
end_time = time.time()
print('保存体素到vol用时: %f秒' % (end_time - start_time)) #3.9秒
然后在C++中处理并转化为点云:
void tmp()
{
int wid=48;
int hei=48;
卷积层 vol(wid,hei,200);//亮度
vol.data=new float[wid * hei*200 ];
load_mat2卷积层2("vol.txt",&vol);
//缩放到 192x192
卷积层 di(192,192,200);
di.data=new float[192*192*200];
双线性插值(vol,di);// 1137
cout<<di.width<<","<<di.height<<","<<di.depth<<endl;
vl_sigmoid(&di);
卷积层乘以(di,255.f);
卷积层 *灰度 = 转换体素到灰度图(di);
cout<<"保存灰度图在data下: gray_0.jpg"<<endl;
save_卷积层2jpg(灰度,"gray");
体素到点云并保存(di);
}
体素转点云流程:
对每一个点,检查上、下、左、右