【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)

简介: 【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)

前言

  最近在项目中遇到了一些问题,在这里记录一下。起因是这样的:有部分功能在python中处理的较慢,而在C++中使用相同的逻辑则使用的较快。面对这种困境的话我想到了C++可以制作dll文件或SO文件供python端调用,于是便有了本文中的记录。

需求

  现有一使用python调用opencv库读取的图像文件需要交付C++进行处理后返回结果,在这里我们简化一下流程:

image.png


  在上述的流程里我们参考VS的官方资料可以得到使用c++生成dll的步骤与例子,我就不过多阐述了;关于python调用dll的例子大家在python的官网上也可查阅到。我也不过过阐述了。在这里我主要记录一下难点:如何把一张三维图传递给dll

数据的传入与接收

  在python端我们可通过numpy将cv2读取的图像数据转为指针的形式,然后再c++中将指针转三维图像。

python

python

复制代码

import cv2
from ctypes import *
import numpy as np
def Mat2Uchar(matImg):
    Mat = np.asarray(matImg, dtype=np.uint8)
    Uchar = Mat.ctypes.data_as(c_char_p)
    return Uchar

C++

ini

复制代码

// pch.cpp: 与预编译标头对应的源文件
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/ml/ml.hpp"
// change uchar* to mat Uchar2Mat
cv::Mat Uchar2Mat(uchar* frame_data, int width, int height) {
   cv::Mat img(height, width, CV_8UC3);
   uchar* ptr = img.ptr<uchar>(0);
   int count = 0;
   int channels = 3;
   for (int row = 0; row < height; row++) {
      ptr = img.ptr<uchar>(row);
      for (int col = 0; col < width; col++) {
         for (int c = 0; c < channels; c++) {
            ptr[col * channels + c] = frame_data[count];
            count++;
         }
      }
   }
   return img;
}

  在调用的时候我们需要定义dll函数的输入类型以及输出类型

ini

复制代码

mydll = CDLL("C:/Users/kiven/Desktop/v56c/Dll1/x64/Debug/Dll1.dll")
mydll.SaveImg.argtypes = [c_char_p]  # 定义输入值类型
mydll.SaveImg.restype = c_int  # 定义返回值类型

py的对比C++的缺点

  上述的两段代码我们已经实现了python调用c++生成的处理图像的dll函数。回过头来总结一下python相较于C++的缺点:

性能较低

  Python 是解释型语言,因此相较于编译型语言 C++,Python 的执行速度要慢一些。Python 需要将代码翻译成机器语言,这个过程需要花费一定的时间。尤其是在进行大量的数值计算时,Python 的性能表现较差。

GIL 的存在

  Python 的全局解释器锁(Global Interpreter Lock,GIL)是一种限制 Python 多线程并行性能的机制。GIL 只允许 Python 解释器执行同一时刻只有一个线程的代码。这意味着 Python 在多线程应用中无法充分利用多核 CPU 的性能

资源占用较多

  Python 在执行代码时需要占用较多的内存资源,这可能会导致在处理大型数据集时出现内存不足的问题。此外,Python 的一些库和框架可能会占用大量的磁盘空间。

  由于面对上述的明显缺点,我们可逆推一下:当我们的python任务面对:大量的数值计算任务、 需要充分利用多核CPU、处理大型数据集时内存不足时可利用好C++生成dll供python调用

结尾

  Python 调用 C++ 生成的 DLL 函数可以实现 Python 与 C++ 之间的数据交换和函数调用。通过 ctypes 模块,Python 可以动态链接 DLL 文件,并调用其中的函数。同时,使用 C++ 生成 DLL 文件的过程中需要注意一些问题,如函数声明需要添加 __declspec(dllexport) 关键字等。此外,对于 C++ 中一些复杂的数据类型,需要使用 ctypes 提供的相关类型进行转换。最后,需要注意在使用 ctypes 调用 DLL 函数时,需要指定函数的返回类型和参数类型。通过正确使用 ctypes 模块,Python 可以与 C++ 相结合,实现更加强大的功能和更高效的计算。


相关文章
|
7天前
|
数据管理 开发者 Python
揭秘Python的__init__.py:从入门到精通的包管理艺术
__init__.py是Python包管理中的核心文件,既是包的身份标识,也是模块化设计的关键。本文从其历史演进、核心功能(如初始化、模块曝光控制和延迟加载)、高级应用场景(如兼容性适配、类型提示和插件架构)到最佳实践与常见陷阱,全面解析了__init__.py的作用与使用技巧。通过合理设计,开发者可构建优雅高效的包结构,助力Python代码质量提升。
46 10
|
2月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
害虫识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了12种常见的害虫种类数据集【"蚂蚁(ants)", "蜜蜂(bees)", "甲虫(beetle)", "毛虫(catterpillar)", "蚯蚓(earthworms)", "蜚蠊(earwig)", "蚱蜢(grasshopper)", "飞蛾(moth)", "鼻涕虫(slug)", "蜗牛(snail)", "黄蜂(wasp)", "象鼻虫(weevil)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Djan
160 1
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
3月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
203 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
8月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
253 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
3月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
94 12
|
5月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
326 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
4月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
88 4
|
6月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
150 3
|
7月前
|
存储 JSON API
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
|
8月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
263 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面

热门文章

最新文章