From 8c0727990e57d1e8e14a485524725c9e299c2f7f Mon Sep 17 00:00:00 2001 From: powlu <1144983626@qq.com> Date: Fri, 19 Dec 2025 08:56:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4FFMPEG=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/copilot-instructions.md | 44 ++++++++++++++++++ .vscode/tasks.json | 12 +++++ run.sh | 18 +++++++ run_live_demo.py | 16 ++++--- saveimg.py | 12 +++-- .../__pycache__/__init__.cpython-38.pyc | Bin 528 -> 500 bytes .../__pycache__/base_thread.cpython-38.pyc | Bin 1811 -> 1783 bytes .../__pycache__/birdview.cpython-38.pyc | Bin 11437 -> 11436 bytes .../__pycache__/capture_thread.cpython-38.pyc | Bin 2895 -> 2849 bytes .../__pycache__/fisheye_camera.cpython-38.pyc | Bin 3463 -> 3422 bytes .../__pycache__/imagebuffer.cpython-38.pyc | Bin 5048 -> 5020 bytes .../__pycache__/param_settings.cpython-38.pyc | Bin 960 -> 932 bytes .../__pycache__/process_thread.cpython-38.pyc | Bin 1991 -> 2349 bytes .../__pycache__/simple_gui.cpython-38.pyc | Bin 4087 -> 4059 bytes .../__pycache__/structures.cpython-38.pyc | Bin 791 -> 763 bytes .../__pycache__/utils.cpython-38.pyc | Bin 4076 -> 4078 bytes surround_view/birdview.py | 8 +++- surround_view/capture_thread.py | 29 +++++++----- surround_view/fisheye_camera.py | 2 +- surround_view/process_thread.py | 19 ++++++++ yaml/left.yaml | 2 +- yaml/right.yaml | 34 ++++++++++---- 22 files changed, 163 insertions(+), 33 deletions(-) create mode 100644 .github/copilot-instructions.md create mode 100644 .vscode/tasks.json create mode 100755 run.sh diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..f1426ed --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,44 @@ +# Copilot / AI agent instructions for this repo + +目标:帮助 AI 编码代理快速上手此环视(surround-view)项目,聚焦可验证的代码模式、运行流程和常见修改点。 + +- **大体架构**:数据流为 Capture -> Undistort -> Project -> Flip -> Stitch -> WhiteBalance -> Display。主要线程/模块: + - `surround_view.capture_thread.CaptureThread`:采集摄像头帧(USB/CSI,可传 `api_preference`)。 + - `surround_view.fisheye_camera.FisheyeCameraModel`:负责 `undistort()`, `project()`, `flip()` 和相机参数读写(yaml 文件)。 + - `surround_view.process_thread.CameraProcessingThread`:每个摄像头的处理线程,调用相机模型并写入 `ProjectedImageBuffer`。 + - `surround_view.birdview.BirdView`:融合/拼接、亮度匹配与白平衡,输出最终鸟瞰图。 + - 同步/缓冲:`surround_view.imagebuffer.Buffer`、`MultiBufferManager` 与 `ProjectedImageBuffer`,通过 `sync()`/信号等待实现多流同步。 + +- **关键运行脚本(推荐顺序)**: + 1. `python run_calibrate_camera.py`(标定/生成 camera yaml) + 2. `python run_get_projection_maps.py -camera -scale ... -shift ...`(选择投影点) + 3. `python run_get_weight_matrices.py`(生成拼接权重/掩码) + 4. `python run_live_demo.py`(车载/实时 demo) + - 调试摄像头采集:`python test_cameras.py` + +- **项目约定 / 易错点(请严格遵循)**: + - 摄像头名称固定为 `front, back, left, right`,对应 yaml/param 中的配置;device id 需在本机环境中确认(参见 `test_cameras.py`)。 + - yaml 文件(`yaml/*.yaml`)里保存的字段:`camera_matrix`, `dist_coeffs`, `resolution`, `project_matrix`, `scale_xy`, `shift_xy`。修改后用 `FisheyeCameraModel.save_data()` 写回。 + - `param_settings.py` 用 cm 为单位构造 birdview 参数(`total_w/total_h`、`xl/xr/yt/yb` 等),birdview 的切片函数(`FI, FM, ...`)依赖这些常量。 + - 镜头“翻转”策略在 `FisheyeCameraModel.flip()` 明确:`front` 不变,`back` 180°, `left/right` 用转置+翻转处理。 + - 缓冲区 `Buffer.add(..., drop_if_full=True)` 会丢帧;修 bug 时注意是否因为丢帧导致状态不一致。 + +- **拼接与亮度调整实现要点**(参见 `surround_view/birdview.py` 与 `surround_view/utils.py`): + - 权重计算:`get_weight_mask_matrix()` 提取重叠区域并基于点到多边形距离计算平滑权重 G。 + - 亮度匹配通过 `mean_luminance_ratio()` 聚合重叠区域平均亮度并以几何/经验方式融合(见 `make_luminance_balance()`)。 + - 白平衡用 `make_white_balance()` 简单按通道均值缩放。 + +- **如何修改/扩展(示例)**: + - 若加入新相机或改变布局:更新 `param_settings.py` 的 `camera_names`、`project_shapes` 与 `xl/xr/yt/yb`;更新 yaml 参数并通过 `FisheyeCameraModel` 测试 `undistort()`/`project()` 输出。 + - 若替换采集后端(gstreamer / v4l2),优先修改 `surround_view.utils.gstreamer_pipeline()` 与 `CaptureThread.connect_camera()` 的 `api_preference` 分支,确保 `cap.isOpened()` 行为一致。 + +- **测试 / 调试建议**: + - 使用 `test_cameras.py` 确认设备索引与支持分辨率。 + - 单线程走查:直接在 REPL 导入 `FisheyeCameraModel`,用已存在的 yaml 文件运行 `undistort()`、`project()` 并保存图片来验证投影矩阵。 + - 帧同步问题优先检查 `MultiBufferManager.sync()` 与 `ProjectedImageBuffer.sync()` 的 `do_sync` 与 `sync_devices` 配置。 + +- **风格/约定**: + - 代码使用 Python 3、OpenCV、PyQt5,多线程依赖 `QThread` + Qt 同步原语;避免用 `time.sleep()` 作为同步手段。 + - 尽量在修改后用现有脚本跑完整流程(calibrate -> get_projection -> get_weight -> live_demo)以捕获参数联动问题。 + +如果需要,我可以把这些点合并成更短或更详尽的版本,或者加入常见问题/故障排查列表;或者你希望我直接提交此文件为 PR?请告诉我想要的调整或遗漏的内容。 diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..66b0075 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "kill python", + "type": "shell", + "command": "pkill -f python3" + } + ] +} \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..0832449 --- /dev/null +++ b/run.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# 获取当前脚本的 PID +SELF_PID=$$ + +echo "【1/3】终止其他 run.sh(跳过自身 PID=$SELF_PID)..." +# 使用 pgrep + grep -v 排除自己 +pgrep -f "run.sh" | grep -v "^$SELF_PID$" | xargs kill -9 2>/dev/null + +echo "【2/3】终止 run_live_demo.py ..." +pkill -9 -f "run_live_demo.py" 2>/dev/null + +sleep 1 + + +echo "【3/3】启动新实例..." +exec python3 ./run_live_demo.py + diff --git a/run_live_demo.py b/run_live_demo.py index 4b27637..18f85da 100644 --- a/run_live_demo.py +++ b/run_live_demo.py @@ -8,14 +8,15 @@ import surround_view.param_settings as settings yamls_dir = os.path.join(os.getcwd(), "yaml") camera_ids = [0, 1, 2, 3] -flip_methods = [0, 2, 0, 2] +flip_methods = [0, 0, 0,0] + names = settings.camera_names cameras_files = [os.path.join(yamls_dir, name + ".yaml") for name in names] camera_models = [FisheyeCameraModel(camera_file, name) for camera_file, name in zip(cameras_files, names)] def main(): - capture_tds = [CaptureThread(camera_id, flip_method) + capture_tds = [CaptureThread(camera_id, flip_method,resolution=(1920, 1080)) for camera_id, flip_method in zip(camera_ids, flip_methods)] capture_buffer_manager = MultiBufferManager() for td in capture_tds: @@ -38,17 +39,18 @@ def main(): while True: img = cv2.resize(birdview.get(), (300, 400)) cv2.imshow("birdview", img) + key = cv2.waitKey(1) & 0xFF if key == ord("q"): break - for td in capture_tds: - print("camera {} fps: {}\n".format(td.device_id, td.stat_data.average_fps), end="\r") + # for td in capture_tds: + # print("camera {} fps: {}\n".format(td.device_id, td.stat_data.average_fps), end="\r") - for td in process_tds: - print("process {} fps: {}\n".format(td.device_id, td.stat_data.average_fps), end="\r") + # for td in process_tds: + # print("process {} fps: {}\n".format(td.device_id, td.stat_data.average_fps), end="\r") - print("birdview fps: {}".format(birdview.stat_data.average_fps)) + # print("birdview fps: {}".format(birdview.stat_data.average_fps)) for td in process_tds: diff --git a/saveimg.py b/saveimg.py index 77483e1..c2fa63d 100644 --- a/saveimg.py +++ b/saveimg.py @@ -10,7 +10,7 @@ running = True def video_thread(): global frame, running - cap = cv2.VideoCapture(0, cv2.CAP_ANY) + cap = cv2.VideoCapture(1, cv2.CAP_ANY) cap.set(cv2.CAP_PROP_FOURCC,cv2.VideoWriter_fourcc(*"YUYV")) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) @@ -18,7 +18,7 @@ def video_thread(): if not cap.isOpened(): print("[ERROR] Cannot open camera", file=sys.stderr) - running = Falseq + running = False return while running: @@ -26,7 +26,13 @@ def video_thread(): if not ret: break frame = f.copy() - cv2.imshow('Live Feed (Local Display)', f) + # print(frame.shape) + # frame = cv2.resize(frame, (1280, 720)) + # print(frame.shape) + cv2.namedWindow('AHD Video', cv2.WND_PROP_FULLSCREEN) + cv2.setWindowProperty('AHD Video', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) + cv2.imshow('AHD Video', f) + # cv2.showFullscreen('Live Feed (Local Display)', f) if cv2.waitKey(1) & 0xFF == ord('q'): running = False break diff --git a/surround_view/__pycache__/__init__.cpython-38.pyc b/surround_view/__pycache__/__init__.cpython-38.pyc index 5706dcefa18295beb422b0be0f828839018b2912..fea858668d4a64d0e603810b8c99dcacd6297115 100644 GIT binary patch delta 74 zcmbQh@`af@l$V!_0SE+2tT%EuG8*3ENXjfqDa%YPFX8|S7jXiKl?+APAU25jrKz8h VpPQ;*Rg$Cc<7I4SF!?5T5jZSWb}>VNXjfqDa%YPFX8|S7jXiKl?+87HDKbGtA0j) uZmND&NsfMTX;D#rXv(se%|E0jOGANP9CcO diff --git a/surround_view/__pycache__/base_thread.cpython-38.pyc b/surround_view/__pycache__/base_thread.cpython-38.pyc index c89bfcae646f806170737c18cce82a31659852e8..2bfad32f1feb58b9416c2d9757ce07b71816f2d2 100644 GIT binary patch delta 54 zcmbQt_nntJl$V!_0SE+2tT%EeFbU}BXXNLm>Q|NI==*pXn;C4L&h&zb@z&%9)-#Oi JlYQBa0RVYm56b`m delta 82 zcmey)JDHC=l$V!_0SKn>T5jY{VAAo>&&bbB)vqea(JwA7D#|a-OVKUMOfAlsG1$%bsl02Wdkr2qf` diff --git a/surround_view/__pycache__/birdview.cpython-38.pyc b/surround_view/__pycache__/birdview.cpython-38.pyc index 4c513e5eb42d123f87d08b05b39cff3413452e9d..8fd841b53811e7968505355856eea7654713b855 100644 GIT binary patch delta 1127 zcmZ9KTWC{R6o${*=Oo6~oLtPkt(O$rrcvv)f+AW}yel)~h(@8tB$$MzDLbcX<-}_1 z6}7cps4pUkifC~LW&*+p$~X_gfNzRoVP58C81TV2UtQ}|#F((Zz4pH@dnJ4Qa`5p% z=g&@OgF>IBM>pkO|K`lA?pRm0SjcppGWxo9?O55ptaeX*)&K&NdK!xOl32pHE9E&s zStY@_LLMfjCOp1c&9z9tX?*WF3D@vP?+{$Cz4DF$+`vP=CvY3R{%w%JL;eCF{_U^W z6Kbx|lfYsi3U_caa2oESCs>9DlVLyJ52j#>jsct(O2MyW`SDgL3%^f>Pr?)HI2O*r zQ;wYzIR?+!xE$$&zu0JOY8w7XZJA15IjohTEXrzGGr)wrFa<4@mX;Tz8YqTZ(J0Pl z*i9IPs`#qRG90F;Q)U|trdp>o8gopoPH~z_MK@gLFcmZ09G-@%`b}An72xH|jJceg z7Il7~<@fW|M!?Ef>-<5>AF}*mD_@)Or)`r*=!db2(pkr_Hn+XiH=-;hh# z(awTBRU8;HigJXN-Hh{$9~c)I2N;(a{JQci;|yavV;^Ibv6GQtoMY@|>}OnH;CS;+ z*GsZWK7t~22nhVIIoo)Jy_Xqj9Cw7=I``9?O3L0`A$ctGrZ&=IXz(6CE!+x|xFNcL z=H^Ir{lYS9Rd^pdu=`D^HZEomg$6`{yJ4k-{~y3}b) zplmzh{{C+Kw{1Ht!^Q1)ZBrDq7GJmbz%=?hy5TME>eze$XhbWns$%W#nLY2RcxfQ# zR(w?+U_Z|e?F|*%m$(3(996K?pr+(QX>|?t)Ego_T!|2a_@QGDG~v3~@y6@iDc>$9 z@I`C{*5l^RsBj3(c5aE5SwBOVb_~ekKt>uvGmmXe20t(7) zdRkb|7C`L6RBi$wk*rmOK&Vy0GbTGc#1Ydt$oSKggvS^y9)&0PwKxt-c)^^6 z75r!(g=g4nNx}=$7|AoENSBuxUQAjJc> zrDRCj1iwScl(G`S4rP~=ozU!1auS@JE9uBf%A;x@q=aqP4lbxy3k+&OJ~jLJe+syu zQOy_7)>5HrAneE&sd85FHIG8~s8;#E>k60Q?Y6J`iqgjs@z zaD^~MXeV?Mt`SZUdI-~m4#GLY4P3Bx=w7ohYGmLb5AeHnP8-f~zm^!tLbsMI$U3kAacVXt4^yQ*F+q3(NxdBQEiZNdVB!iVbF zzd^xIcDF_0`x_O0fGGnFJ^TQRy)5>!Y)iQa@6s#fpTROoz1D5mD2g%E<66ZeOkk74 z0S)MJ*x1R&9On)H?}}d>?clqekWAVgr)K}pTjNqlr$aEaE3>!@nUi_kojt-x&BfciG(TT&#oH>VuBxCe6=44A z^T*4X6So^~9k1vvl9N&1RQP`QGK_scb!6}=Tn_wDrrE}N*zz}mcy&|XvZ}dE%A#Psp&a}} zf3z+aDwWmEji9ms2Bfl=djR6rno1>iWf&2GRCJ;!F?P`_pmWkMxc z6Hzgt%|2nU8ELoC5J}Kmu1DKAtBx~W^4s#3P1>Psmzj$=>ZPM}Q1$}=&p zHsg96r0(LA>YeI6e`1P!L_xU-Bu-WX1-oEaLvH1e(RP; s%@Y}0qX9!01quuo{o@Ub2{9;~qemPQ`p~^e71w987js50AZI4~2jd>22LJ#7 delta 762 zcmXX^zi$&U6!!D^ekQqI(>85U2SBAw1t_YZMWP4^F;Iz$fnUQdrzCdT3rQQ!PK8h^ zhD53uBl8C&{{TXCXJV)GiJb++%*Hd+mcRQx``!C&KTj*)D&dP#DInO=!=3b3I1X1} zZ+yLWm0R5DxLq&yfIK4H<=%*JPq3jC`y8H;4S(F*T-<=Xyf0NI>Rpi~y|gDf>7i(j zXXoFUoN^aIkQg|LDFE0xPYEM& zfR3fS^swGj{Y*SRKu7-kNz*Yd7tL_%V#s?l$P`g9AVWH#16x0al}Nc0Z%PIv!6P6B zXD9F;fYpTh*!6kGuNZx-#cu@*)ly zB9JHo$I=eF3*Yqvwhia{4cl#~nE`1#lL-Cjke*nm$Yd6=Foj8ZVD#LS0`6uqkKCJr z;q3)R+7)iyA(SK))QgiPGiz2~m(?<7Lu8!bb=Z2UvoD1;-KH-btRHkPsYAfb(Ns3$CXxwb(2XiJ8B9k1y7ns{X-QmT!fp*RI0Qo zll^|0Gto_ze(7vERdkY7J$5b^Ac7^U2oa6w*%zk@5a=K7r^P)JaS4GyNCOOFRsaFj zAH6Qy{HGwU0H{v7Otx!qT3M`q?pU{!wyYoYnmgCZ>gcJ>$K+pmNG diff --git a/surround_view/__pycache__/fisheye_camera.cpython-38.pyc b/surround_view/__pycache__/fisheye_camera.cpython-38.pyc index e7ce846ef62307e1feb3502e374d71465f9e6238..531a893ca6c9ddfca17237da24813fb4251a2092 100644 GIT binary patch delta 773 zcmZpdz9+>S%FD~e00cc@PMK{Rc@vo!Z%xi;+9V?Y6kEwqBmty;>Fa0Y=cejcmE`FA zco~}+Y>s4(V^k3YN)-u#2oWHm$$yJExyaPGU((YF?2nNC?S*$;zy18sZ=&Olif)5+HRTH$VtU5KC-xA*&^$x;l{kk{L*7 z@)m(?xW$s3Ur>pp7i@>zSQeQDRCQ6i7vzB7qQ<5E2p~g)(FS+~f=f$7elXQUxI) zv9Pcm6B1H8vH_)Y{{VId59}Qf3lj`*&k@8zz2WoS^ZV}m?!EVQ_T`+pX_{k_Sg*}> z_tgi}R^%3^%Ev}t#NJ78Qha{is6C=xQhUn0TG#`iJ-<`!yJWi>4njt{Ro7=gJH0k@ zslRtgy(bqZ1PzWM92a2aBemVHN8{IAk2Dzt`yqiGKhR1`vzRj{AWAu&%^2}v9z%%> zcuFrXPh*PWgvlS6hyI2zgS)A{O?_QHQx^L}Re)szDnweF27?4Q)>z>CM)`CsuJ}Qu zk^za*8+Y%YUu|yGVG`*YO!HqxVd6iTB0rmYQyFwS;ozl?f~^!OWU&BPY!>J6=@!E7$_)d0FD4G zBgEnv2DTptG$c?F!ANsFH?Wl9t5-2CA&KN$O5`Pb)RdvPj8m9lcN0xV)Q z$M?qz*N@7NRmGT4o2}GGY*-SszdlNMMZyQ4&%S7!!r&AFHVV!mG!QN#piQ`nFyh6# g8U7`^wt}j|0!V-(1z7=+LAM@@9)NZv?~1wj2S=~ArvLx| diff --git a/surround_view/__pycache__/imagebuffer.cpython-38.pyc b/surround_view/__pycache__/imagebuffer.cpython-38.pyc index a4d8ac8bc6a8255bdcca11eceb82e3912045522f..dcc9287e1bffc5f5c6f0289116e8ac60a4407f04 100644 GIT binary patch delta 198 zcmdm?K1ZE9l$V!_0SE+2tT%G&FbU}BXXNLm>Q|NI==*pXn;C3QW}3jk7&Z9|*MCOK z&0n}n85wOhXYmR!syYC5-C`+E%q%IA0y2wiK!gyS5C*X%t!Y%>sH3nCmrge8b@0TJ#X!UIHjf(S1V;Xj#0 Gcnbg{0xjME delta 240 zcmbQEzC)cml$V!_0SKn>T5jalVbbx?&&bbB)vqea(JwA7D#|a-OVKUMOfAlxZHs9bbWn{FSEGQs6Ig$6Tsw2?QTP)>? znI%P1KxUCGh!BDk!XTE_=Ki;_#ZO5fmtd7c~Enf3DmOLfHeb+71?Yn rSixv)4dR=D2s;qr1R|_Jge!>f01=)b!V5%rgNT61{u~mMgy#SNII=wf diff --git a/surround_view/__pycache__/param_settings.cpython-38.pyc b/surround_view/__pycache__/param_settings.cpython-38.pyc index a1e41c5e12a9ad6b3697807718061f733f012870..dd5a42af3d55df5c242faddc299bae016b582cae 100644 GIT binary patch delta 41 vcmX@WzJ#4Sl$V!_0SNvtwBN|h#w?((pOK%Ns$W%-qwnKoY-TXombn=K*KrE( delta 69 zcmZ3&et?}jl$V!_0SKn>T5jZKW7hH3&&bbB)vqea(JwA7D#|a-OVKUMOfAl@Z{GXOdvAU-?|mNpP|QCb7_bnG1GesU zbKU$jzSCX2G*1cD8hX>%G%>o1s7{TSh#E}WCz~0HAEJ`ktt}3hu*kPv?lzr}MUfX& z!%DX>^6CAof{o;h;;+ioJS#;`iUANphX@u#Cs<@0r_yl4&~Z-C&vLoeYO-=CYLxHa zyRx#Bye4y61_JWQN3uR>fF{=ltndYXqb`iDP$fo=8Y5rnX~zhoL%ba)E9%WX><>~@ zH^YM%G=GSay29UrpVjxxY;x#~M}ZI{z+_Seryt8%Mi(FcFRIodJl#&%Gk&N3rTp#Cn~`;AoN>v37*0DN)!n zv3`W!>H8R?lpg9$!KDMoV8f1j7o-)d$BMLj(_oorXEQ4DFH-9&Qjl{I@Y!C$hHXY3 zZx<TQPM>q?4H8*D2Q8uzNTsDw`mpr^lKbTUs|9zYSV+noiw;x-v~?JX!S zvukc>?*!~wn^hu4?Xc#yncc}=w*Nw0mC5ILK3Ub8d$R1psV;8@N5W|HmJfFbb*tgEMYd1E34ntz&sz*yuJ7ffJVK$RyU^O) z3m`Ono_y07G5BEeNMG6$stn)EpHuBe@nN9Y7bB7^;XA=RDB&6ige`0m3+pf~tYS;a z!Lo3XjDf8vd7Oi35fkSW6Avj9U`?m^5Xphvnc7Hy?*VUBx~IA1tA0(Foy=E~Ib(SF z-_->P%KN!&Z4*`~zs^)t6WaM#ek8?9R8S%5Z*uA8*}y@z9R_929>Dhi6!!wOyn`iL3JP9;hFOOqyP8km%+5C&efur=(e+h28;kxqlmYqE| zW;E`hEJGnr;z+i}G!zQ0JIxXp5f^2y%EpSb{X^L}M=DQbR5t7&jgR!eiK(T0ed^rV zRRK)9fWDba)pW7}q__=$u!}i$u?^S71iPdI;o<=MxC7VKYy8!ou~nJ&#tXwJ-7ktr zrfC>n8r?H3X1=lk9EigFCMS%8(SQ9xTOT_5J0IU|`6Y3?VY?iEn8Ampau=HkW)#Og H(xLwVyt9Nv diff --git a/surround_view/__pycache__/simple_gui.cpython-38.pyc b/surround_view/__pycache__/simple_gui.cpython-38.pyc index 25e4148d71125d4e6fece0002ebd7c45fc75ef87..df8b600290e523ccf2cba4c04b1a54ccd1bef186 100644 GIT binary patch delta 42 wcmew^e_NhAl$V!_0SE+2tT%E;FbZhvXXNLm>Q|NI==*pXn;C5GXUyOO0OR`$8~^|S delta 70 zcmcaD|6QItl$V!_0SKn>T5jZyVAOHf&&bbB)vqea(JwA7D#|a-OVKUMOfA{iJ delta 69 zcmey(I-QL>l$V!_0SKn>T2ADCq2sQfk)NBYUsaN$UtC&LlwX>cqFa`kTCQ7MSzMBu XtDBiuQk0)knp~2ZpSPKr@dqOS?LZg4 diff --git a/surround_view/__pycache__/utils.cpython-38.pyc b/surround_view/__pycache__/utils.cpython-38.pyc index 0b2264dba426f08376f324d01dc637a8b2b92cd0..b0dcb0b05c4976e859434d143f9659021f2a43ef 100644 GIT binary patch delta 732 zcmZWn&ubGw6z*g*n{2k5Y)dR@N@=1=+ij!?4HVm)Y^;KKkQxu>pssdI7P3Eh*-+Ah z{skiPF8&2x1VIY^KS_OhUc|c>b>2o4$sE3U^X8lHdv9jGt$bh6ZyQEtMh-J< zz0qGW*2Q=1in&_v`>v=ThlBc!>&@*3YKa}DVLNfg(pXd0*c{fA%NQvA+^jqtrCi5z z+>r}9o+(wyF_LArAUUVycwZTgTq^&WY$u;ya)F9@?_eZ z<|D7NB7WeH**soSuNFx)Qb2^$)EDZqdR}fnOyDUm;1~71S|R5OK2POqOLS0w;Dkrc zP~5YN1K_j|RRSHn(7xR?4vxL_8b?0|8k|n1Szj;Z1)q?)hFv z3`5HVixf6yX7KaueYS~BV?&m8*SN;^@ul&z5!>@&FmV1DCtYECut0L$70?rw9&yLD zdm>_c(8jOXi&B8)cGv;7a^-GIGA(1$2KPp8FrM6qM!s_dqy_XPphysR6Sq!Hz&^nN O!N0#0M`?VU+x`u@BBU1p delta 749 zcmZXS&2G~`6oor+?8J5)r!6II+Nh04C{BYSf{N4z7C;FLHb_kuWRn^?G)DeoJZaS~ z=p!I>#fB#Uu>o~KB}BzT01LkWLP9(OVy;txP`vnbXXebg=UVe?@#mtxWfm(lVKXE9o*YXbX z%fSz+CNyTcLW)9jT1n2OXy{ofc3x=NBtrQM6$)~d%)zSM7JMq7D~t(V$~7_%ALVCc z8rGFg32kDDQ9kbVN+~NB#POpPe3ob7t8#Kw!&Znlq^CKYGMhVrA6Xf;fIj*|hwnQP z?c4qi!>h5f@#P+@-vKCg?*hTPBU; zdUlEERdJd`VHaUbZDmVnn_>&_TwM}B?VUO(VS*$WyMz^HU>0HqTG|7pg5@N<&{l;0 zlXjc5kBQzTN7J}pK