From b155297216002a6a60eecf57818a5211d6f8cd18 Mon Sep 17 00:00:00 2001 From: HazelWang0 Date: Thu, 17 Feb 2022 21:46:11 +0800 Subject: [PATCH 1/2] update --- poses_bounds.npy | Bin 0 -> 3664 bytes readnpy.py | 6 + run.py | 7 +- testdraw.py | 124 +++++++++++++++++++ utils/calib 2.py | 169 ++++++++++++++++++++++++++ utils/calib 3 blender.py | 217 +++++++++++++++++++++++++++++++++ utils/calib present.py | 254 +++++++++++++++++++++++++++++++++++++++ utils/calib.py | 34 ++++-- utils/load_blender.py | 87 ++++++++++++++ utils/trans.py | 49 ++++++-- utils/utils.py | 2 +- 11 files changed, 925 insertions(+), 24 deletions(-) create mode 100644 poses_bounds.npy create mode 100644 readnpy.py create mode 100644 testdraw.py create mode 100755 utils/calib 2.py create mode 100755 utils/calib 3 blender.py create mode 100755 utils/calib present.py create mode 100644 utils/load_blender.py diff --git a/poses_bounds.npy b/poses_bounds.npy new file mode 100644 index 0000000000000000000000000000000000000000..ff801ca760684e36d1295ee2b1d0f425357d39c4 GIT binary patch literal 3664 zcmbW3c|6qH8^=c}T~efw^rDC;SxTtU`O1Dnmh9R0VHh)wWiYnMUR~U{gchRYMz*?H z&RDLS3N1)QSEMe5QiP;?#xnOG^ZVm>{+QS6dp^(i`Mkf+dFGsxZenR{YRiQS!iCAY zdr;iSvWFyP@t*3kdnIK(1IVYyF8)pdWOonNyq=36#RJV#yj@5h=y|uw!M&2oYI1ue zBP9RN!TWVQ$C)7<4bnCUQ?LIR2Z!$U7g~^rAhl)S>}`q%hFchP%)M35yAtWX=7nP9 ztz>ZnA{wCUJ3mj$+F$FD&VEV<>)cB8aXjv+yo=r|+ zE~Jx;U5a0LTKLH}D3)l*7Kkqb0HayfqBFC*m^WS>6;@JczPFz8k{H@MI2ufgbHX6 zqZZ><;5cnxZ07aY2Po%zhD;(KQbR^Y*)>%-`aX_LVtzWdDtO2G_ehVr;GvxQ z)CW@Y*Y=N2`oPsk&XDpcCl>P~jv(8b%FWY0@Z==7;U+FsIGOX@4&{Y6ymVFZ_oF#- zq`c#~nkE(x;u7cMXvl}ZH?de7nk}tC7#iO+_30@&aMnI#nz27Hla$9W(kNGg*&x`|dX}xoHtl_%|ns=@uV2 z5cPaO!$D;+KdOhh!lm{;9s=yew-`jn1;Vva$JGW9$6@0wR{0j3>!C>BQQVqH06QY{ z|M`M^cG134T>DgD{_)Jcr=(A?IR?b9N<3aU+eUQ)p+lS@$n#WqWE z3@l6bQBwB{DySfZ7+U?<5ACfw*0VSgHbobRkvVhB2}&3_G`j*V9uvh`Y5Xb3YG`r2pXxf9C7B?)NDMjwM?``-P1Me1( z4OFEb1rD^=GglGEv7+oyxwV}8R0AiOm?A-e^`v_WRmjJyBttl}D;zwIBv0TST-hA1 zdIDO1ApOME?zH`86yP80_`W1L3=S*W)diItVsm6!3q{~>hC%WDUUI&b;b2!@Tuu(+ z$UmS~^LUtZJ?_K~&K@YE12YZjo?7H{w)5*#K3*@_Zaw7~Qo7uKbj;(%D&YvES6@%a zrDoD$N=giA>zZirX|hJMUvw{<<8l{Y#KcS#FjF^7*Gln%&)v8TOA&|P+5xrWPj_o3)vS#Ln=*PXh9jTrRpfKAX`w)MPo=7EjrQVuI6Bs&E~v&pdeI@73f$IM zNcEkHZ|V*LAF6C7dt^>xtn@h4r*hoo*8+ut!Op!e>^kg2ffl7Y4)s6GANncDT$(dS zY8*lH+U2uQpjtzhANh#i>CzwJb`v-*i5 z!`K{s&AB{{PGnf#x|`QqEC8(8oqg{m;-EU3i2p;TFUGB~E`q};HRWnLke@rtumkz{ zpEpf7+ZG1nq{5qE;$0qL)I_FOE_ep>%!E_1`S^hj7Kr@SvC)odw_f%)xzugse7*%Q%I z#3Kpm>BJKB9-O(|-K_k35EI85E7ar3$VkPLhV!uBe@;$jejM1`QEfX$*MUcssMhsv z9@xTrs6VEr{PJ)t9dE*2%RCQ6_RkjUR)oOqxtb3zds{OX;~1FTxw#9&`5{n{(pS-0 zY5+-@7!}nKVr8MfW^9XCj9Y;tbBmJ=-%b*&%5-RLLf@<8`LPqvpur~<5`Brz|MlsS zdM^7;r1RbjCI`$10Ewq&-AU`H(9E(!SN*0ow#?C87;4r(dI~la5T}f@XppIM!0Qg; z$W&`KZfuL>$U$qBYg;ct1Sbh4@hqR$m-0+Szf+;kj@NJ%-|?mVbWGUp=fHbNU$sNH z!q}4t&$r6^TYn6NHCu=I!o!x&Wd>&OuKT4IHx0h|xJ}M_hze6qN8Y`SIJg?8BOgBG z%<*TLtLp0SrchHe`S-WTNA-YZ@$(W26wA8EI7(dJujv@=rj7Ckr1!*Ii4GQ-g6UV? z+eS&mIGijfuj*EFK5v_h&MPIi zC4)q7Zc%0Aqa>2lW^{%KB_BO5dGY-}j<>gt@#B$R>H&z1N6E0@H9iUi*g`X&rgKiW z_1Wt}JGj|qE8Y%T>ZLk*I1}M7Sr4AF?qktbL(KRr&ih#LMo;5bk{{UU=J{X(`E=Q} zG=CN`0CpL1o0TrAu-7F#bIj!t(%Vha8ydX);Ji=G;Je~rc;Tc)Kmxxlo8#4dZ>{pR zU`UrUoYaYTqBG3+aAlrvBnC0dhoPtS&bV3+@NOv#JZ1FMFzzBtE<5G z%yMNcZu#Cx$Fkbb-uaAlKc7nJ4Q>Qzr7eF%a?Bhw>CK)~kg~!S@}qq{^~-Bzn-O!c zFT|AiJV*sT-S?I;k2qp(Cp^;nANNAfb!3lp2O7At^Zr;P^0DJ%j-I?v0@l2m_5|7e z%*Fh4Oh~U;paAL5zDjjw(r9qIV*8)9^V9SCr4 zFGTu3b^arQcVb}JbRkJs@dWf(f3sqmYq@R=>?`42(eA%az|G}XoJgu9c+CFh8`k+! zw=vwy0~fsbT`R1MN&}yYj&l&~njW{nkdNRM3h1^-1SGYLxqmlR0!|ZxI`m6GOte6Rem3tbE%o2g~ylkH%;>a<7>$nYz z=g8q~TU!*}od|A?k9nFSpARSWcV4^Y4rKhryBcyW7T-hr>6SfOba|v})IQv`=kG+A zsCd^|Od$+(GRI=}nVGUV%&Vdlz8i;u_G00-G%k1WWn!1i1H_RhdwOm25a;uyE_Yl1 z+_NBXBlOfZ8{~7|uJ=X%(Rkn(p?WxH+=$JwnJTpRG13(}g>8LT2SY5_*}gcR2xL~d s>&xFexD?00obhiB26y{|G(DwwdG&aZB&Ys^fH+zPt(1Qm2d}'.format(i)+'.png') os.rename(pname,nname) i+=1 +def json_write_llff(c2w_metrix,h,w,f): + + print(type(c2w_metrix)) # list + print(c2w_metrix[0]) + print(len(c2w_metrix)) + f = f + hwf = np.array([h,w,f]).reshape(3,1) + # print("hwf:",hwf) + # print((hwf).shape) + c2w_metrix = np.array(c2w_metrix) + print((c2w_metrix).shape) + poses = c2w_metrix[:, :3, :4].transpose([1,2,0]) + poses = np.concatenate([poses, np.tile(hwf[..., np.newaxis], [1,1,poses.shape[-1]])], 1) + poses = np.concatenate([poses[:, 1:2, :], poses[:, 0:1, :], -poses[:, 2:3, :], poses[:, 3:4, :], poses[:, 4:5, :]], 1) + + ## 不计算深度 + # poses = poses.transpose([2,0,1]) + # poses = np.reshape(poses,(-1,15)) + + save_arr = [] + for i in range(len(c2w_metrix)): + close_depth, inf_depth = 0,0 + # print( i, close_depth, inf_depth ) + save_arr.append(np.concatenate([poses[..., i].ravel(), np.array([close_depth, inf_depth])], 0)) + save_arr = np.array(save_arr) + print(save_arr[0]) + + np.save(os.path.join(os.getcwd(),'poses_bounds.npy'), save_arr) + print(".npy has been written") + def json_write(): args = arse_config() @@ -31,24 +65,25 @@ def json_write(): for file in files: s = str(os.path.join(args.folder,os.path.splitext(file)[0])) name.append(s) - #读取 - frames = [] for i in range(len(name)): dic = {} dic['file_path'] = name[i] # rot = np.array(data.get('rvecs'))[i] # dic['rotation'] = rot.tolist() - np_s = np.array(data.get('c2w_metrix'))[i].T + np_s = np.array(data.get('c2w_metrix'))[i] dic['transform_matrix'] = np_s.tolist() # print(dic) frames.append(dic) - print(frames) + # print(frames) + print("c2w_metrix:",np_s) - ca = np.array(data.get('ret')).tolist() - s = {'camera_angle_x':ca,'frames':frames} + # ca = np.array(data.get('camera_angle_x')).tolist()[0] + # print('ca:',data.get('camera_angle_x')[0]) + # s = {'camera_angle_x':float(ca[0][0]),'frames':frames} + s = {'frames':frames} js = json.dumps(s,indent=4) with open('./jsontrans.json', 'w') as f: diff --git a/utils/utils.py b/utils/utils.py index 3d6ee0c..1dc9a03 100755 --- a/utils/utils.py +++ b/utils/utils.py @@ -3,7 +3,7 @@ def arse_config(): parser = argparse.ArgumentParser(description='') parser.add_argument('--folder', type=str, \ - default='./chess/train',\ + default='./chess/images',\ help="图片所在文件位置") parser.add_argument('--config', type=format, default=[11,8],help="格子长宽数") args = parser.parse_args() From 21ede1ea046dfd5496de3617916b8aed84c0ae2c Mon Sep 17 00:00:00 2001 From: HazelWang0 Date: Sun, 20 Feb 2022 17:01:13 +0800 Subject: [PATCH 2/2] 3.0 --- log/0216/poses_bounds.npy | Bin 0 -> 3664 bytes log/0221_correct/poses_bounds.npy | Bin 0 -> 3664 bytes poses_bounds.npy | Bin 3664 -> 3664 bytes readnpy.py | 2 +- run.py | 6 +- utils/__init__.py | 2 +- utils/calib 2.py | 169 ------------ utils/calib 3 blender.py | 217 --------------- utils/calib.py | 319 ++++++++++++++++------- utils/{calib present.py => calib0218.py} | 16 +- utils/calibNot.py | 191 ++++++++++++++ utils/trans.py | 8 +- utils/utils.py | 3 +- 13 files changed, 430 insertions(+), 503 deletions(-) create mode 100644 log/0216/poses_bounds.npy create mode 100644 log/0221_correct/poses_bounds.npy delete mode 100755 utils/calib 2.py delete mode 100755 utils/calib 3 blender.py mode change 100755 => 100644 utils/calib.py rename utils/{calib present.py => calib0218.py} (95%) create mode 100755 utils/calibNot.py diff --git a/log/0216/poses_bounds.npy b/log/0216/poses_bounds.npy new file mode 100644 index 0000000000000000000000000000000000000000..ff801ca760684e36d1295ee2b1d0f425357d39c4 GIT binary patch literal 3664 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 literal 0 HcmV?d00001 diff --git a/poses_bounds.npy b/poses_bounds.npy index ff801ca760684e36d1295ee2b1d0f425357d39c4..4c11834154be0c08b904b39f77a82aaff8322b0e 100644 GIT binary patch literal 3664 zcmbW4YdDo@7st0Wm8OJ>sF^mEQ&NPyBi4>|R+*_BM|KY57)2>$iYQ4#axPIqg_LvB zvf0SlW;?gH^CA0Gq^L=+chdIZefO95`S4uVb3f}@*YEnT|Gn1zL>xS7bl6OYaF*bs zU~A`Lb6VjSqQZ82Z3Pvgg1y^m&(q|S$K6ib+WlvJ7um(bZf4!Xf$VNK^Q@?@r9xEO zrldl=K>R~0gl}R66x4sqPmm`)>i57cHGPr^5emmQ^gNVoD=W_ovl-Cm&50XS#T$GypRhHNpXp% zGAmH-af{i4`!#s=M7hkLB8_~G*A@Z6dfhcBowiT-Jv5{Qv&ks43O5clud#LDV)%QB2hNlI0y$!f2+LQ7R>CGd z<%m)b9<*fa9BoPnfJKU|^;$8-@Xbj?lDc^EBjYI!j2`}VXp&Ze&&;Df3GZtLYgHdT ztzOz}oIFWF!;Ii1-V6_-jn?j|O-22tFLfFITogx(jdt~Y0y!pPJr8^qrT}HF9+#BQ z13Y4!qc!e`aqEQo7RJu`^z8nL5`SYBOm5fCJpQ~G)4f-|%+l+@M@-wCKbKR#<)87X zw|0|U#hM;`ArqzM5}5_}NJ=b5I15WishZ3?f;sk(=hfanP=R}6b;op!*&z0)=g??! z7hG08Y;f#QCtr`%7lb1yL2L+JoOxz?nht6BHi<)^8E?%e#1Hle)I%@$qQr*5E;vWEEmcG|yz{V?%#}+=iE|q}++O7K zIdpzbZ1_NV0~s2%GTRl}P%QJ<-yfuzK&AR8>gmnZW%{d^SrfGb+DoGrb`Le+lxU*( z;mvGZ-C}3Pv=r=*mxE@}go-X0HPN6?;oz_ghiT zbX{?3cf($04RyBeM3V82-FZ8P*|6-~HT%>=Bb?X~!8G#f!Z504ShYqWpF{l6FP9F@ ztoQ0PP{^GwIAl%e-a5=itM`O9cdrhCdidWl|Lt)I2X`(QUSZ|m3YGU%;>{^#kTXdb za387Xa}=(7_hTff844bV6~Vf- z=CZN@+f|uYyH{oN^&l^DkcbtjL-T5-?5@9PxF#bI)Q35ENF(nTnboTp;U$IpYX zd}$=PS!)P(6u47Twlmtn|2NjM^+q} zX5{fXo=8>=9UCmeplbgB-_NDkYeAPTB=K;3OvF7bb?{pp@xRYwBKvpe?#``(cKfxr zubc9~_UE{p3rB+B(%s4F!2C2mN7z0!1)nqy@cg!U@!Bi#K&V)HErX67DT-w`R?p2B zUPDZc*Fid#+D=<^IAsHxp4!+1T&&wD`{lqj!5mYcJ)&wuD&a`amcE{uxgTTF&Fom_ zk2yrWV-Ca5`5fwlvT1oXJWy=BZQ88d>~I+lprH&vnmU8 z&4`I{+ahu2z*ELTE)Rd->#=y8F4!MYgA*n1yqh6h>pVR`hy&T~5~@nYO<Br->v%K;ox1`3>TE$K(v-tT zUb^9#Oc(xhuKFMTFg|iUH|0|!ejQ$+*Hb+N6tT-2{c8r`Y)Fu2u~;vkql2j6#Ps5V z;uY=YEvn7n-t{nXswETrjM91aM{@ZbfsS7SmbjN;uWW5l#GwJGKP+N9qBnvz9g2QS zn1bj2Mdc!zPgy_o+Ev^=P(2Ju*#pK(E{#yU*Li-tQwg7=DbVM0b%vn; literal 3664 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