OpenCV 3.4.8中NumPy数组转cv::Mat并传递给C++ wrapper的问题求助
解决NumPy数组转cv::Mat传递给C++ OpenCV Wrapper的问题
核心问题分析
cv2.fromarray不存在:OpenCV 3.4.8的Python API中,NumPy ndarray与cv::Mat是无缝兼容的,根本不需要额外转换函数,这个函数属于旧版API或非官方绑定,不存在于当前版本中。- 参数类型不兼容:直接传递NumPy数组给接收
void*的C函数会失败,因为pybind11无法自动将Python数组转换为C的void*,需要明确使用兼容的类型(如cv::Mat或pybind11的numpy.ndarray)。 - 冗余的颜色转换:
cv2.imread默认返回BGR格式的uint8数组,你额外执行的COLOR_RGB2BGR转换会导致颜色反转,属于错误操作。
解决方案步骤
1. 修改Python代码
去掉无效的转换逻辑,直接传递NumPy数组给Wrapper函数:
import sys sys.path.append('/usr/local/lib/python3.8/site-packages') import cv2 import numpy as np import opencv_wrapper2 # 加载图像 - imread默认返回BGR格式的uint8数组,无需额外转换 img1 = cv2.imread('images/image1.jpg') img2 = cv2.imread('images/image2.jpg') # 校验图像加载状态 if img1 is None or img2 is None: raise ValueError("无法加载图像,请检查文件路径是否正确") # 直接传递numpy数组给C++函数 repeatability = opencv_wrapper2.calculateRepeatability(img1, img2)
2. 修改C++ Wrapper代码
使用cv::Mat作为参数类型,pybind11会自动完成NumPy数组到cv::Mat的转换,无需手动处理数据指针和尺寸:
#define OPENCV_TRAITS_ENABLE_DEPRECATED #include "./pybind11/include/pybind11/pybind11.h" #include "./pybind11/include/pybind11/numpy.h" #include "./pybind11/include/pybind11/stl.h" #include <opencv2/opencv.hpp> #include <vector> #include <opencv2/features2d.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/calib3d.hpp> #include <iostream> using namespace std; using namespace cv; namespace py = pybind11; // 直接接收cv::Mat参数,无需手动解析数据 float calculateRepeatability(const cv::Mat& img1, const cv::Mat& img2) { // 这里写入你的重复度计算逻辑,例如: Ptr<xfeatures2d::SIFT> sift = xfeatures2d::SIFT::create(); vector<KeyPoint> kp1, kp2; Mat desc1, desc2; sift->detectAndCompute(img1, noArray(), kp1, desc1); sift->detectAndCompute(img2, noArray(), kp2, desc2); // 特征匹配、重复度计算逻辑... float repeatability_val = 0.0f; // 替换为实际计算结果 return repeatability_val; } PYBIND11_MODULE(opencv_wrapper2, m) { // 绑定cv::Mat类型,让pybind11能自动转换NumPy数组 py::class_<cv::Mat>(m, "Mat") .def(py::init<>()); // 绑定计算函数,添加参数说明 m.def("calculateRepeatability", &calculateRepeatability, "Compute the repeatability of a feature detector with threshold 0.4", py::arg("img1"), py::arg("img2")); }
额外注意事项
- 编译Wrapper时,确保CMake或编译脚本正确链接OpenCV库(如
opencv_core、opencv_features2d、opencv_xfeatures2d等)。 - 确认pybind11版本与OpenCV 3.4.8兼容(推荐pybind11 2.6.0及以上版本)。
- 如果处理灰度图,NumPy数组的二维形状会被自动转换为单通道的
cv::Mat,无需额外处理。
内容的提问来源于stack exchange,提问作者dev_4a_living
相关产品推荐
相关产品推荐

