PCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2NvbW1vbn0tLT4JPCEtLXtpZiAkX0dFVFsnbW9kJ10gPT0gJ3ZpZXd0aHJlYWQnICYmICFlbXB0eSgkX0dbJ3RpZCddKX0tLT4KCTxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRwczovL3d3dy5xaWRhbzEyMy5jb20vYmJzL3RocmVhZC17JF9HWyd0aWQnXX0tMS0xLmh0bWwiIC8+Cgk8IS0te2Vsc2VpZiAkX0dFVFsnbW9kJ10gPT0gJ2ZvcnVtZGlzcGxheScgJiYgIWVtcHR5KCRfR1snZmlkJ10pfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZm9ydW0teyRfR1snZmlkJ119LTEuaHRtbCIgLz4KCTwhLS17ZWxzZWlmICRfR0VUWydtb2QnXSA9PSAnZ3VpZGUnfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZ3VpZGUvIiAvPgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2ZvcnVtJyAmJiAoZW1wdHkoJF9HRVRbJ21vZCddKSB8fCAkX0dFVFsnbW9kJ10gPT0gJ2luZGV4Jyl9LS0+Cgk8bGluayByZWw9ImNhbm9uaWNhbCIgaHJlZj0iaHR0cHM6Ly93d3cucWlkYW8xMjMuY29tL2Jicy8iIC8+Cgk8IS0tey9pZn0tLT4KCXJgbmB0PG1ldGEgbmFtZT0iYXBwbGljYXRpb24tbmFtZSIgY29udGVudD0iJF9HWydzZXR0aW5nJ11bJ2JibmFtZSddIiAvPgoJPG1ldGEgbmFtZT0ibXNhcHBsaWNhdGlvbi10b29sdGlwIiBjb250ZW50PSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydwb3J0YWxzdGF0dXMnXX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsxXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ3BvcnRhbCddKSA/ICRfR1snc2NoZW1lJ10uJzovLycuJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsncG9ydGFsJ10gOiAkX0dbc2l0ZXVybF0uJ3BvcnRhbC5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L3BvcnRhbC5pY28iIC8+PCEtLXsvaWZ9LS0+Cgk8bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsyXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2ZvcnVtJ10pID8gJF9HWydzY2hlbWUnXS4nOi8vJy4kX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydmb3J1bSddIDogJF9HW3NpdGV1cmxdLidmb3J1bS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2Jicy5pY28iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydncm91cHN0YXR1cyddfS0tPjxtZXRhIG5hbWU9Im1zYXBwbGljYXRpb24tdGFzayIgY29udGVudD0ibmFtZT0kX0dbJ3NldHRpbmcnXVsnbmF2cyddWzNdWyduYXZuYW1lJ107YWN0aW9uLXVyaT17ZWNobyAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsnZ3JvdXAnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2dyb3VwJ10gOiAkX0dbc2l0ZXVybF0uJ2dyb3VwLnBocCd9O2ljb24tdXJpPXskX0dbc2l0ZXVybF19e0lNR0RJUn0vZ3JvdXAuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiBoZWxwZXJfYWNjZXNzOjpjaGVja19tb2R1bGUoJ2ZlZWQnKX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVs0XVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSA6ICRfR1tzaXRldXJsXS4naG9tZS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2hvbWUuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PSAnZm9ydW0nICYmICRfR1snc2V0dGluZyddWydhcmNoaXZlciddfS0tPgoJCTxsaW5rIHJlbD0iYXJjaGl2ZXMiIHRpdGxlPSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIGhyZWY9InskX0dbc2l0ZXVybF19YXJjaGl2ZXIvIiAvPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICFlbXB0eSgkcnNzaGVhZCl9LS0+JHJzc2hlYWQ8IS0tey9pZn0tLT4KCTwhLS17aWYgd2lkdGhhdXRvKCl9LS0+CgkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBpZD0iY3NzX3dpZHRoYXV0byIgdHlwZT0idGV4dC9jc3MiIGhyZWY9J3skX0dbJ3NldHRpbmcnXVsnY3NzcGF0aCddfXtTVFlMRUlEfV93aWR0aGF1dG8uY3NzP3tWRVJIQVNIfScgLz4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+SFRNTE5PREUuY2xhc3NOYW1lICs9ICcgd2lkdGhhdXRvJzwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddID09ICdmb3J1bScgfHwgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2dyb3VwJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19Zm9ydW0uanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17ZWxzZWlmICRfR1snYmFzZXNjcmlwdCddID09ICdob21lJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19aG9tZS5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ3BvcnRhbCd9LS0+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRfR1tzZXR0aW5nXVtqc3BhdGhdfXBvcnRhbC5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddICE9ICdwb3J0YWwnICYmICRfR0VUWydkaXknXSA9PSAneWVzJyAmJiBjaGVja19kaXlfcGVybSgkdG9waWMpfS0tPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskX0dbc2V0dGluZ11banNwYXRoXX1wb3J0YWwuanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBpZD0iZGl5X2NvbW1vbiIgaHJlZj0ieyRfR1snc2V0dGluZyddWydjc3NwYXRoJ119e1NUWUxFSUR9X2Nzc19kaXkuY3NzP3tWRVJIQVNIfSIgLz4KCTwhLS17L2lmfS0tPgo8L2hlYWQ+Cgo8Ym9keSBpZD0ibnZfeyRfR1tiYXNlc2NyaXB0XX0iIGNsYXNzPSJwZ197Q1VSTU9EVUxFfXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PT0gJ3BvcnRhbCcgJiYgQ1VSTU9EVUxFID09PSAnbGlzdCcgJiYgIWVtcHR5KCRjYXQpfSB7JGNhdFsnYm9keWNzcyddfXsvaWZ9IiBvbmtleWRvd249ImlmKGV2ZW50LmtleUNvZGU9PTI3KSByZXR1cm4gZmFsc2U7Ij4KCTxkaXYgaWQ9ImFwcGVuZF9wYXJlbnQiPjwvZGl2PjxkaXYgaWQ9ImFqYXh3YWl0aWQiPjwvZGl2PgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8IS0te3RlbXBsYXRlIGNvbW1vbi9oZWFkZXJfZGl5fS0tPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJPCEtLXt0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2RpeW5hdn0tLT4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiBDVVJNT0RVTEUgPT0gJ3RvcGljJyAmJiAkdG9waWMgJiYgZW1wdHkoJHRvcGljWyd1c2VoZWFkZXInXSkgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQkkZGl5bmF2Cgk8IS0tey9pZn0tLT4KCTwhLS17aWYgZW1wdHkoJHRvcGljKSB8fCAkdG9waWNbJ3VzZWhlYWRlciddfS0tPgoJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ21vYmlsZSddWydhbGxvd21vYmlsZSddICYmICghJF9HWydzZXR0aW5nJ11bJ2NhY2hlaW5kZXhsaWZlJ10gJiYgISRfR1snc2V0dGluZyddWydjYWNoZXRocmVhZG9uJ10gfHwgJF9HWyd1aWQnXSkgJiYgKCRfR0VUWydkaXknXSAhPSAneWVzJyB8fCAhJF9HRVRbJ2luYWpheCddKSAmJiAoJF9HWydtb2JpbGUnXSAhPSAnJyAmJiAkX0dbJ2Nvb2tpZSddWydtb2JpbGUnXSA9PSAnJyAmJiAkX0dFVFsnbW9iaWxlJ10gIT0gJ25vJyl9LS0+CgkJCTxkaXYgY2xhc3M9InhpMSBibSBibV9jIj4KCQkJICAgIHtsYW5nIHlvdXJfbW9iaWxlX2Jyb3dzZXJ9PGEgaHJlZj0ieyRfR1snc2l0ZXVybCddfWZvcnVtLnBocD9tb2JpbGU9eWVzIj57bGFuZyBnb190b19tb2JpbGV9PC9hPiA8c3BhbiBjbGFzcz0ieGcxIj58PC9zcGFuPiA8YSBocmVmPSIkX0dbJ3NldHRpbmcnXVsnbW9iaWxlJ11bJ25vbW9iaWxldXJsJ10iPntsYW5nIHRvX2JlX2NvbnRpbnVlfTwvYT4KCQkJPC9kaXY+CgkJPCEtLXsvaWZ9LS0+CgkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J10pICYmICRfR1snbWVtYmVyJ11bY3JlZGl0c10gPj0gJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J119LS0+CgkJCTxkaXYgaWQ9InNob3J0Y3V0Ij4KCQkJCTxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0Y2xvc2VpZCIgdGl0bGU9IntsYW5nIGNsb3NlfSI+e2xhbmcgY2xvc2V9PC9hPjwvc3Bhbj4KCQkJCXtsYW5nIHNob3J0Y3V0X25vdGljZX0KCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0dGlwIj57bGFuZyBzaG9ydGN1dF9hZGR9PC9hPgoKCQkJPC9kaXY+CgkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5zZXRUaW1lb3V0KHNldFNob3J0Y3V0LCAyMDAwKTs8L3NjcmlwdD4KCQk8IS0tey9pZn0tLT4KCQk8ZGl2IGlkPSJ0b3B0YiIgY2xhc3M9ImNsIj4KCQkJPCEtLXtob29rL2dsb2JhbF9jcG5hdl90b3B9LS0+CgkJCTxkaXYgY2xhc3M9IndwIj4KCQkJCTxkaXYgY2xhc3M9InoiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsndG9wbmF2cyddWzBdICRuYXZ9LS0+CgkJCQkJCTwhLS17aWYgaXNfYXJyYXkoJG5hdikgJiYgJG5hdlsnYXZhaWxhYmxlJ10gJiYgKCEkbmF2WydsZXZlbCddIHx8ICgkbmF2WydsZXZlbCddID09IDEgJiYgJF9HWyd1aWQnXSkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMiAmJiAkX0dbJ2FkbWluaWQnXSA+IDApIHx8ICgkbmF2WydsZXZlbCddID09IDMgJiYgJF9HWydhZG1pbmlkJ10gPT0gMSkpfS0tPiRuYXZbY29kZV08IS0tey9pZn0tLT4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfY3BuYXZfZXh0cmExfS0tPgoJCQkJPC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJ5Ij4KCQkJCQk8YSBpZD0ic3dpdGNoYmxpbmQiIGhyZWY9ImphdmFzY3JpcHQ6OyIgb25jbGljaz0idG9nZ2xlQmxpbmQodGhpcykiIHRpdGxlPSJ7bGFuZyBzd2l0Y2hfYmxpbmR9IiBjbGFzcz0ic3dpdGNoYmxpbmQiPjwvYT4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX2NwbmF2X2V4dHJhMn0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ3RvcG5hdnMnXVsxXSAkbmF2fS0tPgoJCQkJCQk8IS0te2lmIGlzX2FycmF5KCRuYXYpICYmICRuYXZbJ2F2YWlsYWJsZSddICYmICghJG5hdlsnbGV2ZWwnXSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAxICYmICRfR1sndWlkJ10pIHx8ICgkbmF2WydsZXZlbCddID09IDIgJiYgJF9HWydhZG1pbmlkJ10gPiAwKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAzICYmICRfR1snYWRtaW5pZCddID09IDEpKX0tLT4kbmF2W2NvZGVdPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8IS0te2lmIGVtcHR5KCRfR1snZGlzYWJsZWR3aWR0aGF1dG8nXSkgJiYgJF9HWydzZXR0aW5nJ11bJ3N3aXRjaHdpZHRoYXV0byddfS0tPgoJCQkJCQk8YSBocmVmPSJqYXZhc2NyaXB0OjsiIGlkPSJzd2l0Y2h3aWR0aCIgb25jbGljaz0id2lkdGhhdXRvKHRoaXMpIiB0aXRsZT0ie2lmIHdpZHRoYXV0bygpfXtsYW5nIHN3aXRjaF9uYXJyb3d9e2Vsc2V9e2xhbmcgc3dpdGNoX3dpZGV9ey9pZn0iIGNsYXNzPSJzd2l0Y2h3aWR0aCI+PCEtLXtpZiB3aWR0aGF1dG8oKX0tLT57bGFuZyBzd2l0Y2hfbmFycm93fTwhLS17ZWxzZX0tLT57bGFuZyBzd2l0Y2hfd2lkZX08IS0tey9pZn0tLT48L2E+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3VpZCddICYmICFlbXB0eSgkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10pfS0tPjxhIGlkPSJzc2xjdCIgaHJlZj0iamF2YXNjcmlwdDo7IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uKCkge3Nob3dNZW51KHsnY3RybGlkJzonc3NsY3QnLCdwb3MnOiczNCEnfSl9KTsiPntsYW5nIGNoYW5nZXN0eWxlfTwvYT48IS0tey9pZn0tLT4KCQkJCQk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJCQkJCSRkaXluYXYKCQkJCQk8IS0tey9pZn0tLT4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgkJPCEtLXtpZiAhSVNfUk9CT1R9LS0+CgkJCTwhLS17aWYgJF9HWyd1aWQnXSAmJiAhJF9HWydzZXR0aW5nJ11bJ2JiY2xvc2VkJ10gJiYgZW1wdHkoJF9HWydtZW1iZXInXVsnZnJlZXplJ10pICYmICRfR1snbWVtYmVyJ11bJ2dyb3VwaWQnXSAhPSA1fS0tPgoJCQk8dWwgaWQ9Im15cHJvbXB0X21lbnUiIGNsYXNzPSJwX3BvcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89cG0iIGlkPSJwbV9udGMiIHN0eWxlPSJiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjxlbSBjbGFzcz0icHJvbXB0X25ld3N7aWYgZW1wdHkoJF9HW21lbWJlcl1bbmV3cG1dKX1fMHsvaWZ9Ij48L2VtPntsYW5nIHBtX2NlbnRlcn08L2E+PC9saT4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZvbGxvd3N0YXR1cyddfS0tPgoJCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9Zm9sbG93JmRvPWZvbGxvd2VyIj48ZW0gY2xhc3M9InByb21wdF9mb2xsb3dlcntpZiBlbXB0eSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pfV8wey9pZn0iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3dlcn0tLT57aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93ZXJdfSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pey9pZn08L2E+PC9saT4KCQkJCQk8IS0te2lmICRfR1ttZW1iZXJdW25ld3Byb21wdF0gJiYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93XX0tLT4KCQkJCQkJPGxpPjxhIGhyZWY9ImhvbWUucGhwP21vZD1mb2xsb3ciPjxlbSBjbGFzcz0icHJvbXB0X2NvbmNlcm4iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3d9LS0+KCRfR1ttZW1iZXJdW25ld3Byb21wdF9udW1dW2ZvbGxvd10pPC9hPjwvbGk+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0XX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydtZW1iZXInXVsnY2F0ZWdvcnlfbnVtJ10gJGtleSAkdmFsfS0tPgoJCQkJCQk8bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPW5vdGljZSZ2aWV3PSRrZXkiPjxlbSBjbGFzcz0ibm90aWNlXyRrZXkiPjwvZW0+PCEtLXtlY2hvIGxhbmcoJ3RlbXBsYXRlJywgJ25vdGljZV8nLiRrZXkpfS0tPig8c3BhbiBjbGFzcz0icnEiPiR2YWw8L3NwYW4+KTwvYT48L2xpPgoJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgZW1wdHkoJF9HWydjb29raWUnXVsnaWdub3JlX25vdGljZSddKX0tLT4KCQkJCQk8bGkgY2xhc3M9Imlnbm9yZV9ub3RpY2VsaSI+PGEgaHJlZj0iamF2YXNjcmlwdDo7IiBvbmNsaWNrPSJzZXRjb29raWUoJ2lnbm9yZV9ub3RpY2UnLCAxKTtoaWRlTWVudSgnbXlwcm9tcHRfbWVudScpIiB0aXRsZT0ie2xhbmcgdGVtcG9yYXJpbHlfdG9fcmVtaW5kfSI+PGVtIGNsYXNzPSJpZ25vcmVfbm90aWNlIj48L2VtPjwvYT48L2xpPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCTwvdWw+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ10gJiYgIWVtcHR5KCRfR1snc3R5bGUnXVsnZXh0c3R5bGUnXSl9LS0+CgkJCQk8ZGl2IGlkPSJzc2xjdF9tZW51IiBjbGFzcz0iY2wgcF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAhJF9HW3N0eWxlXVtkZWZhdWx0ZXh0c3R5bGVdfS0tPjxzcGFuIGNsYXNzPSJzc2xjdF9idG4iIG9uY2xpY2s9ImV4dHN0eWxlKCcnKSIgdGl0bGU9IntsYW5nIGRlZmF1bHR9Ij48aT48L2k+PC9zcGFuPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10gJGV4dHN0eWxlfS0tPgoJCQkJCQk8c3BhbiBjbGFzcz0ic3NsY3RfYnRuIiBvbmNsaWNrPSJleHRzdHlsZSgnJGV4dHN0eWxlWzBdJykiIHRpdGxlPSIkZXh0c3R5bGVbMV0iPjxpIHN0eWxlPSdiYWNrZ3JvdW5kOiRleHRzdHlsZVsyXSc+PC9pPjwvc3Bhbj4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJPC9kaXY+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ119LS0+CgkJCQk8dWwgaWQ9Im15aXRlbV9tZW51IiBjbGFzcz0icF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZm9ydW1zdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPXRocmVhZCZ2aWV3PW1lIj57bGFuZyBteXBvc3R9PC9hPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZmF2b3JpdGVzdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPWZhdm9yaXRlJnZpZXc9bWUiPntsYW5nIGZhdm9yaXRlfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZyaWVuZHN0YXR1cyddfS0tPjxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89ZnJpZW5kIj57bGFuZyBmcmllbmRzfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfbXlpdGVtX2V4dHJhfS0tPgoJCQkJPC91bD4KCQkJPCEtLXsvaWZ9LS0+CgkJCTwhLS17c3VidGVtcGxhdGUgY29tbW9uL2hlYWRlcl9xbWVudX0tLT4KCQk8IS0tey9pZn0tLT4KCgkJPCEtLXthZC9oZWFkZXJiYW5uZXIvd3AgYV9ofS0tPgoJCTxkaXYgaWQ9ImhkIj4KCQkJPGRpdiBjbGFzcz0id3AiPgoJCQkJPGRpdiBjbGFzcz0iaGRjIGNsIj4KCQkJCQk8IS0te2V2YWwgJG1uaWQgPSBnZXRjdXJyZW50bmF2KCk7fS0tPgoJCQkJCTxoMj48IS0te2lmICFpc3NldCgkX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF0pfS0tPjxhIGhyZWY9IntpZiAkX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydkZWZhdWx0J119eyRfR1snc2NoZW1lJ119Oi8veyRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2RlZmF1bHQnXX0ve2Vsc2V9Li97L2lmfSIgdGl0bGU9IiRfR1snc2V0dGluZyddWydiYm5hbWUnXSI+eyRfR1snc3R5bGUnXVsnYm9hcmRsb2dvJ119PC9hPjwhLS17ZWxzZX0tLT4kX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF08IS0tey9pZn0tLT48L2gyPgoJCQkJCTwhLS17dGVtcGxhdGUgY29tbW9uL2hlYWRlcl91c2Vyc3RhdHVzfS0tPgoJCQkJPC9kaXY+CgoJCQkJPGRpdiBpZD0ibnYiPgoJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InFtZW51IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uICgpIHtzaG93TWVudSh7J2N0cmxpZCc6J3FtZW51JywncG9zJzonMzQhJywnY3RybGNsYXNzJzonYScsJ2R1cmF0aW9uJzoyfSk7c2hvd0ZvcnVtbWVudSgkX0dbZmlkXSk7fSkiPntsYW5nIG15X25hdn08L2E+CgkJCQkJPHVsPgoJCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ25hdnMnXSAkbmF2fS0tPgoJCQkJCQkJPCEtLXtpZiBpc19hcnJheSgkbmF2KSAmJiAkbmF2WydhdmFpbGFibGUnXSAmJiAoISRuYXZbJ2xldmVsJ10gfHwgKCRuYXZbJ2xldmVsJ10gPT0gMSAmJiAkX0dbJ3VpZCddKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAyICYmICRfR1snYWRtaW5pZCddID4gMCkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMyAmJiAkX0dbJ2FkbWluaWQnXSA9PSAxKSl9LS0+PGxpIHtpZiAkbW5pZCA9PSAkbmF2W25hdmlkXSB8fCBzdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sIDEpID09IHN0cl9yZXBsYWNlKCcuLycsICcnLCAkbmF2W2ZpbGVuYW1lXSl9Y2xhc3M9ImEiIHsvaWZ9JG5hdltuYXZdPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQkJPC91bD4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX25hdl9leHRyYX0tLT4KCQkJCTwvZGl2PgoJCQkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3BsdWdpbnMnXVsnanNtZW51J10pfS0tPgoJCQkJCTx1bCBjbGFzcz0icF9wb3AgaF9wb3AiIGlkPSJwbHVnaW5fbWVudSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsncGx1Z2lucyddWydqc21lbnUnXSAkbW9kdWxlfS0tPgoJCQkJCQkgPCEtLXtpZiBpbl9hcnJheSgkbW9kdWxlWydhZG1pbmlkJ10sIGFycmF5KDAsIC0xKSkgfHwgKCRtb2R1bGVbJ2FkbWluaWQnXSAmJiAkX0dbJ2FkbWluaWQnXSA+IDAgJiYgJG1vZHVsZVsnYWRtaW5pZCddID49ICRfR1snYWRtaW5pZCddKX0tLT4KCQkJCQkJIDxsaT4kbW9kdWxlW3VybF08L2xpPgoJCQkJCQkgPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8L3VsPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCQkkX0dbc2V0dGluZ11bbWVudW5hdnNdCgkJCQk8ZGl2IGlkPSJtdSIgY2xhc3M9ImNsIj4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ3N1Ym5hdnMnXX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HW3NldHRpbmddW3N1Ym5hdnNdICRuYXZpZCAkc3VibmF2fS0tPgoJCQkJCQk8IS0te2lmICRfR1snc2V0dGluZyddWyduYXZzdWJob3ZlciddIHx8ICRtbmlkID09ICRuYXZpZH0tLT4KCQkJCQkJPHVsIGNsYXNzPSJjbCB7aWYgJG1uaWQgPT0gJG5hdmlkfWN1cnJlbnR7L2lmfSIgaWQ9InNuYXZfJG5hdmlkIntpZiAkbW5pZCAhPSAkbmF2aWR9IHN0eWxlPSJkaXNwbGF5Om5vbmUiey9pZn0+CgkJCQkJCSRzdWJuYXYKCQkJCQkJPC91bD4KCQkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCTwhLS17L2lmfS0tPgoJCQkJPC9kaXY+CgkJCQk8IS0te2FkL3N1Ym5hdmJhbm5lci9hX211fS0tPgoJCQkJPCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vcHVic2VhcmNoZm9ybX0tLT4KCQkJPC9kaXY+CgkJPC9kaXY+CgoJCTwhLS17aG9vay9nbG9iYWxfaGVhZGVyfS0tPgoJPCEtLXsvaWZ9LS0+CgoJPGRpdiBpZD0id3AiIGNsYXNzPSJ3cCI+Cg==
qidao123.com ToB IT社区-企服评测·应用市场»论坛 › 主机系统 › linux › 使用服务器联合COLMAP方案实现自动化快速三维重修 ...
返回列表 发新帖

