stitching 图像拼接实践
代码: https://github.com/OpenStitching/stitching/tree/main
1. 安装 docker
https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
选择 Install using the apt repository
2. 拉取镜像和下载图像
docker pull openstitching/stitch
git clone https://github.com/OpenStitching/stitching_tutorial.git
3. 查看帮助
sudo docker container run --rm -v /home/h/projects/stitching_tutorial:/data openstitching/stitch:latest
4. 拼接图像
sudo docker container run --rm -v /home/h/projects/stitching_tutorial/imgs:/data openstitching/stitch:latest we*.jpg
结果: 
sudo docker container run --rm -v /home/h/projects/stitching_tutorial:/data openstitching/stitch:latest panorama_example_2017/PB*.JPG
4. 1 失败了,默认设置无法拼接所有图像。

4. 2 解决:
- 降低置信度
- 使用 brisk 特征,而不是 sift
参考:
- https://github.com/OpenStitching/stitching/issues/30
- https://github.com/OpenStitching/stitching/issues/30#issuecomment-1285921850
8 张图像完整拼接:
sudo docker container run --rm -v /home/h/projects/stitching_tutorial:/data openstitching/stitch:latest panorama_example_2017/PB*.JPG --detector brisk --confidence_threshold 0.2 --matches_graph_dot_file matches.txt


