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

embedded/2024/10/9 15:22:04/

一. 背景

  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

python">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

python">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.ppmy.cn/embedded/51191.html

相关文章

Kimichat使用案例018:一键总结网页内容(浏览器插件Kimi Copilot)

文章目录 一、介绍二、安装三、使用 一、介绍 在阅读网页的时候&#xff0c;如果需要总结网页内容要点&#xff0c;可以把链接丢进Kimichat&#xff0c;让它总结。但是&#xff0c;这样稍微有些麻烦。Chrome浏览器现在已经有一个非官方的Kimichat插件&#xff1a;Kimi Copilot…

什么是熵、熵增是什么?

目录 一、熵的定义1. 热力学中的熵2. 信息论中的熵 二、熵增三、生活中的熵增示例四、总结 一、熵的定义 1. 热力学中的熵 熵&#xff08;entropy&#xff09;&#xff0c;在热力学中&#xff0c;熵是描述系统混乱程度或无序程度的物理量。它反映了系统在微观上可访问的状态数…

PHP题目

一.编写函数change($str)实现字符串转换功能&#xff0c;例如“str_replace”转换成“str%replace”、“arr_var”转换成“arr%var”。 <?php function change($str){$astr_replace(_,%,$str);return $a; } echo change(str_replace); ?> 运行结果&#xff1a; 二.通…

设备日志采集工具 1.1.0.2 发布

永久免费: Gitee下载 最新版本 使用说明: Moretl 企业级采集文件工具 主要更新内容 进一步提升工程师在设备上部署采集日志客户端效率. 浏览器打开根Url,自动跳转到部署页面.(之前工程师需要输入很长的部署页面Url);新增复制同类客户端同步任务功能.(同类设备采集同样的日志…

4.XSS-反射型(get)利用:获取cookie

GET反射型XSS利用&#xff1a;获取cookie 修改一下配置文件\pikachu\pkxss\xcookie\cookie.php 我这里将对应的IP地址修改为本地pikachu的主站IP地址&#xff0c;这样给用户造成一种正常视觉上的欺骗&#xff0c;容易上当。重定向到pikachu主页面 基于IP搭建的pkxss平台(入侵…

2021数学建模A题目–“FAST”主动反射面的形状调节

A 题——“FAST”主动反射面的形状调节 思路&#xff1a;该题主要是通过利用伸缩杆调整FAST反射面&#xff0c;给出合适的调整方案 程序获取 第一题问题思路与结果&#xff1a; 当待观测天体S位于基准球面正上方&#xff0c;结合考虑反射面板调节因素&#xff0c;确定理想抛物…

HBase 中设计 RowKey

HBase 中设计 RowKey 在 HBase 中设计 RowKey 是非常重要的&#xff0c;它直接影响着数据的存储和检索效率。下面是一些设计 RowKey 的原则&#xff1a; 1. 唯一性&#xff08;Uniqueness&#xff09;&#xff1a;RowKey 必须是唯一的&#xff0c;因为在 HBase 中&#xff0c;数…

微信小程序中实现将数据库返回的数据对象res.data赋值给两个变量,并且这两个变量互不影响,改变一个变量中对象值的同时不影响另一个变量

背景 今天在做功能需求的时候&#xff0c;遇到一个问题&#xff0c;就是想把获取到数据库的数据res.data&#xff08;res.data是对象&#xff09;&#xff0c;赋值给两个不同&#xff08;包括值和地址&#xff09;的变量action1和action2&#xff0c;其中一个变量需要将res.da…