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;
}