sudo docker container run --rm -v /home/h/projects/stitching_tutorial:/data openstitching/stitch:latest panorama_example_2017/PB*.JPG --detector brisk --confidence_threshold 0.5 --matches_graph_dot_file matches.txt
查看拼接的置信度:
matches.txt:
graph matches_graph{
"PB240130.JPG" -- "PB240131.JPG"[label="Nm=9, Ni=9, C=0.841121"];
"PB240131.JPG" -- "PB240132.JPG"[label="Nm=19, Ni=18, C=1.31387"];
"PB240132.JPG" -- "PB240133.JPG"[label="Nm=16, Ni=15, C=1.17188"];
"PB240133.JPG" -- "PB240134.JPG"[label="Nm=28, Ni=28, C=1.70732"];
"PB240134.JPG" -- "PB240135.JPG"[label="Nm=34, Ni=30, C=1.64835"];
"PB240135.JPG" -- "PB240136.JPG"[label="Nm=51, Ni=47, C=2.01717"];
"PB240136.JPG" -- "PB240137.JPG"[label="Nm=62, Ni=53, C=1.99248"];
}
所以最小置信度的是 0.84,brisk 效果更好,sift 和 默认的 orb 都无法完成拼接。
使用 GPU: 好像没有加速
参考:https://github.com/OpenStitching/stitching/issues/62#issuecomment-1509095936
sudo docker container run --rm -v /home/h/projects/stitching_tutorial:/data openstitching/stitch:latest panorama_example_2017/PB*.JPG --detector brisk --confidence_threshold 0.5 --matches_graph_dot_file matches.txt --try_use_gpu
5. Dockerfile 文件解读和 从 Dockerfile 构建镜像,而不是拉取现有的
# 这一行指定了基础镜像,这里使用的是Python 3.11的官方镜像。
FROM python:3.11
# 在镜像内部创建了一个名为 stitching 的目录。
# 在 Dockerfile 文件中,RUN 是一个指令,用于在 Docker 镜像构建过程中执行命令。
RUN mkdir /stitching
# 将当前目录下的所有文件(也就是)复制到镜像内部的 `/stitching` 目录中。
COPY . /stitching
# build and install stitching package
# 将工作目录切换到/stitching,即之后的命令将在此目录下执行。
WORKDIR /stitching
# 安装 Python 包管理工具中的 build 包,build 包 通常用于通常用于构建和打包 Python 项目。
RUN pip install build
# we use opencv headless within docker, otherwise we get errors
# 使用 sed 工具编辑 setup.cfg 文件,将其中的 opencv-python 替换为 opencv-python-headless。这可能是因为在 Docker 容器中需要使用 OpenCV 的无界面版本,以避免图形相关的错误。
RUN sed -i 's/opencv-python/opencv-python-headless/g' setup.cfg
# 运行 Python 的 build 模块来构建 stitching 包。
RUN python -m build
# 使用pip安装了./dist目录下的stitching-*.whl包。这是之前使用 python -m build 命令构建得到的。
RUN pip install ./dist/stitching-*.whl
# compile largestinteriorrectangle (JIT)
# 运行Python代码以导入largestinteriorrectangle模块,这可能是为了在 Docker 构建过程中预先编译 JIT(Just-In-Time)代码,以提高运行时性能。
RUN python -c "import largestinteriorrectangle"
# provide the entrypoint, users need to mount a volume to /data
# 将工作目录更改为 /data,这意味着在容器中执行的任何后续命令都将在 /data 目录下执行。
WORKDIR /data
# 设置容器的入口点为stitch命令,这意味着当容器启动时将运行stitch命令。ENTRYPOINT与CMD结合使用时,CMD提供的任何参数都会传递给ENTRYPOINT指定的命令。
ENTRYPOINT ["stitch"]
# 设置默认的命令参数为-h,这意味着当容器启动时如果没有提供其他参数,将打印出stitch命令的帮助信息。
CMD ["-h"]
# 综上所述,这个 Dockerfile 的主要目的是创建一个包含 stitching 包和相关依赖项的 Python 3.11 环境的 Docker 镜像,并将容器的默认执行命令设置为 stitch,以便用户可以轻松地使用该包。
问题1:COPY . /stitching: 将当前目录下的所有文件复制到镜像内部的/stitching目录中。
这是什么意思?是 copy 的哪里的目录
这里的意思是将当前构建上下文中的所有文件复制到Docker镜像内部的/stitching目录中。构建上下文是指执行docker build命令时指定的路径。通常,你会在包含Dockerfile的目录中执行docker build命令。因此,.代表了当前执行docker build命令的目录,即包含Dockerfile的目录,也就是把 。
这里就是 stitching 代码仓库下的 Dockerfile的目录,也就是把 stitching 所有代码 copy 过去了。
问题2:RUN pip install build: 使用pip安装了一个名为build的Python包。 这个包有什么用呢?
build 模块是 Python 3.10 版本引入的标准库,用于构建和分发 Python 包。
build 是一个 Python 包,用于构建 Python 项目。它提供了一种标准的方式来定义和运行项目的构建过程,可以用于构建 wheel 包(一种 Python 打包格式),以及其他一些项目构建任务。
一些主要的功能包括:
1. 构建 wheel 包: build 可以根据项目的元数据(如 setup.py)以及其他配置信息,自动生成 wheel 包。
2. 支持 PEP 517/518: build 遵循 PEP 517 和 PEP 518 规范,这些规范定义了 Python 包的构建和分发过程。
3. 可插拔的后端: build 允许开发人员使用不同的后端来执行构建任务,如 setuptools、flit、poetry 等。
4. 简化配置: build 试图通过默认设置和自动检测来减少配置需求,使项目的构建过程更加简单。
总的来说,build 旨在提供一种简便而灵活的方法来构建 Python 项目,使开发者能够更轻松地管理和分发他们的代码。
问题3:sed命令 是怎么用的?
sed命令(Stream Editor)是一个流编辑器,用于对文本进行转换和处理。它通常用于从输入流中读取文本,对其进行某种转换,然后将结果发送到输出流。
sed 命令的基本语法如下:
sed OPTIONS 'COMMAND' INPUT_FILE
其中:
- OPTIONS 是一些选项,例如 -i 用于直接在文件中编辑而不是打印到标准输出。
- 'COMMAND' 是 sed 所执行的命令,通常是一个替换或转换操作。
- INPUT_FILE 是要处理的输入文件。
在提到的 Dockerfile 中,使用了 sed 命令来编辑 setup.cfg 文件。具体来说,这是使用了 -i 选项,表示直接在文件中进行编辑,而 's/opencv-python/opencv-python-headless/g' 是一个替换命令,其中 s 表示替换操作,/opencv-python/ 是要被替换的内容,/opencv-python-headless/ 是替换后的内容,g 表示全局匹配,即替换所有匹配的内容而不只是第一个。
因此,这个 sed 命令的作用是将 setup.cfg 文件中所有出现的 opencv-python 替换为 opencv-python-headless。
问题4: python -m build 命令 是做什么?
python 是 Python 解释器的可执行文件。-m 是 Python 的一个命令行选项,用于执行指定的模块。build 是一个 Python 模块,在这种情况下,它通常用于构建 Python 项目或打包 Python 代码。通过这个命令,Docker 会在构建镜像时执行名为 build 的 Python 模块,可能用于构建项目或生成特定的输出文件。
RUN python -m build 命令实际上是在执行 Python 模块的命令行接口 (CLI),它会根据项目中的 pyproject.toml 文件(或者 setup.cfg 文件)来构建项目并生成分发包(例如 .whl 文件)。
RUN python -m build 实际上是在构建项目,并将结果保存到 .whl 文件中。
问题5: 如果同时存在 pyproject.toml 和 setup.cfg 文件, 用哪个?
如果同时存在 pyproject.toml 和 setup.cfg 文件,Python 的构建系统会优先使用 pyproject.toml 文件。这是因为在 Python Packaging User Guide 中规定,pyproject.toml 文件是 Python 包项目的标准配置文件,用于指定项目的构建和分发信息。
根据你提供的 pyproject.toml 文件,它指定了使用 setuptools 作为构建后端,并且需要的 setuptools 版本至少是 42。因此,在这种情况下,build 模块会遵循 pyproject.toml 文件的配置,使用 setuptools 来构建项目。
所以,尽管 Dockerfile 中执行了 python -m build 命令,但是由于存在 pyproject.toml 文件,它会使用该文件指定的构建方式进行构建,即使用 setuptools。
问题6: setuptools 是什么?怎么用来构建的?
问题3:如果是直接 docker pull openstitching/stitch 的镜像,怎么看 Dockerfile 呢?
如果你直接从Docker Hub上拉取(pull)了镜像 openstitching/stitch,那么你无法直接查看该镜像的Dockerfile,因为拉取的镜像已经是构建好的。通常情况下,镜像的Dockerfile不会包含在拉取的镜像中。
要查看镜像的相关信息,你可以使用 docker inspect 命令。这个命令可以提供关于镜像的一些元数据,包括镜像的构建来源、标签信息、入口点等。
例如,你可以运行以下命令查看镜像的元数据:
docker inspect openstitching/stitch
这将返回一个JSON格式的数据结构,其中包含有关该镜像的详细信息。在这个JSON中,你可以找到入口点(entrypoint)、命令(command)、标签(labels)等信息,以及构建该镜像的相关信息。
直接安装 pip install stitching 包:
Collecting stitching
Downloading stitching-0.5.3-py3-none-any.whl (29 kB)
Collecting opencv-python>=4.0.1
Downloading opencv_python-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (62.2 MB)
|████████████████████████████████| 62.2 MB 403 kB/s
Collecting largestinteriorrectangle
Downloading largestinteriorrectangle-0.2.0-py3-none-any.whl (13 kB)
Requirement already satisfied: numpy>=1.17.3; python_version >= "3.8" in ./.local/lib/python3.8/site-packages (from opencv-python>=4.0.1->stitching) (1.24.4)
Collecting numba
Downloading numba-0.58.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (3.7 MB)
|████████████████████████████████| 3.7 MB 3.9 MB/s
Collecting llvmlite<0.42,>=0.41.0dev0
Downloading llvmlite-0.41.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (43.6 MB)
|████████████████████████████████| 43.6 MB 1.6 MB/s
Collecting importlib-metadata; python_version < "3.9"
Downloading importlib_metadata-7.1.0-py3-none-any.whl (24 kB)
Collecting zipp>=0.5
Downloading zipp-3.18.1-py3-none-any.whl (8.2 kB)
Installing collected packages: opencv-python, llvmlite, zipp, importlib-metadata, numba, largestinteriorrectangle, stitching
Successfully installed importlib-metadata-7.1.0 largestinteriorrectangle-0.2.0 llvmlite-0.41.1 numba-0.58.1 opencv-python-4.9.0.80 stitching-0.5.3 zipp-3.18.1
源码运行:
git clone https://github.com/OpenStitching/stitching.git
cd stitching/stitching/cli
python3 stitch.py /home/h/projects/stitching_tutorial/panorama_example_
2017/PB*.JPG --detector brisk --confidence_threshold 0.5 --matches_graph_dot_file matches.txt
成功运行。
读取视频:
失败!
需要卸载 stitching, 要不导入包时候会引起冲突。
self.cameras 是图像个数个的 (< cv2.detail.CameraParams 0x7f7266b72a80>, < cv2.detail.CameraParams 0x7f7266b72b70>, < cv2.detail.CameraParams 0x7f7266b72c60>, < cv2.detail.CameraParams 0x7f7266b72d50>, < cv2.detail.CameraParams 0x7f7266b72e40>, < cv2.detail.CameraParams 0x7f7266a2e030>, < cv2.detail.CameraParams 0x7f7266a2e120>, < cv2.detail.CameraParams 0x7f7266a2e210>)

浙公网安备 33010602011771号