如何用python调用C++处理图片

一. 背景

  1. 用pyhton可直接调用C++,减少重写的工作量;
  2. 部分逻辑运算,C++的执行效率高,可进行加速。
    下面就一个简单的C++滤镜(彩色图转灰度图)为例,展示python调用C++

二. 代码实现

代码结构如下:

.
├── build
├── CMakeLists.txt
├── image_processing.cpp    # C++头文件
├── image_processing.h      # C++源文件
└── image_process.py        # python调用C++

各个文件的内容如下
image_processing.h

#ifndef IMAGE_PROCESSING_H
#define IMAGE_PROCESSING_H#include <opencv2/opencv.hpp>extern "C" {void process_image(const unsigned char* input, unsigned char* output, int width, int height, int channels);
}#endif // IMAGE_PROCESSING_H

image_processing.cpp

#include "image_processing.h"void process_image(const unsigned char* input, unsigned char* output, int width, int height, int channels) {cv::Mat input_image(height, width, channels == 3 ? CV_8UC3 : CV_8UC1, (void*)input);cv::Mat output_image(height, width, CV_8UC1);// 转换为灰度图像cv::cvtColor(input_image, output_image, cv::COLOR_BGR2GRAY);// 将处理后的图像数据复制到输出缓冲区std::memcpy(output, output_image.data, width * height * sizeof(unsigned char));
}

image_process.py

import ctypes
import numpy as np
import cv2
import os# 确定库文件路径
libname = "./build/libimage_processing.so"# 加载共享库
image_lib = ctypes.CDLL(libname)# 定义处理函数的原型
image_lib.process_image.argtypes = [ctypes.POINTER(ctypes.c_ubyte),  # 输入图像数据ctypes.POINTER(ctypes.c_ubyte),  # 输出图像数据ctypes.c_int,                    # 宽度ctypes.c_int,                    # 高度ctypes.c_int                     # 通道数
]# 读取图像
input_image = cv2.imread('input.jpg')
height, width, channels = input_image.shape# 创建输出缓冲区
output_image = np.zeros((height, width), dtype=np.uint8)# 调用 C++ 处理函数
input_ptr = input_image.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte))
output_ptr = output_image.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte))
image_lib.process_image(input_ptr, output_ptr, width, height, channels)cv2.imwrite("output.jpg", output_image)

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(ImageProcessingLibrary)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# 查找 OpenCV 库
find_package(OpenCV REQUIRED)# 包含 OpenCV 头文件
include_directories(${OpenCV_INCLUDE_DIRS})# 添加库
add_library(image_processing SHARED image_processing.cpp)# 链接 OpenCV 库
target_link_libraries(image_processing ${OpenCV_LIBS})

三. 编译代码 && 调用动态库

1. 编译代码

# 执行下面命令后,会生成动态库,./build/libimage_processing.so
mkdir build
cd build
cmake ..
make

2. 调用动态库

python image_process.py

效果如下(模拟灰度滤镜):
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试题:对比ArrayList和LinkedList的内部实现,以及它们在不同场景下的适用性

ArrayList和LinkedList是Java中常用的两个List实现&#xff0c;它们在内部实现和适用场景上有很大差异。下面是详细的对比分析&#xff1a; 内部实现 ArrayList 数据结构&#xff1a;内部使用动态数组&#xff08;即一个可变长的数组&#xff09;实现。存储方式&#xff1a;…

MybatisPlus 的入门与实践:BaseMapper 实现 CRUD

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集&#xff0c;可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objects&#xff0c;普通的 Java 对象&#xff09;为数据库中的记录。 下面我们将详细探讨 MyBati…

如何解决跨区域文件传输存在的安全管控问题?

⼤型企业和集团为扩⼤市场份额、优化资源配置&#xff0c;会在不同地区设⽴多级下属分⽀机构、研发中心、实验室等&#xff0c;存在研发数据横向或纵向流转的需求&#xff0c;研发数据进行跨区域文件传输的场景。跨区域可能是网络区域&#xff0c;也可能是地理区域&#xff0c;…

2-10 基于matlab的动态时间归整(DTW)算法

基于matlab的动态时间归整&#xff08;DTW&#xff09;算法。16页的试验文档。以一个能识别数字0&#xff5e;9的语音识别系统的实现过程为例&#xff0c;阐述了基于DTW算法的特定人孤立词语音识别的基本原理和关键技术。其中包括对语音端点检测方法、特征参数计算方法和DTW算法…

MT1318 完美平方

题目 输入正整数N&#xff0c;检查它是否为完美平方。完美平方数是指1个平方数可以分成两部分后&#xff0c;每个部分仍然是平方数。如497 * 7&#xff0c;分成4和9&#xff0c;4和9都是平方数。再如168141*41&#xff0c;1681分成16和81&#xff0c;也都是平方数。 格式 输…

elasticsearch的安装和配置

单节点安装与部署 我们通过docker进行安装 1.docker的安装 如果以及安装了docker就可以跳过这个步骤。 首先更新yum: yum update安装docker: yum install docker查看docker的版本&#xff1a; docker -v此时我们的docker就安装成功了。 2.创建网络 我们还需要部署kiban…

八大排序————C语言版实现

Hello&#xff0c;各位未来的高级程序员们&#xff0c;大家好&#xff0c;今天我就来为大家讲解一下有关排序的内容&#xff0c;我们常见的排序就是我们接下来要讲的这八个排序&#xff0c;我们平常所说的排序有十大排序&#xff0c;我们这里的八大排序是我们生活中最为常见的八…

idea的右边栏maven不见了(丢了)解决方案以及idea无法识别maven项目

前言 众所周知&#xff0c;idea是java开发中不可缺少的利器&#xff0c;但是由于功能过多&#xff0c;导致奇怪的问题也很多 问题汇总 idea的右边栏maven丢了 idea无法识别maven项目 对应的解决办法 idea的右边栏maven丢了 原因可能是被自己手动移除了 或者 项目没被正确…

CTF入门指南

何为CTF &#xff1f; CTF&#xff08;Capture The Flag&#xff09;夺旗比赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…

研究Redis源码的一些前期准备

一 背景 Redis数据结构讲完后&#xff0c;觉得还是有点不过瘾&#xff0c;想研究一下Redis的底层实现。找了一些相关资料&#xff0c;准备借鉴和学习其他各位大佬钻研Redis底层的方法和经验&#xff0c;掌握Redis实现的基本原理。 二 源码归类 网上有大佬已经总结了…

IPC工业电脑的现状、发展未来与破局策略

文章目录 全球工业电脑市场概况1.1 市场规模与增长1.2 区域分布与主要市场 工业电脑的技术发展与应用2.1 技术趋势与创新2.2 应用领域扩展2.3 工业自动化与智能化 竞争格局与市场参与者3.1 主要企业与市场竞争3.2 国内外竞争对比3.3 市场集中度与竞争策略 未来发展趋势与市场预…

Unity3D 大地图分块:分块编辑小AStar地图详解

在Unity3D中&#xff0c;处理大型游戏地图时&#xff0c;通常会遇到性能问题&#xff0c;特别是在进行路径寻找&#xff08;如A算法&#xff09;时。为了优化性能&#xff0c;我们通常会将大地图分块&#xff08;Chunking&#xff09;&#xff0c;并在每个块上单独应用A算法。这…

utf8和utf8mb4的主要区别

utf8和utf8mb4的主要区别可以总结为以下几点&#xff1a; 编码能力&#xff1a; utf8&#xff1a;在MySQL中&#xff0c;utf8编码最大字符长度为3字节。这意味着它支持Unicode中的基本多文种平面&#xff08;BMP&#xff09;&#xff0c;其字符范围是U0000至UFFFF。utf8mb4&am…

算法训练 | 动态规划Part5 | 518.零钱兑换 II、377.组合总和 Ⅳ 、70.爬楼梯 (进阶)

目录 518. 零钱兑换 II 动态规划法 377. 组合总和 Ⅳ 动态规划法 70. 爬楼梯 &#xff08;进阶&#xff09; 动态规划法 518. 零钱兑换 II 题目链接&#xff1a;518. 零钱兑换 II - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 动态规划法…

一键简易桌签(带背景)-Word插件-大珩助手

问题整理&#xff1a; 如何Word中设计简易桌签&#xff1f;如何设置带背景图的桌签&#xff1f; Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&…

基于改进贝叶斯学习的旋转机械故障诊断(MATLAB)

贝叶斯理论的基础是18世纪的英国数学家Bayes提出的贝叶斯公式&#xff0c;Bayes在统计决策函数、统计推断以及和统计的估算等数学领域都做出了重要贡献。19世纪&#xff0c;法国数学家Laplace创作的《概率的分析理论》一文利用了贝叶斯分析&#xff0c;但由于当时贝叶斯理论在实…

微信小程序使用方法

一.在网页注册小程序账号&#xff08;在未注册的情况下&#xff09; 1.如果你还没有微信公众平台的账号&#xff0c;请先进入微信公众平台首页&#xff0c;点击 “立即注册” 按钮进行注册。我们选择 “小程序” 即可。 接着填写账号信息&#xff0c;需要注意的是&#xff0c;…

FreeRTOS源码分析

目录 1、FreeRTOS目录结构 2、核心文件 3、移植时涉及的文件 4、头文件相关 4.1 头文件目录 4.2 头文件 5、内存管理 6、入口函数 7、数据类型和编程规范 7.1 数据类型 7.2 变量名 7.3 函数名 7.4 宏的名 1、FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工…

每日练题(py,c,cpp)

检验素数 from math import sqrt a int(input("请输入一个数&#xff1a;")) for i in range(2,int(sqrt(a))):if a%i 0:print("该数不是素数")breakelse: print("该数是素数")# # 1既不是素数也不是合数 # #可以用flag做标志位 # b int(…

Opencv学习项目1——pytesseract

最近开始学习opencv使用&#xff0c;跟着b站一起做实战项目&#xff0c;跟大家分享一下学习成果&#xff0c;大佬勿喷 项目演示 pytesseract 是一个用于文字识别&#xff08;OCR&#xff0c;光学字符识别&#xff09;的 Python 库&#xff0c;它是 Tesseract OCR 引擎的 Python…