使用服务器联合COLMAP方案实现自动化快速三维重修

[复制链接]
发表于 2025-4-1 04:29:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
总体技术思路

自动化三维重修是指通过计算机视觉、照相测量学和计算几多么技术,自动地从一组无人机倾斜照相测量图像中创建出精确的三维模型的过程。具体包罗数据收罗与预处理、COLMAP稀疏重修、COLMAP麋集重修、地理配准与格式转换、COLMAP泊松格网重修、纹理贴图和3dtiles切片几个步骤。



  • 数据收罗与预处理:使用无人机进行多角度拍摄,获取高分辨率的图像数据,并通过特征提取和匹配准备用于三维重修的数据集 COLMAP
  • 稀疏重修:基于上一阶段生成的特征点匹配结果,初步规复场景的三维布局,包罗估计每个相机的位置和方向、生成稀疏点云,以及记载图像与相机间的关联信息。
  • COLMAP 麋集重修: 使用稀疏重修的结果进一步细化,生成更详细的稠密点云。
  • 地理配准与格式转换:为了使生成的三维模型能够在真实天下坐标系中准确表示,必要对其进行地理配准。这一步骤确保了模型的位置、巨细和方向都符合实际情况。完成地理配准后,将点云模型转换为其他通用格式(.las),便于跨平台共享和使用。
  • COLMAP泊松格网重修:使用COLMAP对地理配准后的点云文件进行泊松格网重修处理,通过计算泊松方程的方法将三维点云模型重修为具有三角格网表面的mesh模型
  • 纹理贴图:使用MeshLab对三维格网的mesh模型的表面进行处理,睁开成二维平面,创建UV坐标,并将纹理图像应用到相应的UV坐标上,以实现预期的视觉效果,结果导出为.obj格式文件和.png格式的纹理贴图
  • 3dtiles切片:使用cesiumLab或者obj2tiles工具分别对泊松麋集点云.las文件和带有纹理贴图的三维格网建模.obj文件进行3dtiles切片处理,最终得到.pnts集合的点云3dtiles切片和.b3dm集合的三维重修模型的3dtiles切片模型
