OpenCV中的superres模块只能在C++中使用吗?

问题描述 投票:0回答:1

我在Windows 11上构建了OpenCV4。当我尝试通过Python使用the superres模块时,我遇到了一个错误:

module 'cv2' has no attribute 'superres'

import cv2
model = cv2.superres.createSuperResolution_BTVL1()

我在构建 OpenCV 时包含了 superres 模块。

Cmake 信息: Cmake info

然后我发现用C++就可以了。那么这个模块只能在C++中使用吗?

#include <iostream>
#include <cstring>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp" 
#include "opencv2/superres.hpp"

int main(int argc, char* argv[])
{
        // no error.
    cv::superres::createSuperResolution_BTVL1();
    return 0;
}

python opencv
1个回答
0
投票

OpenCV 的 Python 包装器通常是自动生成的(有一些手写的,但这只是一小部分)。为了实现这一点,宏形式的注释必须出现在相应模块的头文件中。对于独立函数和类,这通常是

CV_EXPORTS_W
和朋友,对于类成员函数,是
CV_WRAP
的一些变体,还有一些可能需要用于函数参数。我在[这个问题]的回答中描述了一些内容,OpenCV 文档也包含一些有用的内容

如果我们检查 superres

 模块
标头,我们可以看到没有这样的注释(
CV_EXPORTS
只是一个通用的导出/导入 doohickey,那里没有生成包装器)。在过渡到 4.0 期间,
superres
模块从 main 移至 contrib,显然是由于缺乏维护。当我查看 3.x 分支时,我也找不到任何注释。我没有深入挖掘,所以谁知道呢,它可能在 2.x 中提供了一些可用的东西,但这与今天并不相关。

通常,当生成 Python 包装器时,也会生成文档的函数签名。在文档中看不到任何内容,因此这是支持我们结论的更多证据。


基于上述内容,该模块的功能在 OpenCV 的标准 Python 绑定中不可用。这并不一定意味着它只能从 C++ 中获得,因为其他语言的某些绑定的实现方式有所不同,但由于这是一个未维护的 contrib 模块,因此很可能是这种情况。

可能的解决方案:

  • 正如 Christoph 提到的,看看
    dnn_superres
    ——它有可用的 Python 绑定。
  • 如果您从其他一些在类中包含注释的模块中获得灵感,那么向
    superres
    添加注释可能不会太困难。我不知道在那里接受这样的拉取请求有多容易,但可能值得一试,除非你想用你的程序发布你自己的自定义构建。
  • 我想你可以尝试通过
    ctypes
    使用它,但考虑到它是 C++,这就像打开另一罐蠕虫,可移植性就消失了。
  • 您可以使用 Boost.Python 或 pybind11 围绕所需功能编写一个薄包装器。两者都支持 numpy 数组,因此让它与常规 OpenCV Python 代码很好地配合应该不会太难。
© www.soinside.com 2019 - 2024. All rights reserved.