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

devtools/2024/10/19 9:41:27/

一. 背景

  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/devtools/53456.html

相关文章

SpringBoot的入门案例

1、创建一个Maven工程 2、点击设置自动导入jar包 3、导入spring boot需要的依赖 打开sping boot的文档 导入依赖的pom.xml配置内容 4、创建一个spring boot的执行入口程序 5、写controller&#xff0c;service&#xff0c;dao的页面逻辑代码 6、测试&#xff0c;运行工程&#…

计算机网络模型

计算机网络模型是用来描述数据在网络中传输过程的层次结构模型&#xff0c;最著名的两个模型是OSI七层模型和TCP/IP四层模型。 ### OSI七层模型 OSI&#xff08;Open Systems Interconnection&#xff09;七层模型是国际标准化组织&#xff08;ISO&#xff09;提出的一个概念…

c#中上传超过30mb的文件,接口一直报404,小于30mb的却可以上传成功

在一次前端实现上传视频文件时,超过30mb的文件上传,访问接口一直报404,但是在Swagger中直接访问接口确是正常的,且在后端控制器中添加了限制特性,如下 但是却仍然报404,在apifox中请求接口也是报404, 网上说: 在ASP.NET Core中,配置请求过来的文件上传的大小限制通常…

使用Xshell连接eNSP

在ensp里面找到要连接的设备&#xff0c;比如AR1,右键设置&#xff0c;查看配置里面的串口号&#xff1a; 记下这个端口号&#xff0c;进入Xshell&#xff0c;新建会话 连接后会出现几个问题&#xff1a; ● dis命令后&#xff0c;如果显示内容比较多&#xff0c;那么按空格键发…

Prometheus常见exporter安装部署

Prometheus常见exporter安装部署 在稳定性环境的监控当中需要收集各种各样的数据&#xff0c;这样的数据收集是通过各种exporter进行的&#xff0c;在这里我们进行最常用稳定性数据的收集exporter安装部署介绍。 node_exporter安装部署 node_exporter主要监控服务器本身的一…

【通信协议-RTCM】固定天线参考点信息 ---- 对应RTCM十六进制编码ID(3ED 3EE)

1. 1005型信息的内容-固定天线参考点&#xff0c;无高度信息 DATA FIELDDF NUMBERDATA TYPENO. OF BITS Message Number(e.g.,“1005” 0011 1110 1101) - 消息编号 DF002 uint12 12 Reference Station ID - 参考值ID DF003 uint12 12 Reserved for ITRF Realization Year - 保…

Python 数据可视化 散点图

Python 数据可视化 散点图 import matplotlib.pyplot as plt import numpy as npdef plot_scatter(ref_info_dict, test_info_dict):# 绘制散点图&#xff0c;ref横&#xff0c;test纵plt.figure(figsize(80, 48))n 0# scatter_header_list [peak_insert_size, median_insert…

C语言中的共用体union关键字

一、简介 在C语言中&#xff0c;union关键字用于定义一种特殊的数据结构&#xff0c;称为共用体&#xff08;Union&#xff09;或联合体。共用体允许您在相同的内存位置存储不同数据类型的变量。这意味着在任何给定时间&#xff0c;共用体变量中只有一个成员真正存储着有效的数…