工具摆设、数据收罗与预处理

(1)无人机倾斜照相数据集的收罗和预处理



  • 影像数据集的收罗:
①最好使用大疆无人机进行拍摄,至少应从三个独特(但并非截然不同)的视角拍摄被摄体的每个部分。一连影像的重叠地区通常应超过 2/3。同一物体部分的不同视角之间应保持 15 度以下的夹角。
②对于物件建模,在物体周围拍摄约莫 30-50 幅隔断均匀的影像
③对于场景建模,发起纵向重叠率和横向重叠率分别不低于 80% 和 50%。
④无人机拍摄的照片必须附带拍摄GPS的EXIF信息,只有具有该信息的影像集才可以才后续的地理配准环境为三维模型附上地理位置。




  • 影像数据集的预处理
COLMAP 提供了内置的畸变校正(undistortion)处理功能,这对于准备用于多视图立体匹配(MVS)的数据集尤为重要。通过畸变校正,可以生成无畸变的图像,这些图像更适合进行后续的麋集重修等操作
(2)COLMAP在服务器上的摆设

COLMAP 是一个通用的Structure-from-Motion (SfM) 和 Multi-View Stereo (MVS) 管道,提供了图形界面和命令行接口,支持有序或无序图像集合的重修。
参考链接:
留意:我的服务器为centos操作体系,因此只能通过源码安装的方式对colmap进行安装摆设
参考这个链接
Colmap在centos7下的编译
主要步骤为:


  • 1、安装GPU驱动CUDA 和 CUDNN
  • 2、编译环境准备
