我在Windows 11上构建了OpenCV4。当我尝试通过Python使用the superres模块时,我遇到了一个错误:
module 'cv2' has no attribute 'superres'
import cv2
model = cv2.superres.createSuperResolution_BTVL1()
我在构建 OpenCV 时包含了 superres 模块。
Cmake 信息:
然后我发现用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;
}
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 模块,因此很可能是这种情况。
可能的解决方案:
dnn_superres
——它有可用的 Python 绑定。superres
添加注释可能不会太困难。我不知道在那里接受这样的拉取请求有多容易,但可能值得一试,除非你想用你的程序发布你自己的自定义构建。ctypes
使用它,但考虑到它是 C++,这就像打开另一罐蠕虫,可移植性就消失了。