我正在尝试使用6D姿势估计中广泛引用的LINEMOD纸张中的数据集。 他们的数据集可在http://campar.in.tum.de/Main/StefanHinterstoisser
获得他们的深度数据似乎是一次性格式,需要加载特殊功能。我需要编写一个C ++程序,它包含一个依赖于OpenCV的提供函数,并找出从对象中提取数字和导出的最佳方法。对于花费一整天Python和其他高级语言的人来说,这很困难/费力。我想知道是否还有其他人已经完成了将深度数放入更通用或python友好格式的工作?我环顾四周但却一无所获。
此外,C + +程序虽然短暂,但对我未经训练的眼睛来说是隐晦的。我怀疑熟练使用C ++ / opencv和Python的人可以查看源代码和一个优雅的程序来在python中进行类似的文件读取吗?为方便起见,我将粘贴下面的内容。
http://campar.in.tum.de/personal/hinterst/index/downloads!09384230443!/loadDepth.txt
IplImage * loadDepth( std::string a_name )
{
std::ifstream l_file(a_name.c_str(),std::ofstream::in|std::ofstream::binary );
if( l_file.fail() == true )
{
printf("cv_load_depth: could not open file for writing!\n");
return NULL;
}
int l_row;
int l_col;
l_file.read((char*)&l_row,sizeof(l_row));
l_file.read((char*)&l_col,sizeof(l_col));
IplImage * lp_image = cvCreateImage(cvSize(l_col,l_row),IPL_DEPTH_16U,1);
for(int l_r=0;l_r<l_row;++l_r)
{
for(int l_c=0;l_c<l_col;++l_c)
{
l_file.read((char*)&CV_IMAGE_ELEM(lp_image,unsigned short,l_r,l_c),sizeof(unsigned short));
}
}
l_file.close();
return lp_image;
}
感谢您对此的帮助!
答案 0 :(得分:1)
经过一些试验和错误后,下面的代码段似乎有效。希望这对我的问题对其他人有用。
import struct
cpp_int_size = 4
cpp_ushort_size = 2
with open('ape/data/depth811.dpt', 'rb') as f:
rows_b = f.read(cpp_int_size) # I assume that the C++ int in question has 4 bytes ... trial and error
cols_b = f.read(cpp_int_size)
R = struct.unpack('<i', rows_b)[0] # small endian
C = struct.unpack('<i', cols_b)[0]
depth_image_str = f.read(R * C * cpp_ushort_size)
depth_img = np.fromstring(depth_image_str, dtype=np.uint16).reshape([R, C])