GCC升级
必要将GCC升级到5.4版本,以满意COLMAP的编译需求。这包罗下载、解压源码,设置编译选项,并实行make与make install进行编译安装。
底子包安装
使用yum命令安装一系列底子库,如cmake、build-essential等,为后续软件包的编译提供须要的开发工具和库文件。
第三方库安装
包罗Boost、gflags、glog、FreeImage和Ceres Solver在内的多个第三方库必要单独下载、编译并安装。每个库都有特定的安装步骤和留意事项,比如使用./bootstrap.sh初始化Boost的编译过程,对于gflags则通过cmake来构建动态链接库等。


  • 3、COLMAP的编译与安装
末了一步是从GitHub下载COLMAP源码,并创建构建目录。通过cmake …生成Makefile文件,然后运行make进行编译,最终完成COLMAP的安装。
  1. mkdir build
  2. cd build
  3. cmake ..
  4. # For CentOS users, use following command.
  5. # CentOS ships BOOST lib only with shared lib.
  6. # cmake .. -DBOOST_STATIC=OFF
  7. make -j16
  8. make intall
复制代码
这些命令行用于编译一个软件项目,通常是从源代码开始构建软件。下面是对每个命令的解释:

  • mkdir build

    • 这个命令创建了一个名为 build 的新目录。在软件开发中,通常会使用一个独立的目录来存放编译过程中生成的文件(如目的文件、可实行文件等),以保持源代码目录的干净。

  • cd build

    • 改变当前工作目录到刚刚创建的 build 目录。如许做的目的是在这个目录下进行所有的编译运动,而不是直接在源码目录中操作。

  • cmake ..

    • CMake 是一个跨平台的构建体系生成器。这个命令告诉 CMake 从上一级目录(即包罗 CMakeLists.txt 文件的目录)读取设置,并根据这些设置为当前目录生成当地构建文件(比方,在 Unix 体系上可能是 Makefile)。.. 表示 CMake 应该在父目录中探求 CMakeLists.txt 文件。
    • 对于 CentOS 用户,解释中的发起是假如遇到题目可以添加 -DBOOST_STATIC=OFF 参数,这是由于 CentOS 默认提供的 Boost 库只有共享库版本,而没有静态库版本。通过设置 -DBOOST_STATIC=OFF,可以让 CMake 设置项目时只链接共享库版本的 Boost。

  • make -j16

    • 这里的 -j16 告诉 make 工具并行运行最多 16 个使命(jobs)。这有助于加快编译过程,尤其是在多核处理器上。

  • make install

    • 这个命令实行安装步骤。它将根据 Makefile 中定义的规则,复制二进制文件、库文件、设置文件等须要的组件到体系的相应位置(比如 /usr/local/bin 或者 /usr/local/lib),以便可以在体系范围内使用该软件。通常必要适当的权限(如 root 权限)才气成功实行此命令,因此你可能必要用 sudo make install 来运行它。

