Merge branch 'bordel_laurent' of git.inpt.fr:tocard-inc/enseeiht/projet-be into bordel_laurent
This commit is contained in:
commit
0d52c9e351
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -2,6 +2,8 @@
|
||||||
data
|
data
|
||||||
assets
|
assets
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
|
||||||
*.blend1
|
*.blend1
|
||||||
|
|
||||||
# https://github.com/github/gitignore/blob/main/Python.gitignore
|
# https://github.com/github/gitignore/blob/main/Python.gitignore
|
||||||
|
|
7
.vscode/extensions.json
vendored
Normal file
7
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"editorconfig.editorconfig",
|
||||||
|
"njpwerner.autodocstring",
|
||||||
|
"ms-python.python"
|
||||||
|
]
|
||||||
|
}
|
16
.vscode/launch.json
vendored
Normal file
16
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Python: Current File",
|
||||||
|
"type": "python",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/src/main.py",
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"justMyCode": true,
|
||||||
|
"env": {
|
||||||
|
"PYGAME_HIDE_SUPPORT_PROMPT": "hide"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
28
.vscode/settings.json
vendored
Normal file
28
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"python.defaultInterpreterPath": ".venv/bin/python",
|
||||||
|
"python.analysis.typeCheckingMode": "basic",
|
||||||
|
"python.formatting.provider": "black",
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"python.linting.enabled": true,
|
||||||
|
"python.linting.lintOnSave": true,
|
||||||
|
"python.linting.flake8Enabled": true,
|
||||||
|
"python.linting.mypyEnabled": true,
|
||||||
|
"python.linting.banditEnabled": true,
|
||||||
|
"python.languageServer": "Pylance",
|
||||||
|
"[python]": {
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.organizeImports": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.git": true,
|
||||||
|
"**/.svn": true,
|
||||||
|
"**/.hg": true,
|
||||||
|
"**/CVS": true,
|
||||||
|
"**/.DS_Store": true,
|
||||||
|
"**/Thumbs.db": true,
|
||||||
|
"**/__pycache__": true,
|
||||||
|
"**/.mypy_cache": true,
|
||||||
|
},
|
||||||
|
"nixEnvSelector.nixFile": "${workspaceRoot}/shell.nix",
|
||||||
|
}
|
10479
docs/package-lock.json
generated
Normal file
10479
docs/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
7
docs/package.json
Normal file
7
docs/package.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"@slidev/cli": "^0.38.5",
|
||||||
|
"@slidev/theme-default": "^0.21.2",
|
||||||
|
"slidev-theme-academic": "^1.1.1"
|
||||||
|
}
|
||||||
|
}
|
22
docs/slides.md
Normal file
22
docs/slides.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
theme: academic
|
||||||
|
class: text-white
|
||||||
|
coverAuthor: Laurent Fainsin, Damien Guillotin, Pierre-Eliot Jourdan
|
||||||
|
coverBackgroundUrl: >-
|
||||||
|
https://images.unsplash.com/photo-1655720408861-8b04c0724fd9?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8
|
||||||
|
coverBackgroundSource: unplash
|
||||||
|
coverBackgroundSourceUrl: https://unsplash.com/photos/Vc0CmuIfMg0
|
||||||
|
coverDate: '2023-01-05'
|
||||||
|
themeConfig:
|
||||||
|
paginationX: r
|
||||||
|
paginationY: t
|
||||||
|
paginationPagesDisabled:
|
||||||
|
- 1
|
||||||
|
title: Bureau d'étude de PI3D
|
||||||
|
---
|
||||||
|
|
||||||
|
# Bureau d'étude de PI3D
|
||||||
|
|
||||||
|
Sujet 6 - Reformulation du MVS par level sets
|
||||||
|
|
||||||
|
---
|
|
@ -22,6 +22,7 @@
|
||||||
gtk2 = pkgs.gtk2;
|
gtk2 = pkgs.gtk2;
|
||||||
})
|
})
|
||||||
blender
|
blender
|
||||||
|
nodejs
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
459
poetry.lock
generated
459
poetry.lock
generated
|
@ -113,6 +113,93 @@ files = [
|
||||||
[package.extras]
|
[package.extras]
|
||||||
test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"]
|
test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "contourpy"
|
||||||
|
version = "1.0.7"
|
||||||
|
description = "Python library for calculating contours of 2D quadrilateral grids"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"},
|
||||||
|
{file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"},
|
||||||
|
{file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"},
|
||||||
|
{file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"},
|
||||||
|
{file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"},
|
||||||
|
{file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"},
|
||||||
|
{file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"},
|
||||||
|
{file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"},
|
||||||
|
{file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"},
|
||||||
|
{file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"},
|
||||||
|
{file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"},
|
||||||
|
{file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"},
|
||||||
|
{file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"},
|
||||||
|
{file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"},
|
||||||
|
{file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"},
|
||||||
|
{file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
numpy = ">=1.16"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
bokeh = ["bokeh", "chromedriver", "selenium"]
|
||||||
|
docs = ["furo", "sphinx-copybutton"]
|
||||||
|
mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"]
|
||||||
|
test = ["Pillow", "matplotlib", "pytest"]
|
||||||
|
test-no-images = ["pytest"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cycler"
|
||||||
|
version = "0.11.0"
|
||||||
|
description = "Composable style cycles"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
files = [
|
||||||
|
{file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"},
|
||||||
|
{file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "distlib"
|
name = "distlib"
|
||||||
version = "0.3.6"
|
version = "0.3.6"
|
||||||
|
@ -204,6 +291,32 @@ TOMLi = {version = "*", markers = "python_version < \"3.11\""}
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["pyTest", "pyTest-cov"]
|
dev = ["pyTest", "pyTest-cov"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fonttools"
|
||||||
|
version = "4.38.0"
|
||||||
|
description = "Tools to manipulate font files"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"},
|
||||||
|
{file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"]
|
||||||
|
graphite = ["lz4 (>=1.7.4.2)"]
|
||||||
|
interpolatable = ["munkres", "scipy"]
|
||||||
|
lxml = ["lxml (>=4.0,<5)"]
|
||||||
|
pathops = ["skia-pathops (>=0.5.0)"]
|
||||||
|
plot = ["matplotlib"]
|
||||||
|
repacker = ["uharfbuzz (>=0.23.0)"]
|
||||||
|
symfont = ["sympy"]
|
||||||
|
type1 = ["xattr"]
|
||||||
|
ufo = ["fs (>=2.2.0,<3)"]
|
||||||
|
unicode = ["unicodedata2 (>=14.0.0)"]
|
||||||
|
woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gitdb"
|
name = "gitdb"
|
||||||
version = "4.0.10"
|
version = "4.0.10"
|
||||||
|
@ -267,6 +380,146 @@ pipfile-deprecated-finder = ["pipreqs", "requirementslib"]
|
||||||
plugins = ["setuptools"]
|
plugins = ["setuptools"]
|
||||||
requirements-deprecated-finder = ["pip-api", "pipreqs"]
|
requirements-deprecated-finder = ["pip-api", "pipreqs"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kiwisolver"
|
||||||
|
version = "1.4.4"
|
||||||
|
description = "A fast implementation of the Cassowary constraint solver"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"},
|
||||||
|
{file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"},
|
||||||
|
{file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"},
|
||||||
|
{file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "matplotlib"
|
||||||
|
version = "3.6.3"
|
||||||
|
description = "Python plotting package"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:80c166a0e28512e26755f69040e6bf2f946a02ffdb7c00bf6158cca3d2b146e6"},
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eb9421c403ffd387fbe729de6d9a03005bf42faba5e8432f4e51e703215b49fc"},
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5223affa21050fb6118353c1380c15e23aedfb436bf3e162c26dc950617a7519"},
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00c248ab6b92bea3f8148714837937053a083ff03b4c5e30ed37e28fc0e7e56"},
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca94f0362f6b6f424b555b956971dcb94b12d0368a6c3e07dc7a40d32d6d873d"},
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59400cc9451094b7f08cc3f321972e6e1db4cd37a978d4e8a12824bf7fd2f03b"},
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-win32.whl", hash = "sha256:57ad1aee29043163374bfa8990e1a2a10ff72c9a1bfaa92e9c46f6ea59269121"},
|
||||||
|
{file = "matplotlib-3.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:1fcc4cad498533d3c393a160975acc9b36ffa224d15a6b90ae579eacee5d8579"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d2cfaa7fd62294d945b8843ea24228a27c8e7c5b48fa634f3c168153b825a21b"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c3f08df2ac4636249b8bc7a85b8b82c983bef1441595936f62c2918370ca7e1d"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff2aa84e74f80891e6bcf292ebb1dd57714ffbe13177642d65fee25384a30894"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11011c97d62c1db7bc20509572557842dbb8c2a2ddd3dd7f20501aa1cde3e54e"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c235bf9be052347373f589e018988cad177abb3f997ab1a2e2210c41562cc0c"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bebcff4c3ed02c6399d47329f3554193abd824d3d53b5ca02cf583bcd94470e2"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-win32.whl", hash = "sha256:d5f18430f5cfa5571ab8f4c72c89af52aa0618e864c60028f11a857d62200cba"},
|
||||||
|
{file = "matplotlib-3.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:dfba7057609ca9567b9704626756f0142e97ec8c5ba2c70c6e7bd1c25ef99f06"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:9fb8fb19d03abf3c5dab89a8677e62c4023632f919a62b6dd1d6d2dbf42cd9f5"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bbf269e1d24bc25247095d71c7a969813f7080e2a7c6fa28931a603f747ab012"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:994637e2995b0342699b396a320698b07cd148bbcf2dd2fa2daba73f34dd19f2"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77b384cee7ab8cf75ffccbfea351a09b97564fc62d149827a5e864bec81526e5"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:73b93af33634ed919e72811c9703e1105185cd3fb46d76f30b7f4cfbbd063f89"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:debeab8e2ab07e5e3dac33e12456da79c7e104270d2b2d1df92b9e40347cca75"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-win32.whl", hash = "sha256:acc3b1a4bddbf56fe461e36fb9ef94c2cb607fc90d24ccc650040bfcc7610de4"},
|
||||||
|
{file = "matplotlib-3.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:1183877d008c752d7d535396096c910f4663e4b74a18313adee1213328388e1e"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6adc441b5b2098a4b904bbf9d9e92fb816fef50c55aa2ea6a823fc89b94bb838"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6d81b11ede69e3a751424b98dc869c96c10256b2206bfdf41f9c720eee86844c"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:29f17b7f2e068dc346687cbdf80b430580bab42346625821c2d3abf3a1ec5417"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f56a7252eee8f3438447f75f5e1148a1896a2756a92285fe5d73bed6deebff4"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbddfeb1495484351fb5b30cf5bdf06b3de0bc4626a707d29e43dfd61af2a780"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809119d1cba3ece3c9742eb01827fe7a0e781ea3c5d89534655a75e07979344f"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-win32.whl", hash = "sha256:e0a64d7cc336b52e90f59e6d638ae847b966f68582a7af041e063d568e814740"},
|
||||||
|
{file = "matplotlib-3.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:79e501eb847f4a489eb7065bb8d3187117f65a4c02d12ea3a19d6c5bef173bcc"},
|
||||||
|
{file = "matplotlib-3.6.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2787a16df07370dcba385fe20cdd0cc3cfaabd3c873ddabca78c10514c799721"},
|
||||||
|
{file = "matplotlib-3.6.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68d94a436f62b8a861bf3ace82067a71bafb724b4e4f9133521e4d8012420dd7"},
|
||||||
|
{file = "matplotlib-3.6.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b409b2790cf8d7c1ef35920f01676d2ae7afa8241844e7aa5484fdf493a9a0"},
|
||||||
|
{file = "matplotlib-3.6.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:faff486b36530a836a6b4395850322e74211cd81fc17f28b4904e1bd53668e3e"},
|
||||||
|
{file = "matplotlib-3.6.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:38d38cb1ea1d80ee0f6351b65c6f76cad6060bbbead015720ba001348ae90f0c"},
|
||||||
|
{file = "matplotlib-3.6.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f999661589981e74d793ee2f41b924b3b87d65fd929f6153bf0f30675c59b1"},
|
||||||
|
{file = "matplotlib-3.6.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01b7f521a9a73c383825813af255f8c4485d1706e4f3e2ed5ae771e4403a40ab"},
|
||||||
|
{file = "matplotlib-3.6.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9ceebaf73f1a3444fa11014f38b9da37ff7ea328d6efa1652241fe3777bfdab9"},
|
||||||
|
{file = "matplotlib-3.6.3.tar.gz", hash = "sha256:1f4d69707b1677560cd952544ee4962f68ff07952fb9069ff8c12b56353cb8c9"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
contourpy = ">=1.0.1"
|
||||||
|
cycler = ">=0.10"
|
||||||
|
fonttools = ">=4.22.0"
|
||||||
|
kiwisolver = ">=1.0.1"
|
||||||
|
numpy = ">=1.19"
|
||||||
|
packaging = ">=20.0"
|
||||||
|
pillow = ">=6.2.0"
|
||||||
|
pyparsing = ">=2.2.1"
|
||||||
|
python-dateutil = ">=2.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mccabe"
|
name = "mccabe"
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
|
@ -414,6 +667,18 @@ numpy = [
|
||||||
{version = ">=1.17.3", markers = "python_version >= \"3.8\""},
|
{version = ">=1.17.3", markers = "python_version >= \"3.8\""},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "packaging"
|
||||||
|
version = "23.0"
|
||||||
|
description = "Core utilities for Python packages"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"},
|
||||||
|
{file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pathspec"
|
name = "pathspec"
|
||||||
version = "0.10.3"
|
version = "0.10.3"
|
||||||
|
@ -438,6 +703,90 @@ files = [
|
||||||
{file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"},
|
{file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pillow"
|
||||||
|
version = "9.4.0"
|
||||||
|
description = "Python Imaging Library (Fork)"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"},
|
||||||
|
{file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"},
|
||||||
|
{file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"},
|
||||||
|
{file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"},
|
||||||
|
{file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"},
|
||||||
|
{file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"},
|
||||||
|
{file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"},
|
||||||
|
{file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"},
|
||||||
|
{file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"},
|
||||||
|
{file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"},
|
||||||
|
{file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"},
|
||||||
|
{file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"},
|
||||||
|
{file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"},
|
||||||
|
{file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"},
|
||||||
|
{file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"},
|
||||||
|
{file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"},
|
||||||
|
{file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"},
|
||||||
|
{file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"},
|
||||||
|
{file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"},
|
||||||
|
{file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"},
|
||||||
|
{file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"},
|
||||||
|
{file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"},
|
||||||
|
{file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"]
|
||||||
|
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "platformdirs"
|
name = "platformdirs"
|
||||||
version = "2.6.2"
|
version = "2.6.2"
|
||||||
|
@ -530,6 +879,63 @@ files = [
|
||||||
[package.extras]
|
[package.extras]
|
||||||
plugins = ["importlib-metadata"]
|
plugins = ["importlib-metadata"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pymcubes"
|
||||||
|
version = "0.1.4"
|
||||||
|
description = "Marching cubes for Python"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "PyMCubes-0.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a4c2052f71cb6de3bae6939f767ddf5947f903bcc2fe0137aaf131fc3b3f5da9"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d365b2b9d356d69f905156089101d24e2c220b01c7ddc0a3a2a3f26480111ff0"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:b62ad5685df1a6535992d982952e371805d5377cbca926ca22ccef278549d204"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb2cdd50c0bd79353f9c4ddc02d98d05e20ae78a0e2db838aab69e68219f77b"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5491688444a0b03a43b6218eb7f0e4ebc1c438d470946f9fc0431dc5405404fc"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:e52fef7de79df1033ba0c51aed7a9e2a9334d837b28966309caa5147d336e8ce"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:34cb416db34aa4088b330fde0d834b8a18b57f08207174bd5f9f6e6d9d319007"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33a2121528d5dbf42cb24d8fe8395de6b7c3f6dc72f881320e715e2aa974589d"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3fa47c036cbd83678df65edc84a54f4a8ec604e33b842786903ea22e3dd00480"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b95dad470bb117404e97944754ddc45f8a3abf824376469dbd8e88e08bd6d3e"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e6e9502bda5bb9a820384eadc52ebc48c9638e16493573d974ef431165ffb6"},
|
||||||
|
{file = "PyMCubes-0.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:4902d9421bf3fb3436159873300bd9db807238401c4d0f144deb897edfe17f73"},
|
||||||
|
{file = "PyMCubes-0.1.4.tar.gz", hash = "sha256:ad25e96f5a32fb5a363372005a4b68eaf03025c1e781ada62e73b10b45ff7cbb"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
numpy = "*"
|
||||||
|
scipy = ">=1.0.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyparsing"
|
||||||
|
version = "3.0.9"
|
||||||
|
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6.8"
|
||||||
|
files = [
|
||||||
|
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
|
||||||
|
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
diagrams = ["jinja2", "railroad-diagrams"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-dateutil"
|
||||||
|
version = "2.8.2"
|
||||||
|
description = "Extensions to the standard Python datetime module"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
|
||||||
|
files = [
|
||||||
|
{file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
|
||||||
|
{file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
six = ">=1.5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyyaml"
|
name = "pyyaml"
|
||||||
version = "6.0"
|
version = "6.0"
|
||||||
|
@ -600,6 +1006,45 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9
|
||||||
[package.extras]
|
[package.extras]
|
||||||
jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"]
|
jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "scipy"
|
||||||
|
version = "1.9.3"
|
||||||
|
description = "Fundamental algorithms for scientific computing in Python"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"},
|
||||||
|
{file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"},
|
||||||
|
{file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"},
|
||||||
|
{file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"},
|
||||||
|
{file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"},
|
||||||
|
{file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"},
|
||||||
|
{file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"},
|
||||||
|
{file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"},
|
||||||
|
{file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"},
|
||||||
|
{file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"},
|
||||||
|
{file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"},
|
||||||
|
{file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"},
|
||||||
|
{file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"},
|
||||||
|
{file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"},
|
||||||
|
{file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"},
|
||||||
|
{file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"},
|
||||||
|
{file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"},
|
||||||
|
{file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"},
|
||||||
|
{file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"},
|
||||||
|
{file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"},
|
||||||
|
{file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
numpy = ">=1.18.5,<1.26.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"]
|
||||||
|
doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"]
|
||||||
|
test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "setuptools"
|
name = "setuptools"
|
||||||
version = "65.6.3"
|
version = "65.6.3"
|
||||||
|
@ -617,6 +1062,18 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g
|
||||||
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "six"
|
||||||
|
version = "1.16.0"
|
||||||
|
description = "Python 2 and 3 compatibility utilities"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
files = [
|
||||||
|
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||||
|
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smmap"
|
name = "smmap"
|
||||||
version = "5.0.0"
|
version = "5.0.0"
|
||||||
|
@ -704,4 +1161,4 @@ testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = ">=3.8.1,<4.0"
|
python-versions = ">=3.8.1,<4.0"
|
||||||
content-hash = "70277d35aa55c1022524e37b75fcd711637ee16fb1737bc157244cf83d57efff"
|
content-hash = "8973ba110b5bc10710b9406373863d3874c9516bc2b82a58181727178cbd82a8"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
authors = ["Laurent Fainsin <laurentfainsin@protonmail.com>"]
|
authors = [""]
|
||||||
description = ""
|
description = ""
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
name = "projet-be"
|
name = "projet-be"
|
||||||
|
@ -12,6 +12,7 @@ rich = "^12.6.0"
|
||||||
opencv-python = "^4.6.0.66"
|
opencv-python = "^4.6.0.66"
|
||||||
fake-bpy-module-latest = "^20230118"
|
fake-bpy-module-latest = "^20230118"
|
||||||
matplotlib = "^3.6.3"
|
matplotlib = "^3.6.3"
|
||||||
|
pymcubes = "^0.1.4"
|
||||||
|
|
||||||
[tool.poetry.group.dev.dependencies]
|
[tool.poetry.group.dev.dependencies]
|
||||||
Flake8-pyproject = "^1.1.0"
|
Flake8-pyproject = "^1.1.0"
|
||||||
|
|
|
@ -1,25 +1,27 @@
|
||||||
import bpy
|
import bpy
|
||||||
from mathutils import Matrix
|
from mathutils import Matrix
|
||||||
|
|
||||||
#---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
# 3x4 P matrix from Blender camera
|
# 3x4 P matrix from Blender camera
|
||||||
#---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
|
|
||||||
# BKE_camera_sensor_size
|
# BKE_camera_sensor_size
|
||||||
def get_sensor_size(sensor_fit, sensor_x, sensor_y):
|
def get_sensor_size(sensor_fit, sensor_x, sensor_y):
|
||||||
if sensor_fit == 'VERTICAL':
|
if sensor_fit == "VERTICAL":
|
||||||
return sensor_y
|
return sensor_y
|
||||||
return sensor_x
|
return sensor_x
|
||||||
|
|
||||||
|
|
||||||
# BKE_camera_sensor_fit
|
# BKE_camera_sensor_fit
|
||||||
def get_sensor_fit(sensor_fit, size_x, size_y):
|
def get_sensor_fit(sensor_fit, size_x, size_y):
|
||||||
if sensor_fit == 'AUTO':
|
if sensor_fit == "AUTO":
|
||||||
if size_x >= size_y:
|
if size_x >= size_y:
|
||||||
return 'HORIZONTAL'
|
return "HORIZONTAL"
|
||||||
else:
|
else:
|
||||||
return 'VERTICAL'
|
return "VERTICAL"
|
||||||
return sensor_fit
|
return sensor_fit
|
||||||
|
|
||||||
|
|
||||||
# Build intrinsic camera parameters from Blender camera data
|
# Build intrinsic camera parameters from Blender camera data
|
||||||
#
|
#
|
||||||
# See notes on this in
|
# See notes on this in
|
||||||
|
@ -27,8 +29,8 @@ def get_sensor_fit(sensor_fit, size_x, size_y):
|
||||||
# as well as
|
# as well as
|
||||||
# https://blender.stackexchange.com/a/120063/3581
|
# https://blender.stackexchange.com/a/120063/3581
|
||||||
def get_calibration_matrix_K_from_blender(camd):
|
def get_calibration_matrix_K_from_blender(camd):
|
||||||
if camd.type != 'PERSP':
|
if camd.type != "PERSP":
|
||||||
raise ValueError('Non-perspective cameras not supported')
|
raise ValueError("Non-perspective cameras not supported")
|
||||||
scene = bpy.context.scene
|
scene = bpy.context.scene
|
||||||
f_in_mm = camd.lens
|
f_in_mm = camd.lens
|
||||||
scale = scene.render.resolution_percentage / 100
|
scale = scene.render.resolution_percentage / 100
|
||||||
|
@ -38,10 +40,10 @@ def get_calibration_matrix_K_from_blender(camd):
|
||||||
sensor_fit = get_sensor_fit(
|
sensor_fit = get_sensor_fit(
|
||||||
camd.sensor_fit,
|
camd.sensor_fit,
|
||||||
scene.render.pixel_aspect_x * resolution_x_in_px,
|
scene.render.pixel_aspect_x * resolution_x_in_px,
|
||||||
scene.render.pixel_aspect_y * resolution_y_in_px
|
scene.render.pixel_aspect_y * resolution_y_in_px,
|
||||||
)
|
)
|
||||||
pixel_aspect_ratio = scene.render.pixel_aspect_y / scene.render.pixel_aspect_x
|
pixel_aspect_ratio = scene.render.pixel_aspect_y / scene.render.pixel_aspect_x
|
||||||
if sensor_fit == 'HORIZONTAL':
|
if sensor_fit == "HORIZONTAL":
|
||||||
view_fac_in_px = resolution_x_in_px
|
view_fac_in_px = resolution_x_in_px
|
||||||
else:
|
else:
|
||||||
view_fac_in_px = pixel_aspect_ratio * resolution_y_in_px
|
view_fac_in_px = pixel_aspect_ratio * resolution_y_in_px
|
||||||
|
@ -52,14 +54,12 @@ def get_calibration_matrix_K_from_blender(camd):
|
||||||
# Parameters of intrinsic calibration matrix K
|
# Parameters of intrinsic calibration matrix K
|
||||||
u_0 = resolution_x_in_px / 2 - camd.shift_x * view_fac_in_px
|
u_0 = resolution_x_in_px / 2 - camd.shift_x * view_fac_in_px
|
||||||
v_0 = resolution_y_in_px / 2 + camd.shift_y * view_fac_in_px / pixel_aspect_ratio
|
v_0 = resolution_y_in_px / 2 + camd.shift_y * view_fac_in_px / pixel_aspect_ratio
|
||||||
skew = 0 # only use rectangular pixels
|
skew = 0 # only use rectangular pixels
|
||||||
|
|
||||||
K = Matrix(
|
K = Matrix(((s_u, skew, u_0), (0, s_v, v_0), (0, 0, 1)))
|
||||||
((s_u, skew, u_0),
|
|
||||||
( 0, s_v, v_0),
|
|
||||||
( 0, 0, 1)))
|
|
||||||
return K
|
return K
|
||||||
|
|
||||||
|
|
||||||
# Returns camera rotation and translation matrices from Blender.
|
# Returns camera rotation and translation matrices from Blender.
|
||||||
#
|
#
|
||||||
# There are 3 coordinate systems involved:
|
# There are 3 coordinate systems involved:
|
||||||
|
@ -76,10 +76,7 @@ def get_calibration_matrix_K_from_blender(camd):
|
||||||
# - right-handed: positive z look-at direction
|
# - right-handed: positive z look-at direction
|
||||||
def get_3x4_RT_matrix_from_blender(cam):
|
def get_3x4_RT_matrix_from_blender(cam):
|
||||||
# bcam stands for blender camera
|
# bcam stands for blender camera
|
||||||
R_bcam2cv = Matrix(
|
R_bcam2cv = Matrix(((1, 0, 0), (0, -1, 0), (0, 0, -1)))
|
||||||
((1, 0, 0),
|
|
||||||
(0, -1, 0),
|
|
||||||
(0, 0, -1)))
|
|
||||||
|
|
||||||
# Transpose since the rotation is object rotation,
|
# Transpose since the rotation is object rotation,
|
||||||
# and we want coordinate rotation
|
# and we want coordinate rotation
|
||||||
|
@ -93,29 +90,29 @@ def get_3x4_RT_matrix_from_blender(cam):
|
||||||
# Convert camera location to translation vector used in coordinate changes
|
# Convert camera location to translation vector used in coordinate changes
|
||||||
# T_world2bcam = -1*R_world2bcam @ cam.location
|
# T_world2bcam = -1*R_world2bcam @ cam.location
|
||||||
# Use location from matrix_world to account for constraints:
|
# Use location from matrix_world to account for constraints:
|
||||||
T_world2bcam = -1*R_world2bcam @ location
|
T_world2bcam = -1 * R_world2bcam @ location
|
||||||
|
|
||||||
# Build the coordinate transform matrix from world to computer vision camera
|
# Build the coordinate transform matrix from world to computer vision camera
|
||||||
R_world2cv = R_bcam2cv@R_world2bcam
|
R_world2cv = R_bcam2cv @ R_world2bcam
|
||||||
T_world2cv = R_bcam2cv@T_world2bcam
|
T_world2cv = R_bcam2cv @ T_world2bcam
|
||||||
|
|
||||||
# put into 3x4 matrix
|
# put into 3x4 matrix
|
||||||
RT = Matrix((
|
RT = Matrix(
|
||||||
R_world2cv[0][:] + (T_world2cv[0],),
|
(R_world2cv[0][:] + (T_world2cv[0],), R_world2cv[1][:] + (T_world2cv[1],), R_world2cv[2][:] + (T_world2cv[2],))
|
||||||
R_world2cv[1][:] + (T_world2cv[1],),
|
)
|
||||||
R_world2cv[2][:] + (T_world2cv[2],)
|
|
||||||
))
|
|
||||||
return RT
|
return RT
|
||||||
|
|
||||||
|
|
||||||
def get_3x4_P_matrix_from_blender(cam):
|
def get_3x4_P_matrix_from_blender(cam):
|
||||||
K = get_calibration_matrix_K_from_blender(cam.data)
|
K = get_calibration_matrix_K_from_blender(cam.data)
|
||||||
RT = get_3x4_RT_matrix_from_blender(cam)
|
RT = get_3x4_RT_matrix_from_blender(cam)
|
||||||
return K@RT, K, RT
|
return K @ RT, K, RT
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# Insert your camera name here
|
# Insert your camera name here
|
||||||
cam = bpy.data.objects['Camera']
|
cam = bpy.data.objects["Camera"]
|
||||||
P, K, RT = get_3x4_P_matrix_from_blender(cam)
|
P, K, RT = get_3x4_P_matrix_from_blender(cam)
|
||||||
print("K")
|
print("K")
|
||||||
print(K)
|
print(K)
|
||||||
|
@ -132,5 +129,5 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
# Bonus code: save the 3x4 P matrix into a plain text file
|
# Bonus code: save the 3x4 P matrix into a plain text file
|
||||||
# Don't forget to import numpy for this
|
# Don't forget to import numpy for this
|
||||||
#nP = numpy.matrix(P)
|
# nP = numpy.matrix(P)
|
||||||
#numpy.savetxt("/tmp/P3x4.txt", nP) # to select precision, use e.g. fmt='%.2f'
|
# numpy.savetxt("/tmp/P3x4.txt", nP) # to select precision, use e.g. fmt='%.2f'
|
||||||
|
|
|
@ -54,14 +54,16 @@ for i, (phi, theta) in enumerate(poses):
|
||||||
|
|
||||||
# save camera matrices
|
# save camera matrices
|
||||||
with open(EXPORT_PATH / "cameras" / f"{i:04d}.pickle", "wb") as f:
|
with open(EXPORT_PATH / "cameras" / f"{i:04d}.pickle", "wb") as f:
|
||||||
pickle.dump({
|
pickle.dump(
|
||||||
"P": np.array(P),
|
{
|
||||||
"K": np.array(K),
|
"P": np.array(P),
|
||||||
"RT": np.array(RT),
|
"K": np.array(K),
|
||||||
}, f)
|
"RT": np.array(RT),
|
||||||
|
},
|
||||||
|
f,
|
||||||
|
)
|
||||||
print(f"Saved camera matrices: {i:04d}.pickle")
|
print(f"Saved camera matrices: {i:04d}.pickle")
|
||||||
|
|
||||||
# render the frame
|
# render the frame
|
||||||
bpy.context.scene.frame_current = i
|
bpy.context.scene.frame_current = i
|
||||||
bpy.ops.render.render(write_still=False)
|
bpy.ops.render.render(write_still=False)
|
||||||
|
|
||||||
|
|
|
@ -25,21 +25,33 @@ def update_border(voxel_values, idx=None):
|
||||||
z_p1 = voxel_values[:, :, :-1]
|
z_p1 = voxel_values[:, :, :-1]
|
||||||
z_p1 = np.concatenate((np.zeros((z_p1.shape[0], z_p1.shape[1], 1)), z_p1), axis=2)
|
z_p1 = np.concatenate((np.zeros((z_p1.shape[0], z_p1.shape[1], 1)), z_p1), axis=2)
|
||||||
|
|
||||||
return np.logical_or.reduce((voxel_values != x_m1, voxel_values != x_p1,
|
return np.logical_or.reduce(
|
||||||
voxel_values != y_m1, voxel_values != y_p1,
|
(
|
||||||
voxel_values != z_m1, voxel_values != z_p1))
|
voxel_values != x_m1,
|
||||||
|
voxel_values != x_p1,
|
||||||
|
voxel_values != y_m1,
|
||||||
|
voxel_values != y_p1,
|
||||||
|
voxel_values != z_m1,
|
||||||
|
voxel_values != z_p1,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
# TODO: update only concidered voxels (idx)
|
# TODO: update only concidered voxels (idx)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
voxel_values = np.array([[[np.sqrt(x**2 + y**2 + z**2) < 20 for z in np.arange(-10, 10, 1.0)] for y in np.arange(-10, 10, 1.0)] for x in np.arange(-10, 10, 1.0)])
|
voxel_values = np.array(
|
||||||
|
[
|
||||||
|
[[np.sqrt(x**2 + y**2 + z**2) < 20 for z in np.arange(-10, 10, 1.0)] for y in np.arange(-10, 10, 1.0)]
|
||||||
|
for x in np.arange(-10, 10, 1.0)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
border = update_border(voxel_values)
|
border = update_border(voxel_values)
|
||||||
|
|
||||||
# Plot voxel grid that are the border
|
# Plot voxel grid that are the border
|
||||||
fig = plt.figure()
|
fig = plt.figure()
|
||||||
ax = fig.add_subplot(111, projection='3d')
|
ax = fig.add_subplot(111, projection="3d")
|
||||||
ax.scatter(np.where(voxel_values)[0], np.where(voxel_values)[1], np.where(voxel_values)[2], c='r', marker='o')
|
ax.scatter(np.where(voxel_values)[0], np.where(voxel_values)[1], np.where(voxel_values)[2], c="r", marker="o")
|
||||||
ax.scatter(np.where(border)[0], np.where(border)[1], np.where(border)[2], c='b', marker='o', s=1)
|
ax.scatter(np.where(border)[0], np.where(border)[1], np.where(border)[2], c="b", marker="o", s=1)
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
42
src/fvi.py
42
src/fvi.py
|
@ -92,7 +92,7 @@ def fast_voxel_intersect(start_, end_, origin_, step_, shape_) -> tuple[list, li
|
||||||
return intersections, voxels, voxels_idx
|
return intersections, voxels, voxels_idx
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
def update_figure():
|
def update_figure():
|
||||||
|
@ -102,18 +102,30 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# Plot hitted voxels
|
# Plot hitted voxels
|
||||||
for voxel in voxels:
|
for voxel in voxels:
|
||||||
plt.fill([voxel[0], voxel[0] + step[0], voxel[0] + step[0], voxel[0]],
|
plt.fill(
|
||||||
[voxel[1], voxel[1], voxel[1] + step[1], voxel[1] + step[1]],
|
[voxel[0], voxel[0] + step[0], voxel[0] + step[0], voxel[0]],
|
||||||
color='#e25', alpha=0.5)
|
[voxel[1], voxel[1], voxel[1] + step[1], voxel[1] + step[1]],
|
||||||
|
color="#e25",
|
||||||
|
alpha=0.5,
|
||||||
|
)
|
||||||
|
|
||||||
for voxel_id in voxels_idx:
|
for voxel_id in voxels_idx:
|
||||||
plt.fill([
|
plt.fill(
|
||||||
origin[0] + voxel_id[0] * step[0], origin[0] + (voxel_id[0] + 1) * step[0],
|
[
|
||||||
origin[0] + (voxel_id[0] + 1) * step[0], origin[0] + voxel_id[0] * step[0]
|
origin[0] + voxel_id[0] * step[0],
|
||||||
], [
|
origin[0] + (voxel_id[0] + 1) * step[0],
|
||||||
origin[1] + voxel_id[1] * step[1], origin[1] + voxel_id[1] * step[1],
|
origin[0] + (voxel_id[0] + 1) * step[0],
|
||||||
origin[1] + (voxel_id[1] + 1) * step[1], origin[1] + (voxel_id[1] + 1) * step[1]
|
origin[0] + voxel_id[0] * step[0],
|
||||||
], color='#2e3', alpha=0.5)
|
],
|
||||||
|
[
|
||||||
|
origin[1] + voxel_id[1] * step[1],
|
||||||
|
origin[1] + voxel_id[1] * step[1],
|
||||||
|
origin[1] + (voxel_id[1] + 1) * step[1],
|
||||||
|
origin[1] + (voxel_id[1] + 1) * step[1],
|
||||||
|
],
|
||||||
|
color="#2e3",
|
||||||
|
alpha=0.5,
|
||||||
|
)
|
||||||
|
|
||||||
# Plot line segment
|
# Plot line segment
|
||||||
plt.plot([start[0], end[0]], [start[1], end[1]], 'k-')
|
plt.plot([start[0], end[0]], [start[1], end[1]], 'k-')
|
||||||
|
@ -127,7 +139,7 @@ if __name__ == '__main__':
|
||||||
plt.plot(end[0], end[1], 'ro')
|
plt.plot(end[0], end[1], 'ro')
|
||||||
|
|
||||||
# Plot voxel grid
|
# Plot voxel grid
|
||||||
plt.axis('equal')
|
plt.axis("equal")
|
||||||
plt.xlim((-10, 10))
|
plt.xlim((-10, 10))
|
||||||
plt.ylim((-10, 10))
|
plt.ylim((-10, 10))
|
||||||
plt.xticks(origin[0] + step[0] * np.arange(shape[0] + 1))
|
plt.xticks(origin[0] + step[0] * np.arange(shape[0] + 1))
|
||||||
|
@ -137,7 +149,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
def onkey(event):
|
def onkey(event):
|
||||||
global start, end
|
global start, end
|
||||||
if event.key == ' ':
|
if event.key == " ":
|
||||||
start = np.random.rand(2) * 20 - 10
|
start = np.random.rand(2) * 20 - 10
|
||||||
end = np.random.rand(2) * 20 - 10
|
end = np.random.rand(2) * 20 - 10
|
||||||
update_figure()
|
update_figure()
|
||||||
|
@ -155,6 +167,6 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# Plot
|
# Plot
|
||||||
fig = plt.figure()
|
fig = plt.figure()
|
||||||
fig.canvas.mpl_connect('key_press_event', onkey)
|
fig.canvas.mpl_connect("key_press_event", onkey)
|
||||||
update_figure()
|
update_figure()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
|
@ -1,23 +1,18 @@
|
||||||
import numpy as np
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
def check_line_voxel(
|
|
||||||
px, py, pz,
|
def check_line_voxel(px, py, pz, dx, dy, dz, vx, vy, vz, c):
|
||||||
dx, dy, dz,
|
|
||||||
vx, vy, vz,
|
|
||||||
c
|
|
||||||
):
|
|
||||||
"""Check if a line intersects a voxel.
|
"""Check if a line intersects a voxel.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
- px, py, pz: voxel coner coordinates
|
- px, py, pz: voxel coner coordinates
|
||||||
- dx, dy, dz: line origin coordinates
|
- dx, dy, dz: line origin coordinates
|
||||||
- vx, vy, vz: line direction coordinates
|
- vx, vy, vz: line direction coordinates
|
||||||
- c: voxel size
|
- c: voxel size
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Compute the intersection bounds
|
# Compute the intersection bounds
|
||||||
kx1 = (px - dx) / vx
|
kx1 = (px - dx) / vx
|
||||||
ky1 = (py - dy) / vy
|
ky1 = (py - dy) / vy
|
||||||
|
@ -27,54 +22,27 @@ def check_line_voxel(
|
||||||
kz2 = (pz - dz + c) / vz
|
kz2 = (pz - dz + c) / vz
|
||||||
|
|
||||||
# Order the bounds
|
# Order the bounds
|
||||||
kxmin = np.min(np.concatenate([
|
kxmin = np.min(np.concatenate([kx1[:, np.newaxis], kx2[:, np.newaxis]], axis=1), axis=1)
|
||||||
kx1[:, np.newaxis],
|
kymin = np.min(np.concatenate([ky1[:, np.newaxis], ky2[:, np.newaxis]], axis=1), axis=1)
|
||||||
kx2[:, np.newaxis]
|
kzmin = np.min(np.concatenate([kz1[:, np.newaxis], kz2[:, np.newaxis]], axis=1), axis=1)
|
||||||
], axis=1), axis=1)
|
kxmax = np.max(np.concatenate([kx1[:, np.newaxis], kx2[:, np.newaxis]], axis=1), axis=1)
|
||||||
kymin = np.min(np.concatenate([
|
kymax = np.max(np.concatenate([ky1[:, np.newaxis], ky2[:, np.newaxis]], axis=1), axis=1)
|
||||||
ky1[:, np.newaxis],
|
kzmax = np.max(np.concatenate([kz1[:, np.newaxis], kz2[:, np.newaxis]], axis=1), axis=1)
|
||||||
ky2[:, np.newaxis]
|
|
||||||
], axis=1), axis=1)
|
|
||||||
kzmin = np.min(np.concatenate([
|
|
||||||
kz1[:, np.newaxis],
|
|
||||||
kz2[:, np.newaxis]
|
|
||||||
], axis=1), axis=1)
|
|
||||||
kxmax = np.max(np.concatenate([
|
|
||||||
kx1[:, np.newaxis],
|
|
||||||
kx2[:, np.newaxis]
|
|
||||||
], axis=1), axis=1)
|
|
||||||
kymax = np.max(np.concatenate([
|
|
||||||
ky1[:, np.newaxis],
|
|
||||||
ky2[:, np.newaxis]
|
|
||||||
], axis=1), axis=1)
|
|
||||||
kzmax = np.max(np.concatenate([
|
|
||||||
kz1[:, np.newaxis],
|
|
||||||
kz2[:, np.newaxis]
|
|
||||||
], axis=1), axis=1)
|
|
||||||
|
|
||||||
# Check if the bounds overlap
|
# Check if the bounds overlap
|
||||||
kmax = np.min(np.concatenate([
|
kmax = np.min(np.concatenate([kxmax[:, np.newaxis], kymax[:, np.newaxis], kzmax[:, np.newaxis]], axis=1), axis=1)
|
||||||
kxmax[:, np.newaxis],
|
kmin = np.max(np.concatenate([kxmin[:, np.newaxis], kymin[:, np.newaxis], kzmin[:, np.newaxis]], axis=1), axis=1)
|
||||||
kymax[:, np.newaxis],
|
|
||||||
kzmax[:, np.newaxis]
|
|
||||||
], axis=1), axis=1)
|
|
||||||
kmin = np.max(np.concatenate([
|
|
||||||
kxmin[:, np.newaxis],
|
|
||||||
kymin[:, np.newaxis],
|
|
||||||
kzmin[:, np.newaxis]
|
|
||||||
], axis=1), axis=1)
|
|
||||||
return kmin <= kmax
|
return kmin <= kmax
|
||||||
|
|
||||||
|
|
||||||
c = 1.0
|
c = 1.0
|
||||||
points = np.array([[x, y, z] for x, y, z in product(
|
points = np.array(
|
||||||
np.arange(-5.0, 4.0, c),
|
[[x, y, z] for x, y, z in product(np.arange(-5.0, 4.0, c), np.arange(-5.0, 4.0, c), np.arange(-5.0, 4.0, c))]
|
||||||
np.arange(-5.0, 4.0, c),
|
)
|
||||||
np.arange(-5.0, 4.0, c))
|
|
||||||
])
|
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
fig = plt.figure()
|
fig = plt.figure()
|
||||||
ax = plt.axes(projection='3d')
|
ax = plt.axes(projection="3d")
|
||||||
|
|
||||||
d = np.random.rand(3) * 1 - 0.5
|
d = np.random.rand(3) * 1 - 0.5
|
||||||
v = np.random.rand(3) * 1 - 0.5
|
v = np.random.rand(3) * 1 - 0.5
|
||||||
|
@ -90,20 +58,20 @@ while True:
|
||||||
if not bool_vect[i]:
|
if not bool_vect[i]:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
ax.plot([px, px+c], [py, py], [pz, pz], 'b')
|
ax.plot([px, px + c], [py, py], [pz, pz], "b")
|
||||||
ax.plot([px, px+c], [py, py], [pz+c, pz+c], 'b')
|
ax.plot([px, px + c], [py, py], [pz + c, pz + c], "b")
|
||||||
ax.plot([px, px+c], [py+c, py+c], [pz, pz], 'b')
|
ax.plot([px, px + c], [py + c, py + c], [pz, pz], "b")
|
||||||
ax.plot([px, px+c], [py+c, py+c], [pz+c, pz+c], 'b')
|
ax.plot([px, px + c], [py + c, py + c], [pz + c, pz + c], "b")
|
||||||
ax.plot([px, px], [py, py+c], [pz, pz], 'b')
|
ax.plot([px, px], [py, py + c], [pz, pz], "b")
|
||||||
ax.plot([px, px], [py, py+c], [pz+c, pz+c], 'b')
|
ax.plot([px, px], [py, py + c], [pz + c, pz + c], "b")
|
||||||
ax.plot([px+c, px+c], [py, py+c], [pz, pz], 'b')
|
ax.plot([px + c, px + c], [py, py + c], [pz, pz], "b")
|
||||||
ax.plot([px+c, px+c], [py, py+c], [pz+c, pz+c], 'b')
|
ax.plot([px + c, px + c], [py, py + c], [pz + c, pz + c], "b")
|
||||||
ax.plot([px, px], [py, py], [pz, pz+c], 'b')
|
ax.plot([px, px], [py, py], [pz, pz + c], "b")
|
||||||
ax.plot([px, px], [py+c, py+c], [pz, pz+c], 'b')
|
ax.plot([px, px], [py + c, py + c], [pz, pz + c], "b")
|
||||||
ax.plot([px+c, px+c], [py, py], [pz, pz+c], 'b')
|
ax.plot([px + c, px + c], [py, py], [pz, pz + c], "b")
|
||||||
ax.plot([px+c, px+c], [py+c, py+c], [pz, pz+c], 'b')
|
ax.plot([px + c, px + c], [py + c, py + c], [pz, pz + c], "b")
|
||||||
|
|
||||||
# plot line
|
# plot line
|
||||||
ax.plot([dx, dx+vx], [dy, dy+vy], [dz, dz+vz], 'g')
|
ax.plot([dx, dx + vx], [dy, dy + vy], [dz, dz + vz], "g")
|
||||||
|
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
66
src/main.py
66
src/main.py
|
@ -1,9 +1,10 @@
|
||||||
import cv2
|
|
||||||
import numpy as np
|
|
||||||
from itertools import product
|
|
||||||
import pickle
|
import pickle
|
||||||
|
from itertools import product
|
||||||
|
|
||||||
|
import cv2
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import mcubes
|
import mcubes
|
||||||
|
import numpy as np
|
||||||
from rich.progress import track
|
from rich.progress import track
|
||||||
|
|
||||||
from borders import update_border
|
from borders import update_border
|
||||||
|
@ -16,10 +17,16 @@ Z_MIN, Z_MAX = -0.05, 0.05
|
||||||
|
|
||||||
nb_frame = 24
|
nb_frame = 24
|
||||||
|
|
||||||
points = np.array([[x, y, z, 1.0] for x, y, z in product(
|
points = np.array(
|
||||||
np.arange(X_MIN, X_MAX, VOXEL_SIZE),
|
[
|
||||||
np.arange(Y_MIN, Y_MAX, VOXEL_SIZE),
|
[x, y, z, 1.0]
|
||||||
np.arange(Z_MIN, Z_MAX, VOXEL_SIZE))])
|
for x, y, z in product(
|
||||||
|
np.arange(X_MIN, X_MAX, VOXEL_SIZE),
|
||||||
|
np.arange(Y_MIN, Y_MAX, VOXEL_SIZE),
|
||||||
|
np.arange(Z_MIN, Z_MAX, VOXEL_SIZE),
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
mask = 255
|
mask = 255
|
||||||
|
|
||||||
|
@ -28,27 +35,34 @@ proj_mats = []
|
||||||
frames = []
|
frames = []
|
||||||
|
|
||||||
for k in range(nb_frame):
|
for k in range(nb_frame):
|
||||||
frame = cv2.imread(f'data/torus/masks/Image{k:04}.png', cv2.IMREAD_GRAYSCALE)
|
frame = cv2.imread(f"data/torus/masks/Image{k:04}.png", cv2.IMREAD_GRAYSCALE)
|
||||||
frames.append(cv2.imread(f'data/torus/images/Image{k:04}.png', cv2.IMREAD_GRAYSCALE))
|
frames.append(cv2.imread(f"data/torus/images/Image{k:04}.png", cv2.IMREAD_GRAYSCALE))
|
||||||
|
|
||||||
with open(f"data/torus/cameras/{k:04d}.pickle", 'rb') as file:
|
with open(f"data/torus/cameras/{k:04d}.pickle", "rb") as file:
|
||||||
matrices = pickle.load(file)
|
matrices = pickle.load(file)
|
||||||
proj_mat = matrices["P"]
|
proj_mat = matrices["P"]
|
||||||
proj_mats.append(proj_mat)
|
proj_mats.append(proj_mat)
|
||||||
position = -np.linalg.inv(matrices["RT"][:3,:3]) @ matrices["RT"][:3,3]
|
position = -np.linalg.inv(matrices["RT"][:3,:3]) @ matrices["RT"][:3,3]
|
||||||
positions.append(position)
|
positions.append(position)
|
||||||
|
|
||||||
cam_points = proj_mat @ points.T
|
cam_points = proj_mat @ points.T
|
||||||
cam_points /= cam_points[2,:]
|
cam_points /= cam_points[2, :]
|
||||||
cam_points = np.round(cam_points).astype(np.int32)
|
cam_points = np.round(cam_points).astype(np.int32)
|
||||||
|
|
||||||
visible = np.logical_and.reduce((0 <= cam_points[0,:], cam_points[0,:] < frame.shape[1], 0 <= cam_points[1,:], cam_points[1,:] < frame.shape[0]))
|
visible = np.logical_and.reduce(
|
||||||
cam_points = cam_points[:,visible]
|
(
|
||||||
points = points[visible,:]
|
0 <= cam_points[0, :],
|
||||||
|
cam_points[0, :] < frame.shape[1],
|
||||||
|
0 <= cam_points[1, :],
|
||||||
|
cam_points[1, :] < frame.shape[0],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
cam_points = cam_points[:, visible]
|
||||||
|
points = points[visible, :]
|
||||||
|
|
||||||
solid = frame[cam_points[1,:],cam_points[0,:]] == mask
|
solid = frame[cam_points[1, :], cam_points[0, :]] == mask
|
||||||
cam_points = cam_points[:,solid]
|
cam_points = cam_points[:, solid]
|
||||||
points = points[solid,:]
|
points = points[solid, :]
|
||||||
|
|
||||||
# for cam_point in cam_points.T:
|
# for cam_point in cam_points.T:
|
||||||
# cv2.circle(frame, (cam_point[0], cam_point[1]), 2, (255*is_in[k], 0, 255*(not is_in[k])))
|
# cv2.circle(frame, (cam_point[0], cam_point[1]), 2, (255*is_in[k], 0, 255*(not is_in[k])))
|
||||||
|
@ -73,7 +87,7 @@ for k in range(nb_frame):
|
||||||
|
|
||||||
voxel = np.zeros((int((X_MAX-X_MIN)/VOXEL_SIZE), int((Y_MAX-Y_MIN)/VOXEL_SIZE), int((Z_MAX-Z_MIN)/VOXEL_SIZE)))
|
voxel = np.zeros((int((X_MAX-X_MIN)/VOXEL_SIZE), int((Y_MAX-Y_MIN)/VOXEL_SIZE), int((Z_MAX-Z_MIN)/VOXEL_SIZE)))
|
||||||
idx = np.floor_divide(points[:, :3] - np.array([X_MIN, Y_MIN, Z_MIN]), VOXEL_SIZE).astype(int)
|
idx = np.floor_divide(points[:, :3] - np.array([X_MIN, Y_MIN, Z_MIN]), VOXEL_SIZE).astype(int)
|
||||||
voxel[idx[:,0], idx[:,1], idx[:,2]] = 1
|
voxel[idx[:, 0], idx[:, 1], idx[:, 2]] = 1
|
||||||
|
|
||||||
border = update_border(voxel)
|
border = update_border(voxel)
|
||||||
|
|
||||||
|
@ -86,18 +100,19 @@ border = update_border(voxel)
|
||||||
|
|
||||||
origin = np.array([X_MIN, Y_MIN, Z_MIN])
|
origin = np.array([X_MIN, Y_MIN, Z_MIN])
|
||||||
step = np.array([VOXEL_SIZE, VOXEL_SIZE, VOXEL_SIZE])
|
step = np.array([VOXEL_SIZE, VOXEL_SIZE, VOXEL_SIZE])
|
||||||
shape = np.array([int((X_MAX-X_MIN)/VOXEL_SIZE), int((Y_MAX-Y_MIN)/VOXEL_SIZE), int((Z_MAX-Z_MIN)/VOXEL_SIZE)])
|
shape = np.array(
|
||||||
|
[int((X_MAX - X_MIN) / VOXEL_SIZE), int((Y_MAX - Y_MIN) / VOXEL_SIZE), int((Z_MAX - Z_MIN) / VOXEL_SIZE)]
|
||||||
|
)
|
||||||
|
|
||||||
for idx in track(np.argwhere(border)):
|
for idx in track(np.argwhere(border)):
|
||||||
# coordonnées du centre du voxel
|
# coordonnées du centre du voxel
|
||||||
start = np.array([
|
start = np.array(
|
||||||
X_MIN + (idx[0] + 0.5) * VOXEL_SIZE,
|
[X_MIN + (idx[0] + 0.5) * VOXEL_SIZE, Y_MIN + (idx[1] + 0.5) * VOXEL_SIZE, Z_MIN + (idx[2] + 0.5) * VOXEL_SIZE]
|
||||||
Y_MIN + (idx[1] + 0.5) * VOXEL_SIZE,
|
)
|
||||||
Z_MIN + (idx[2] + 0.5) * VOXEL_SIZE])
|
|
||||||
|
|
||||||
# array qui contiendra les nuances de gris des frames qui voient le voxel
|
# array qui contiendra les nuances de gris des frames qui voient le voxel
|
||||||
values = []
|
values = []
|
||||||
|
|
||||||
# pour chaque camera (frame)
|
# pour chaque camera (frame)
|
||||||
for i in range(nb_frame):
|
for i in range(nb_frame):
|
||||||
|
|
||||||
|
@ -129,6 +144,5 @@ for idx in track(np.argwhere(border)):
|
||||||
voxel[idx[0], idx[1], idx[2]] = 0
|
voxel[idx[0], idx[1], idx[2]] = 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
vertices, triangles = mcubes.marching_cubes(voxel, 0)
|
vertices, triangles = mcubes.marching_cubes(voxel, 0)
|
||||||
mcubes.export_obj(vertices, triangles, "result.obj")
|
mcubes.export_obj(vertices, triangles, "result.obj")
|
||||||
|
|
|
@ -12,25 +12,27 @@ def matrices_reader(path: str) -> list[np.ndarray]:
|
||||||
list[np.ndarray]: list of projection matrix
|
list[np.ndarray]: list of projection matrix
|
||||||
"""
|
"""
|
||||||
|
|
||||||
with open(path, 'r') as f:
|
with open(path, "r") as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
|
|
||||||
k = 0
|
k = 0
|
||||||
world_matrices = []
|
world_matrices = []
|
||||||
while k+3 < len(lines):
|
while k + 3 < len(lines):
|
||||||
# Match matrices one by one
|
# Match matrices one by one
|
||||||
mat_str = ""
|
mat_str = ""
|
||||||
for line in lines[k:k+4]:
|
for line in lines[k : k + 4]:
|
||||||
mat_str += line
|
mat_str += line
|
||||||
float_reg = r"(-|\d|\.|e)+"
|
float_reg = r"(-|\d|\.|e)+"
|
||||||
res = re.search(
|
res = re.search(
|
||||||
f"Matrix\(\(\(({float_reg}), ({float_reg}), ({float_reg}), ({float_reg})\),\n +\(({float_reg}), ({float_reg}), ({float_reg}), ({float_reg})\),\n\ +\(({float_reg}), ({float_reg}), ({float_reg}), ({float_reg})\)\)\)", mat_str)
|
f"Matrix\(\(\(({float_reg}), ({float_reg}), ({float_reg}), ({float_reg})\),\n +\(({float_reg}), ({float_reg}), ({float_reg}), ({float_reg})\),\n\ +\(({float_reg}), ({float_reg}), ({float_reg}), ({float_reg})\)\)\)",
|
||||||
|
mat_str,
|
||||||
|
)
|
||||||
|
|
||||||
# Convert string to np.ndarray
|
# Convert string to np.ndarray
|
||||||
values = [float(res.group(i)) for i in range(1,len(res.groups()) + 1, 2)]
|
values = [float(res.group(i)) for i in range(1, len(res.groups()) + 1, 2)]
|
||||||
world_mat = np.array([[values[4*i + j] for j in range(4)] for i in range(3)])
|
world_mat = np.array([[values[4 * i + j] for j in range(4)] for i in range(3)])
|
||||||
world_matrices.append(world_mat)
|
world_matrices.append(world_mat)
|
||||||
|
|
||||||
k += 4
|
k += 4
|
||||||
|
|
||||||
return world_matrices[1:]
|
return world_matrices[1:]
|
||||||
|
|
|
@ -4,8 +4,7 @@ nb_frame = 24
|
||||||
|
|
||||||
for k in range(nb_frame):
|
for k in range(nb_frame):
|
||||||
|
|
||||||
with open(f"/tmp/cameras/{k:04d}.pickle", 'rb') as file:
|
with open(f"/tmp/cameras/{k:04d}.pickle", "rb") as file:
|
||||||
proj_mat = pickle.load(file)["P"]
|
proj_mat = pickle.load(file)["P"]
|
||||||
|
|
||||||
print(k, proj_mat)
|
print(k, proj_mat)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue