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

news2024/11/19 7:33:25

一. 背景

  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.coloradmin.cn/o/1838546.html

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

相关文章

别再全网找了,这四款良心软件,还你一个清爽的电脑桌面

现在电脑桌面上软件多得吓人。 要是不整理&#xff0c;看着就闹心&#xff1b;整理起来呢&#xff0c;又累得够呛。 所以&#xff0c;很多人干脆就不用那些“用着没意思&#xff0c;删了又觉得可惜”的软件了。 但不管你怎么删&#xff0c;有些软件还是得留着&#xff0c;就像…

每日复盘-202406018

今日关注&#xff1a; 20240617 20240618 六日涨幅最大: ------1--------300868--------- 杰美特 五日涨幅最大: ------1--------300868--------- 杰美特 四日涨幅最大: ------1--------300868--------- 杰美特 三日涨幅最大: ------1--------300462--------- 华铭智能 二日涨…

线程安全问题的原因与解决方案

目录 1.线程在系统中是随机调度&#xff0c;抢占式执行&#xff1b; 2.多个线程同时修改同一个变量 3.线程对变量的修改操作指令不是“原子” 4.内存可见性&#xff0c;引起的线程不安全 拓展 小结 5.指令重排序&#xff0c;引起的线程不安全 为了可以更好的解释&#x…

儿童运动app开发,赢在“起跑线”

我国很早就发出了“体育强国”的口号&#xff0c;随着新高考的改革&#xff0c;体育成绩的占比也越来越大&#xff0c;这对同学们的高考分数也发挥着不可小觑的作用。为此&#xff0c;很多家长开始从小培养孩子的体育运动&#xff0c;力求在强身健体的同时&#xff0c;为考试助…

【大数据】大数据平台建设整体解决方案(Word源文件)

建设大数据管理中台&#xff0c;按照统一的数据规范和标准体系&#xff0c;构建统一数据采集&#xfe63;治理&#xfe63;共享标准、统一技术开发体系、统一接口 API &#xff0c;实现数据采集、平台治理&#xff0c;业务应用三层解耦&#xff0c;并按照统一标准格式提供高效的…

PMP考试难度大吗?没基础能过吗?

由于目前的PMP考试主要基于新的大纲&#xff0c;许多内容已经发生了变化&#xff0c;因此学习新的知识&#xff0c;适应新的变化仍然非常重要。 一、新版考试的题量和答题时间有什么变化&#xff1f; 总题量从200道减少到180道&#xff0c;因此答题时间相对变得更充裕一些。 …

计算机网络:运输层 - TCP首部格式 连接的创建与释放

计算机网络&#xff1a;运输层 - TCP首部格式 & 连接的创建与释放 TCP首部格式源端口 目的端口序号确认号数据偏移保留控制位窗口检验和紧急指针 TCP连接创建 - 三次握手TCP传输过程TCP连接释放 - 四次挥手 TCP首部格式 TCP的首部如下&#xff1a; 首部的前20 byte是固定的…

在Python项目中自定义日志工具

在Python项目中自定义日志工具 日志记录是软件开发中的一个关键部分&#xff0c;它可以帮助开发人员调试代码、监控运行状况以及记录重要事件。在Python中&#xff0c;logging 模块提供了强大的日志记录功能。本文将介绍如何创建一个日志工具&#xff0c;使其能够同时将日志输…

【会议征稿,IEEE出版】第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024,7月5-7)

第四届电气工程与机电一体化技术国际学术会议&#xff08;ICEEMT 2024&#xff09;定于2024年7月5-7日在浙江省杭州市隆重举行 。会议主要围绕“电气工程”、“机电一体化” 等研究领域展开讨论&#xff0c;旨在为电气工程、机电一体化等领域的专家学者、工程技术人员、技术研发…

leetcode (top100)接雨水