COLMAP实现三维重修

COLMAP 进行三维重修的详细流程,包罗 GUI 和命令行两种方式
(1)使用 GUI 进行三维重修

留意:一般服务器没有gui界面的,但三维建模最好使用gui界面可以进行更好的结果查看
一般使用CentOS 7 安装GNOME的方法来创造GUI界面环境

然后使用VNC工具进行桌面gui环境的链接

最终服务器自带的结果界面如下所示:


  • 准备工程目录

    • 创建一个新的项目文件夹,并在此中创建 images 文件夹来存放要进行重修的图片。

  • 启动 COLMAP 并加载图像

    • 打开 COLMAP 的图形界面。
    • 通过菜单选择 File -> New Project,然后指定命据库文件路径和图片文件夹路径。

  • 特征提取

    • 在 Processing 菜单下选择 Feature Extraction 来开始特征点检测。此步骤会在每张图片中找到关键点并生成描述子。

  • 特征匹配

    • 接着选择 Feature Matching 来将不同图片中的特征点进行匹配。这一步会生成匹配矩阵,即不同视图之间同名特征的数目作为权重的图布局。

  • 稀疏重修

    • 在 Reconstruction 菜单下点击 Start Reconstruction 开始增量式建模过程。这个过程包罗相机姿态估计、三角化以及全局优化等步骤,最终生成稀疏点云模型。

  • 稠密重修

    • 稀疏重修完成后,可以进一步进行稠密重修。在 Reconstruction 菜单下选择 Dense Reconstruction,并选择生存数据的文件夹。


