1

我正在尝试估计一些图像的变换并在 python 中使用stitcher.estimateTransform()stitcher.composePanorama()缝合它们。估计变换后,composePanorama 给出如下错误:

pano 不是 numpy 数组,也不是标量

我尝试使用 将 NumPy Array 转换为 Mat 对象cv2.fromarray(left),但它仅适用于 cv,不适用于 cv2。因此,如何在 cv2 中将此 numpy 转换为 MAT 数组。我没有找到任何使用composePanoramapython 绑定的例子。对此错误的任何解决方案或使用stitcher.estimateTransform()OpenCV-Python 绑定的示例将不胜感激。

注意:尽管 OpenCV-Python 绑定中的 Stitching 类不完整(由于自动生成的绑定),help(cv2.createStitcher())但表明它包含composePanorama()estimateTransform().

注意:我可以stitcher.stitch()毫无问题地使用,但使用stitcher.stitch()对我没有帮助,因为我试图不计算主循环中每次迭代的变换。

我的简单代码:

leftStream = cv2.VideoCapture(0)
rightStream = cv2.VideoCapture(1)
left = leftStream.read()[1]
right = rightStream.read()[1]
st = cv2.createStitcher(False)
st.estimateTransform([left, right])
st.composePanorama([left, right])
4

2 回答 2

3

要使用stitcher.estimateTransform()stitcher.composePanorama()您将需要

  1. 下载opencv https://github.com/opencv/opencv
  2. 导航到 opencv-master/modules/stitching/include/opencv2/stitching.hpp
  3. 在您希望能够在 Python 中调用的任何方法之前添加 CV_WRAP。在这种情况下,那些将是 estimateTransform 和 composePanorama

然后构建python模块:

cd ~/opencv
mkdir build
cd build
cmake ../
make
sudo make install

然后将模块从安装到的任何位置移动到您的虚拟环境中。在我的情况下是/usr/local/lib/python3.7/site-packages/cv2。

请参阅https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/https://docs.opencv.org/4.1.0/da/d49/tutorial_py_bindings_basics.htmlhttps://docs.opencv.org/4.1.1/da/df6/tutorial_py_table_of_contents_setup.html了解更多信息。

于 2019-08-06T17:49:38.543 回答
1

我也有同样的问题。据我所知,composePanorama有两个重载。

CV_WRAP Status composePanorama(OutputArray pano);
Status composePanorama(InputArrayOfArrays images, OutputArray pano);

这是我们需要的第二个重载,因为它pano是一个输出参数,在 Python 中作为返回值给出。不幸的是,第二个重载没有标记,CV_WRAP这将使它可用于 Python 绑定。所以我能看到的唯一解决方案是:

  • 使用替代拼接实现
  • 浏览缺少的 composePanorama 实现的 C++ 代码,然后用 Python 自己重新实现
  • 在 Open CV Github 上注册问题并等待更新
  • 自己从源代码构建 Open CV 并将函数标记为CV_WRAP(我不确定它实际上是否如此简单)
  • 使用 C++ 而不是 Python

虽然如果其他人可以发布一个答案,展示如何在 Python 中实现这一目标,而无需完成上述复杂任务,我会非常高兴。

于 2019-08-06T13:51:13.450 回答