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后,显示如下。


相关文章
|
3月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
328 1
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
272 3
|
2月前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
2月前
|
Python Windows
python之windows脚本启动bat
python之windows脚本启动bat
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
61 11
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
25 3
|
3月前
|
存储 数据可视化 Python
【python】python tkinter 计算器GUI版本(模仿windows计算器 源码)【独一无二】
【python】python tkinter 计算器GUI版本(模仿windows计算器 源码)【独一无二】
208 1
|
3月前
|
编译器 开发工具 C语言
解锁QtCreator跨界神技!Windows下轻松驾驭OpenCV动态库,让你的跨平台开发如虎添翼,秒变视觉编程大师!
【8月更文挑战第4天】QtCreator是一款强大的跨平台IDE,便于创建多平台应用。本教程教你如何在Windows环境下集成OpenCV库至Qt项目。首先,下载匹配MinGW的OpenCV预编译版并解压。接着,在QtCreator中新建或打开项目,并在.pro文件中添加OpenCV的头文件和库文件路径。确保编译器设置正确。随后编写测试代码,例如加载和显示图片,并进行编译运行。完成这些步骤后,你就能在QtCreator中利用OpenCV进行图像处理开发了。
215 6
|
3月前
|
Python Windows
【Azure 应用服务】App Service For Windows 环境中部署Python站点后,如何继续访问静态资源文件呢(Serving Static Files)?
【Azure 应用服务】App Service For Windows 环境中部署Python站点后,如何继续访问静态资源文件呢(Serving Static Files)?
|
3月前
|
Python Windows 内存技术
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?