7. 结果查看与导出


  • 重修完成后,可以在 COLMAP 中查看结果,并通过 Export 功能将模型导出为常见格式如 .ply 或 .obj。
(2)使用命令行进行三维重修


  • 准备工程目录

    • 同样必要创建一个包罗 images 文件夹的项目文件夹。

  • 特征提取

    • 使用以下命令实行特征提取:
      1. colmap feature_extractor --database_path $DATASET_PATH/database.db --image_path $DATASET_PATH/images
      复制代码

  • 特征匹配

    • 根据图像数目选择符合的匹配策略,比方穷尽匹配(实用于少量图像)、序列匹配或空间匹配等。这里以穷尽匹配为例:
      1. colmap exhaustive_matcher --database_path $DATASET_PATH/database.db
      复制代码

  • 稀疏重修

    • 实行稀疏重修:
      1. mkdir $DATASET_PATH/sparse
      2. colmap mapper --database_path $DATASET_PATH/database.db --image_path $DATASET_PATH/images --output_path $DATASET_PATH/sparse
      复制代码

  • 稠密重修

    • 对原始图像去畸变:
      1. mkdir $DATASET_PATH/dense
      2. colmap image_undistorter --image_path $DATASET_PATH/images --input_path $DATASET_PATH/sparse/0 --output_path $DATASET_PATH/dense --output_type COLMAP --max_image_size 2000
      复制代码
    • 实行稠密重修:
      1. colmap patch_match_stereo --workspace_path $DATASET_PATH/dense --workspace_format COLMAP --PatchMatchStereo.geom_consistency true
      复制代码
    • 融合深度信息形成稠密点云:
      1. colmap stereo_fusion --workspace_path $DATASET_PATH/dense --workspace_format COLMAP --input_type geometric --output_path $DATASET_PATH/dense/fused.ply
      复制代码

  • 表面重修

    • 可选地,可以使用泊松曲面重修或狄洛尼三角网重修方法生成表面网格:
      1. colmap poisson_mesher --input_path $DATASET_PATH/dense/fused.ply --output_path $DATASET_PATH/dense/meshed-poisson.ply
      复制代码

无论是通过 GUI 照旧命令行,COLMAP 都提供了一套完整的流程来进行三维重修,从特征提取到稠密重修再到表面重修,每个阶段都有相应的参数调解空间,可以根据具体需求进行优化。
地理配准与格式转换

地理配准

参考链接:colmap笔记:将模型和影像位姿转换到GPS坐标系下
默认情况下,COLMAP 生成的模型是基于局部坐标系的,这意味着它们没有地理参考信息。为了将这些模型转换到基于 GPS 的全球坐标系下,可以使用 COLMAP 提供的 model_aligner 工具


  • 步骤一:准备数据
确保你的图像文件包罗 EXIF 数据,特殊是 GPS 位置信息。COLMAP 可以自动读取这些信息,但假如你的数据不包罗这些信息,你必要手动提供一个包罗图像名称及其对应 GPS 坐标的列表文件。


  • 步骤二:运行 COLMAP 稀疏重修
首先,你必要完成 COLMAP 的稀疏重修过程,这会生成一个位于局部坐标系中的三维模型以及相机的姿态信息。


  • 步骤三:使用 model_aligner 对齐模型
接下来,使用 model_aligner 工具来对齐模型。这个工具可以担当不同的参数设置,但基本命令如下所示:
  1. colmap model_aligner --input_path /data/colmap_project/test_uav/dense/poission --output_path /data/colmap_project/test_uav/dense/poission/gps --database_path /data/colmap_project/test_uav/database.db --ref_is_gps 1 --alignment_type ecef --alignment_max_error 3.0
