
Python调用C++(opencv)
运行c工程后生成dll可以在python工程中调用
#include
#include
#include
#define DLLEXPORT extern "C" __declspec(dllexport)
using namespace cv;
DLLEXPORT uchar* cpp_canny(int height, int width, uchar* data) {
cv::Mat src(height, width, CV_8UC1, data);
cv::Mat dst;
Canny(src, dst, 100, 200);
uchar* buffer = (uchar*)malloc(sizeof(uchar) * height * width);
memcpy(buffer, dst.data, height * width);
return buffer;
}
DLLEXPORT void release(uchar* data) {
free(data);
}
import cv2
import ctypes
import numpy as np
dll = ctypes.cdll.LoadLibrary("./Dll1.dll")
def cpp_canny(input):
if len(img.shape) >= 3 and img.shape[-1] > 1:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h, w = gray.shape[0], gray.shape[1]
# 获取numpy对象的数据指针
frame_data = np.asarray(gray, dtype=np.uint8)
frame_data = frame_data.ctypes.data_as(ctypes.c_char_p)
# 设置输出数据类型为uint8的指针
dll.cpp_canny.restype = ctypes.POINTER(ctypes.c_uint8)
# 调用dll里的cpp_canny函数
pointer = dll.cpp_canny(h, w, frame_data)
# 从指针指向的地址中读取数据,并转为numpy array
np_canny = np.array(np.fromiter(pointer, dtype=np.uint8, count=h * w))
return pointer, np_canny.reshape((h, w))
img = cv2.imread('1.png')
ptr, canny = cpp_canny(img)
cv2.imshow('canny', canny)
cv2.waitKey(2000)
# 将内存释放
dll.release(ptr)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)