OpenCV Python绑定自定义类型vector参数编译报错解决方法
OpenCV自定义类型vector参数Python绑定报错解决方案
问题场景
参考官方教程添加OpenCV自定义模块时,已实现的类与函数均可正常运行,但编写参数为std::vector<myType>的函数时触发编译错误:
- 自定义类型声明代码:
struct CV_EXPORTS_W_SIMPLE myType { // 已尝试替换为CV_EXPORTS_W宏 // 成员逻辑 };
- 待绑定的类方法代码:
CV_WRAP void myFunction(std::vector<myType>){ // 函数逻辑 }
- 编译报错起始位置:
/source/build/pyopencv_generated_types.h:278:5: error: ‘vector_mytype’ was not declared in this scope vector_mytype vmytype0;
具体实现步骤
OpenCV的Python绑定生成器不会自动为自定义导出类型生成std::vector<T>的类型转换映射,不需要修改核心cv2.cpp文件,按以下步骤手动声明绑定规则即可:
- 第一步:在自定义模块的python绑定配置目录下(通常为模块根目录下的
misc/python/,如果目录不存在可手动创建)新建pyopencv_custom_headers.hpp文件,写入以下内容:
// 引入你自定义myType类型的头文件,替换为实际头文件路径 #include "path/to/your/myType_header.hpp" // 按照OpenCV绑定生成器的命名规则声明vector类型 // 如果myType定义在cv命名空间下,需要写全cv::myType typedef std::vector<myType> vector_mytype;
注意:typedef的类型名必须严格匹配vector_<自定义类型名全小写>格式,和报错提示里缺失的类型名完全一致,否则生成器无法识别。
- 第二步:在同目录下的
python_headers.hpp文件中(如果文件不存在则新建,并在模块的CMakeLists.txt中配置绑定生成器扫描该头文件)添加对上面新建的pyopencv_custom_headers.hpp的引用,确保生成器在生成绑定代码前能读取到该typedef声明。 - 第三步:清空原有build目录的缓存文件,重新执行cmake配置与全量编译,生成器会自动为声明的
vector_mytype类型生成Python与C++之间的双向转换逻辑,编译错误即可解决。
注意:不要直接修改build目录下自动生成的
pyopencv_generated_*.h系列文件,这类文件每次执行cmake都会被重新覆盖,手动修改不会永久生效。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

