将图像从 python 包装器传递给 C++ 函数
Passing Image from python wrapper to a c++ function
我想将图像从 python 代码传递给 C++ 函数。我的 C++ 函数在一个 .so 文件中,并且正在使用 ctypes 加载到 python。 c++ 函数采用 Mat
类型的参数。参数(即图像)从 Python 传递(使用 opencv)。
当我尝试 运行 上面的场景时,它会抛出如下错误;
ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1
我的代码如下:
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))
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
谢谢。
我终于想出了解决问题的方法。
我必须将 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++ 函数在一个 .so 文件中,并且正在使用 ctypes 加载到 python。 c++ 函数采用 Mat
类型的参数。参数(即图像)从 Python 传递(使用 opencv)。
当我尝试 运行 上面的场景时,它会抛出如下错误;
ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1
我的代码如下: 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))
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
谢谢。
我终于想出了解决问题的方法。
我必须将 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*/
}
干杯。