复制代码
参数解释
–input_path: 指定了输入模型的路径,这里是 /data/colmap_project/test_uav/dense/poission。这个目录通常包罗由 COLMAP 生成的稀疏或稠密重修结果,包罗相机姿态(images.txt)、相机参数(cameras.txt)和点云数据(points3D.txt)等文件。
–output_path: 指定了输出路径,即对齐后的模型将会被生存在这个位置:/data/colmap_project/test_uav/dense/poission/gps。这里会生成新的相机姿态、相机参数和点云数据文件,它们已经被转换到了指定的坐标系中。
–database_path: 提供了包罗图像元数据的数据库文件路径,这里是 /data/colmap_project/test_uav/database.db。这个数据库包罗了特征匹配信息和其他与图像相干的信息,对于某些范例的对齐操作可能是必需的。
–ref_is_gps: 设置为 1 表示所提供的参考坐标是 GPS 坐标。这意味着在进行对齐时,model_aligner 将实行使用这些 GPS 数据作为参考来调解模型的位置和方向。
–alignment_type: 定义了要使用的坐标转换范例,在这个例子中设置为 ecef,即地球中心地固坐标系(Earth-Centered, Earth-Fixed)。这是一种全球坐标体系,实用于必要精确地理位置的应用场景。
–alignment_max_error: 设置了用于鲁棒对齐的最大误差阈值,单位为米。在这个例子中设置为 3.0 米。这个参数控制了 RANSAC 算法在探求最佳变换时答应的最大毛病值,有助于过滤掉可能存在的异常值或不准确的数据点。
留意:model_aligner处理的点云文件必须拥有完整相机信息images.txt和camera.txt文件,也就是这两个文件不能为空,但poission重修得到的点云没有images.txt和camera.txt文件信息
解决办法:将稀疏重修得到的点云文件由.bin格式转化为.txt格式,然后将稀疏点云得到images.txt和camera.txt文件取代poission重修导出点云的images.txt和camera.txt文件,再对poission重修导出的点云进行model_aligner 对齐操作
最终得到gps实际地理坐标下的泊松重修模型

参考信息:colmap生成的三个txt文件:camera.txt image.txt和point3D.txt

cameras.txt

这个文件包罗了数据集中所有重修相机的内在参数(即相机内参),每个相机占一行。每一行的数据布局如下:
  1. # Camera list with one line of data per camera:
  2. # CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
  3. # 相机ID, 相机模型, 宽度, 高度, 参数数组
复制代码
比方:
  1. 1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
复制代码
这里的参数根据不同的相机模型而有所不同,比如 SIMPLE_PINHOLE 模型必要焦距和主点坐标作为参数。
images.txt

该文件包罗了数据集中所有重修图像的姿态(位姿)和关键点,每张图像占两行。第一行包罗图像的姿态信息和相机ID及名称,第二行则是与该图像关联的关键点及其对应的三维点ID。每一行的数据布局如下:
  1. # Image list with two lines of data per image:
  2. # IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
  3. # POINTS2D[] as (X, Y, POINT3D_ID)
复制代码
比方:
  1. 1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
  2. 2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
复制代码
这里使用四元数 (QW, QX, QY, QZ) 和平移向量 (TX, TY, TZ) 来表示图像的姿态,而 (X, Y, POINT3D_ID) 则是图像上的二维特征点及其对应三维点的ID 。
points3D.txt

该文件包罗了数据集中所有重修的三维点的信息,每个点占一行。每一行的数据布局如下:
  1. # 3D point list with one line of data per point:
  2. # POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
复制代码
比方:
  1. 63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227 63376
复制代码
这里包罗了三维点的坐标 (X, Y, Z)、颜色信息 (R, G, B)、重投影误差 ERROR 以及该点出现在哪些图像中的记载 TRACK[],即图像ID和在图像中的二维点索引 。
格式转换

CloudCompare是一款开源的三维点云(和三角形网格)处理软件

CloudCompare是使用C++开发的,用户界面基于Qt,图形渲染使用OpenGL。它可以在Windows、MacOS和Linux操作体系上运行,而且支持32位和64位体系布局。由于其高效的算法实现和精良的架构设计,CloudCompare能够在标准笔记本电脑上处理大规模的点云——通常超过1000万个点
留意:要将通过泊松重修得到的 .ply 文件转换为 .las 文件,此中在导入.ply文件时选择yes to all选项,要不在转化的时间会导致.las文件的三维地理坐标堕落

转换后在cesiumlab中设置空间参考为EPSG:4978即可得到点云的三位切片模型,并可以加载在地球上

EPSG:4978
EPSG:4978 是基于WGS 84参考椭球的地心地固直角坐标系(Earth-Centered, Earth-Fixed, ECEF),即colmap地理配准后三维模型自带的坐标信息,它是一种三维笛卡尔坐标系,用于表示地球表面或其上方/下方点的位置。在这种坐标系中,地球被视为一个完美的旋转椭球体,而且坐标系的原点位于地球的质量中心(质心)。
具体来说,EPSG:4978 坐标系具有以下特征:


  • 原点:地球的质心。
  • X轴:延伸通过本初子午线(0度经线)和赤道(0度纬线)的交点。
  • Y轴:与X轴垂直且位于赤道平面内,指向东经90度的方向。
  • Z轴:延伸通过北极,即与地球的自转轴重合。
与EPSG:4326的转换关系:

COLMAP泊松格网重修

这里其实colmap已经对稠密三维点云(fused.ply)文件进行了泊松三维格网的重修了,但是这个重修的mesh模型没有真实的地理信息,准确说是有相机的位置姿态信息,只是没有地理位置和巨细缩放信息
- 解决地理位置信息可以在obj2tiles工具进行3dtiles切片时自动设置
  1. /home/sy_cmsr/obj2tiles/Obj2Tiles /data/colmap_project/obj/colmap_uav/texture/texture.obj /data/colmap_project/obj/colmap_uav/texture/3dtiles --lat 30.448310 --lon 114.576916 --alt 17.670332
复制代码
- 解决巨细缩放信息必要借助meshlab和Cloudcompare工具联合解决
1、首先在Cloudcompare中使用mesh工具对真实地理坐标下泊松重修后的三维点云进行格网化处理

