将图像从 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++ 函数的主要内容,如果未能解决你的问题,请参考以下文章
使用 SWIG 将 C++ 对象指针传递给 Python,而不是再次返回 C++