封装C++函数成DLL给Python工程调用

封装C++函数成DLL给Python工程调用,第1张

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)

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1498933.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-25
下一篇2022-06-25

发表评论

登录后才能评论

评论列表(0条)

    保存