将图像从 python 包装器传递给 c++ 函数

Posted

技术标签:

【中文标题】将图像从 python 包装器传递给 c++ 函数【英文标题】:Passing Image from python wrapper to a c++ function 【发布时间】:2019-03-15 13:58:59 【问题描述】:

我想将图像从 python 代码传递给 c++ 函数。我的 c++ 函数位于 .so 文件中,并且正在使用 ctypes 加载到 python 中。 c++ 函数采用Mat 类型的参数。参数(即图像)是从 Python 传递的(使用 opencv)。

当我尝试运行上述场景时,它会抛出如下错误;

ctypes.ArgumentError: argument 1: : 不知道如何转换参数 1

我的代码如下: 测试.py

import cv2
from ctypes import *

testso = CDLL("./libvideoread.so")
cap = cv2.VideoCapture("Bigbunny.mp4")
if(cap.isOpened == False):
    print("error")
else:
    frame_width = int(cap.get(3))
    frame_height = int(cap.get(4))
    cv2.namedWindow('frame',cv2.WINDOW_NORMAL)
    while(cap.isOpened):
       ret,frame = cap.read()
       if ret:
          testso.imgread(frame)
       else:
           break

cap.release()
cv2.destroyAllWindows()

cpp代码:

void imgread(Mat frame)

     /*Do something*/

在线查看错误,得知Opencv-python将图像数据转换为numpy数组。而 Opencv-c++ 使用 Mat 类型。那么如何将 numpy 数组转换为 Mat 类型或将图像从 python 传递到 c++ 函数。

我不想使用 Boost::python

谢谢。

【问题讨论】:

C++ conversion from NumPy array to Mat (OpenCV)的可能重复 【参考方案1】:

我终于找到了解决问题的办法。

我必须将 mat 格式转换为 numpy 数组。并将这个数组作为参数传递给 cpp 函数 imgread()

cpp函数imgread()需要将其作为char指针接收,然后转换为mat。

修改了test.py;

import cv2
from ctypes import *

testso = CDLL("./libvideoread.so")
cap = cv2.VideoCapture("Bigbunny.mp4")
if(cap.isOpened == False):
    print("error")
else:
    frame_width = int(cap.get(3)) # Width is 1280
    frame_height = int(cap.get(4)) # Height is 720
    cv2.namedWindow('frame',cv2.WINDOW_NORMAL)
while(cap.isOpened):
   ret,frame = cap.read()
   if ret:
      # Next 3 lines convert frame data to numpy array
      testarray1 = np.fromstring(frame, np.uint8) 
      testarray2 = np.reshape(testarray1, (720, 1280, 3))
      framearray = testarray2.tostring()

      #Send framearray to the cpp function.
      testso.imgread(framearray)
   else:
       break

 cap.release()
 cv2.destroyAllWindows()

在cpp端;

void imgread(unsigned char* framedata)

  cv::Mat frame(cv::Size(1280,720), CV_8UC3, framedata);
   /*Do something*/

干杯。

【讨论】:

以上是关于将图像从 python 包装器传递给 c++ 函数的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建对象并将指针传递给 python

使用 SWIG 将 C++ 对象指针传递给 Python,而不是再次返回 C++

如何将结构数组从 c++ 传递到 c#?

尝试将自定义 C++ 矩阵传递给 numpy 数组

如何将 cv::mat 对象从 python 模块传递给 c++ 函数并返回返回的 cv::mat 类型的对象?

使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++