Windows中Python与OpenCV C++之间Mat传递

简介: Windows中Python与OpenCV C++之间Mat传递

Windows中Python与OpenCV C++之间Mat传递


1 VS2017中创建DLL项目

1.1 创建DLL项目

1.2 删除自动创建的文件

stdafx.htargetver.hdllmain.cppMyDLL.cppstdafxc.pp删除。

删除后,记得要在C/C++》预编译头 中取消使用预编译头

1.3 配置OpenCV环境

这一步可参靠我的另一篇文章《OpenCV 3.2.0 + opencv_contrib+VS2017》。需要修改地方如下。

2 编写调用OpenCV的C代码

创建MyDLL.cpp文件,输入如下代码:

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

上代码简单调用了OpenCV的Canny函数,使用指针传递数据。值得注意的是,自定义的宏DLLEXPORT用于指定暴露的函数,只有加了这个宏的函数在外面才能调用。

注意: 由于cpp_canny函数中申请了内存空间,需要释放,因此加了函数release,用于在python端释放内存。

3 编译生成DLL

执行

在项目目录中可以找到生成的DLL文件

4 编写Python代码

创建Python文件,输入如下代码:

import cv2
from numpy.ctypeslib import ndpointer
import ctypes
import numpy as np
dll=ctypes.WinDLL('MyDLL.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('input.png')
ptr,canny=cpp_canny(img)
cv2.imshow('canny',canny)
cv2.waitKey(2000)
#将内存释放
dll.release(ptr)

5 执行

VS2017生成的MyDLL.dll文件拷贝到python代码根目录,并加入测试图片input.jpg,示例如下。

执行test.py后,显示如下。


相关文章
|
9月前
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
361 10
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
341 7
|
12月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
2081 3
|
12月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
745 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
160 11
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
106 3
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
250 1
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
912 1
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
2860 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达

推荐镜像

更多