题目&#xff1a; 题解&#xff1a; 可以把每个宽度看作一个桶&#xff0c;每个桶能接的水等于这个桶左右两个方向最高桶的最小高度再减去这个桶本身的高度。把每个桶能接的水相加即可。 难点在于如何快速找到当前桶的左右两个方向的最高桶的高度&#xff0c;可以先遍历一遍…

Java学习【深入解读File类:从基础到高级的完整指南】

Java学习【深入解读File类&#xff1a;从基础到高级的完整指南】 ⭐File的概述和构造方法⭐File常见的成员方法&#x1f319;构造方法&#x1f319;length()&#x1f319;getAbsoluteFile()和getPath()&#x1f319;getName()和lastModified() ⭐文件的创建和删除⭐获取并遍历 …

电脑操作系统有哪些?一文了解全部!

在当今数字化飞速发展的时代&#xff0c;电脑操作系统作为计算机硬件与软件之间的桥梁&#xff0c;扮演着至关重要的角色。它不仅管理着计算机的各项资源&#xff0c;还为用户提供了一个直观、友好的界面&#xff0c;使得用户可以轻松地进行各种操作和任务。那么&#xff0c;电…

【八股系列】介绍React高阶组件,适用于什么场景?

文章目录 1. HOC的工作原理2. 返回的新组件3. 适用场景4. 注意事项5. 示例代码 React高阶组件&#xff08; Higher-Order Components&#xff0c;简称HOC&#xff09;是 React中一种高级的 复用组件逻辑的技术。 HOC自身不是 React API的一部分&#xff0c;而是基于 Reac…

Zyxel NAS设备 setCookie 未授权命令注入漏洞复现(CVE-2024-29973)

0x01 产品简介 Zyxel-NAS 是指由 Zyxel Communications Corporation(合勤科技股份有限公司)开发和生产的网络附加存储(Network Attached Storage,简称 NAS)设备。NAS 是一种专门用于存储和共享文件的设备,它通过网络连接到计算机、服务器或其他设备,提供集中式的文件存…

linux最大线程数限制及打开最大文件数

1.root用户下执行 ulimit -a 然后查看 max user processes 这个值通常是系统最大线程数的一半 max user processes&#xff1a;当前用户同时打开的进程(包括线程)的最大个数为 2.普通用户下 ulimit -a 出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.co…

范式(下)-BC范式(BCNF)、关系模式的规范化

一、关系模式STC 假设有一个关系模式STC&#xff0c;包含有学号Sno、教师编号Tno、课程编号Cno、选课成绩G四个属性 即STC(Sno&#xff0c;Tno&#xff0c;Cno&#xff0c;G) 数据间的关系为 每个学生可选修多门课程&#xff0c;每门课程可以被多名学生选修每个老师只能讲授…

虹科免拆诊断案例 | 15款马自达3偶发高速CAN网络故障

CAN总线大家都不陌生&#xff0c;遇到这类故障&#xff0c;我们第一反应可能是用万用表测一下电压&#xff0c;看看存不存在短路、断路等问题。不过&#xff0c;使用万用表测得的电压值只是CAN总线上的平均电压&#xff0c;是一个大概的数值&#xff0c;并不能反映真实的CAN总线…

用户组相关的一些命令

1./etc/passwd>列出了系统里的所有用户 2./etc/shadow>保存了用户的密码信息 空表示密码为空 *表示账号被在锁定 !表示未设置密码 !!表示这个密码已经过期 $1表示MD5加密&#xff0c; $2表示用Blowfish加密&#xff0c; $5表示用SHA-256加密&#xff0c; $6表示SHA-512加…

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…

FANUC喷涂机器人P-350iA电机过热维修解决方案

发那科喷涂机器人作为自动化喷涂生产线的重要组成部分&#xff0c;其性能稳定性和可靠性对于生产效率和产品质量具有重要影响。然而&#xff0c;在实际使用过程中&#xff0c;FANUC喷涂机器人P-350iA电机过热故障问题往往成为影响其正常运行的主要因素之一。 FANUC机器人M-100…