得到三维mesh模型的粗糙模型(粗糙模型就够了,由于精细模型colmap已经建好了,我只必要得到两者的巨细缩放关系即可)

2、在Cloudcompare中使用使用测量工具分别量测地理设置后的mesh模型和精细的meshed-poission模型多个地理构筑体的间隔,量测多个间隔后取平均值可以得到地理设置后的mesh模型和精细的meshed-poission模型间的缩放关系。
比方8.409/0.658=12.78 缩放关系大致在12.78上下的区间里面


3、在meshlab中对精细的meshed-poission模型进行缩放出来,主要是使用transform:Scale,Normalize工具处理,,即可得到正常缩放巨细下的mesh三维格网模型

三维mesh格网模型 meshed-poisson-transform.ply文件

meshlab纹理贴图

.obj三维纹理贴图文件必要的文件布局:


  • 获取模型文件:确保你有一个包罗纹理坐标信息的模型文件(比方.obj)。这个文件应该已经包罗了顶点(v)、纹理坐标(vt)、法线(vn)以及面片(f)的信息,而且这些信息正确地引用了材质文件。
  • 材质文件:假如你的模型使用了材质,你必要一个对应的.mtl文件。该文件定义了材质属性,包罗颜色、透明度等,并指定了用于渲染的纹理图像文件名。
  • 纹理图像:准备好你的纹理图像文件(通常是.png或.jpg格式),并确保其路径与.mtl文件中的指定相匹配。
1、参数化(Parameterization)

这一步是为了创建UV坐标,将三维平面转为二维平面, 使其可以将mesh文件的颜色附着在UV坐标上形成纹理图片
2、纹理投影
这里可以设置纹理投影图片的像素巨细
![

3、导出为.obj文件

3dtiles切片处理

留意使用obj2tiles工具进行处理
源码链接:Obj2Tiles
命令行参数:
  1.   Input (pos. 0)         Required. Input OBJ file.
  2.   Output (pos. 1)        Required. Output folder.
  3.   
  4.   -s, --stage            (Default: Tiling) Stage to stop at (Decimation, Splitting, Tiling)
  5.   
  6.   -l, --lods             (Default: 3) How many levels of details
  7.   -d, --divisions        (Default: 2) How many tiles divisions
  8.   -z, --zsplit           (Default: false) Splits along z-axis too
  9.   -k, --keeptextures     (Default: false) Keeps original textures
  10.   
  11.   --lat                  Latitude of the mesh
  12.   --lon                  Longitude of the mesh
  13.   --alt                  (Default: 0) Altitude of the mesh (meters)
  14.   -e, --error            (Default: 100), baseError value for root node
  15.   --scale                (Default: 1), scale for data if using units other than meters ( 1200.0/3937.0 for survey ft)  
  16.   
  17.   --y-up-to-z-up         (Default: false) Converts Y-up to Z-up
  18.   
  19.   --use-system-temp      (Default: false) Uses the system temp folder
  20.   --keep-intermediate    (Default: false) Keeps the intermediate files (do not cleanup)
  21.       
  22.   --help                 Display this help screen.
  23.   --version              Display version information.
复制代码
为了增加 Levels of Detail (LOD) 的层级数目,你可以使用 -l 或 --lods 参数来指定你盼望生成的 LOD 层级数目。默认情况下,这个值是 3。下面是对命令中各个参数寄义的阐明,以及如何设置更多的 LOD 层级。

参数解释


  • Input (pos. 0): 必须提供的输入 OBJ 文件路径。
  • Output (pos. 1): 输出文件夹路径,用于存放转换后的 3D Tiles 数据。
  • -s, --stage: 设置处理过程停止的阶段。可选项包罗 Decimation(简化)、Splitting(分割)和 Tiling(瓦片化)。默认是 Tiling。
  • -l, --lods: 设置细节层次(LOD)的数目。假如你想增加 LOD 层级,可以通过此参数调解。比方,若要设置为5级LOD,则使用 -l 5。
  • -d, --divisions: 设置每个 LOD 层级中的分割数。更高的数值意味着更细的分割,但也会消耗更多内存和处理时间。默认值为2。
  • -z, --zsplit: 是否沿Z轴进行分割。默认是 false。假如模型必要在高度方向上有更细致的划分,可以设为 true。
  • -k, --keeptextures: 是否保存原始纹理。默认是 false。假如你想要保持原始材质和纹理,可以设为 true。
  • –lat: 模型放置的纬度坐标。
  • –lon: 模型放置的经度坐标。
  • –alt: 模型放置的海拔高度,默认是0米。
  • -e, --error: 根节点的底子误差值(baseError),影响LOD分辨率。较低的误差值会使得模型在更大的间隔上保持更高的分辨率。默认值为100。
  • –scale: 假如使用的单位不是米,可通过此参数调解比例。比方,对于测量英尺,可以使用 1200.0/3937.0。
  • –y-up-to-z-up: 是否将Y向上坐标系转换为Z向上坐标系。默认是 false。
  • –use-system-temp: 是否使用体系的临时文件夹存储中间数据。默认是 false。
  • –keep-intermediate: 是否保存处理过程中产生的中间文件而不清理。默认是 false。这有助于调试,但会占用更多磁盘空间。
调解其他参数以优化性能



  • 假如发现内存不敷或处理速度慢,可以思量减少 -l和-d 参数的值(比方从默认的2降低到1),这将减少LOD的层级和每个LOD层级的细分数目,从而降低内存使用和计算复杂度。
  • 同时,适当调解 -e 参数的底子误差值也可以资助平衡LOD之间的平滑过渡与性能之间的关系。
通过这些参数的调解,你可以根据本身的需求优化输出的3D Tiles数据集,无论是为了更好的视觉效果照旧为了适应硬件资源限制。假如有特定的需求或遇到题目,请提供更多信息以便进一步资助。
最终在cesiumlab中加载3dtiles切片模型的效果

回复

使用道具 举报

返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-11-4 07:18 , Processed in 0.031227 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表