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

Python调用C++(opencv)
运行c工程后生成dll可以在python工程中调用

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>                   
#include   <stdlib.h>   
#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)

Pycharm通过动态链接库获取视频并展示

import threading
import time
import os
import cv2
import numpy as np
import ctypes

os.chdir("C:\\Users\\dd\\source\\repos\\CameraSkdTool\\Release")  # 加载链接库
dll = ctypes.cdll.LoadLibrary("C:\\Users\\dd\\source\\repos\\CameraSkdTool\\Release\\CameraSkdTool.dll")  # 加载链接库
# dll = ctypes.cdll.LoadLibrary("CameraSkdTool.dll")  # 加载链接库
dll.Init()

from func_timeout import func_set_timeout
@func_set_timeout(5)
def listen_camera():
    dll.GetNextMat.restype = ctypes.POINTER(ctypes.c_uint8)
    pointer = dll.GetNextMat()
    # 从指针指向的地址中读取数据,并转为numpy array
    print(pointer)
    h = 640
    w = 480
    np_canny = np.array(np.fromiter(pointer, dtype=np.uint8, count=h * w))
    np_canny = np_canny.reshape((h, w))
    print(type(np_canny))
    print(np_canny.shape)
    print(np_canny)
    cv2.imshow('canny', np_canny)
    cv2.waitKey(10)
    dll.release(pointer)
    print("正在取视频帧")
p1 = threading.Thread(target=listen_camera())
p1.start()

C++返回opencv的Mat

uchar* GetNextMat() {
	Mat MatNull;
	MatNull.data = NULL;
	while (1)
	{
		if (iCameraGrabFrame())//采集图像
		{
			if (im_pDisplayBuffer != NULL)
			{
				/* user code begain */
				memcpy(im_pDisplayBuffer, im_pCameraBuffer, im_info_size);

				Mat imageSrc, imageRotate, imageDis;
				imageSrc = Mat(im_info_h, im_info_w, CV_8UC1, im_pDisplayBuffer);	//640*480

				imageRotate = Mat::zeros(imageSrc.size(), imageSrc.type());

				transpose(imageSrc, imageRotate);
				flip(imageRotate, imageRotate, 1);

				imageDis = imageRotate;
				uchar* buffer = (uchar*)malloc(sizeof(uchar) * im_info_h * im_info_w);
				memcpy(buffer, imageDis.data, im_info_h * im_info_w);
				return buffer;
				//return imageDis;

			}
			uchar* buffer = (uchar*)malloc(sizeof(uchar) * im_info_h * im_info_w);
			memcpy(buffer, MatNull.data, im_info_h * im_info_w);
			return buffer;
			//return MatNull;
		}
	}
	uchar* buffer = (uchar*)malloc(sizeof(uchar) * im_info_h * im_info_w);
	memcpy(buffer, MatNull.data, im_info_h * im_info_w);
	return buffer;
	//return MatNull;	
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值