Qt Creator 通过python解释器调用*.py

全是看了大佬们的帖子,结合chatGPT才揉出来。在此做个记录。

  1. 安装python
  2. 在Qt Creator *.pro 文件中配置好环境
  3. 来个简单的example.py
  4. 调用代码
  5. 安装pip
  6. 添加opencv等库
  7. 调用包含了opencv库的py代码
  8. 成功

*.pro配置:

INCLUDEPATH += C:\Users\xuanm\AppData\Local\Programs\Python\Python312\include
LIBS      += -LC:\Users\xuanm\AppData\Local\Programs\Python\Python312\libs  -lpython312

example.py源码:

# example.py
def add(a, b):return a + b

Qt Creator里面调用example.py的C++函数:


int MainWindow::testPy()
{const wchar_t * pythonHome = L"C:/Users/xuanm/AppData/Local/Programs/Python/Python312";Py_SetPythonHome(pythonHome);// 初始化 Python 解释器Py_Initialize();// 添加目录到 Python 模块搜索路径PyObject* sysPath = PySys_GetObject("path");PyObject* pPath = PyUnicode_FromString("C:/temp");PyList_Append(sysPath, pPath);Py_DECREF(pPath);  // 释放引用// 导入 Python 脚本PyObject* pModule = PyImport_ImportModule("example");if (!pModule) {PyErr_Print();std::cerr << "Failed to load module." << std::endl;return 1;}// 获取函数对象PyObject* pFunc = PyObject_GetAttrString(pModule, "add");if (!pFunc || !PyCallable_Check(pFunc)) {PyErr_Print();std::cerr << "Failed to get function." << std::endl;return 1;}// 准备参数PyObject* pArgs = PyTuple_Pack(2, PyLong_FromLong(5), PyLong_FromLong(3));// 调用函数PyObject* pValue = PyObject_CallObject(pFunc, pArgs);if (pValue) {// 打印结果std::cout << "Result: " << PyLong_AsLong(pValue) << std::endl;Py_DECREF(pValue);} else {PyErr_Print();std::cerr << "Function call failed." << std::endl;}// 清理Py_XDECREF(pFunc);Py_XDECREF(pModule);Py_XDECREF(pArgs);// 结束 Python 解释器Py_Finalize();
}

含opencv库的*.py:

#-*- coding: utf-8 -*-import os.path
import copy
import cv2
import numpy as np# 椒盐噪声
def SaltAndPepper(src, percetage):SP_NoiseImg = src.copy()SP_NoiseNum = int(percetage * src.shape[0] * src.shape[1])for i in range(SP_NoiseNum):randR = np.random.randint(0, src.shape[0] - 1)randG = np.random.randint(0, src.shape[1] - 1)randB = np.random.randint(0, 3)if np.random.randint(0, 1) == 0:SP_NoiseImg[randR, randG, randB] = 0else:SP_NoiseImg[randR, randG, randB] = 255return SP_NoiseImg# 高斯噪声
def addGaussianNoise(image, percetage):G_Noiseimg = image.copy()w = image.shape[1]h = image.shape[0]G_NoiseNum = int(percetage * image.shape[0] * image.shape[1])for i in range(G_NoiseNum):temp_x = np.random.randint(0, h)temp_y = np.random.randint(0, w)G_Noiseimg[temp_x][temp_y][np.random.randint(3)] = np.random.randn(1)[0]return G_Noiseimg# 昏暗
def darker(image, percetage=0.9):image_copy = image.copy()w = image.shape[1]h = image.shape[0]# get darkerfor xi in range(0, w):for xj in range(0, h):image_copy[xj, xi, 0] = int(image[xj, xi, 0] * percetage)image_copy[xj, xi, 1] = int(image[xj, xi, 1] * percetage)image_copy[xj, xi, 2] = int(image[xj, xi, 2] * percetage)return image_copy# 亮度
def brighter(image, percetage=1.5):image_copy = image.copy()w = image.shape[1]h = image.shape[0]# get brighterfor xi in range(0, w):for xj in range(0, h):image_copy[xj, xi, 0] = np.clip(int(image[xj, xi, 0] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 1] = np.clip(int(image[xj, xi, 1] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 2] = np.clip(int(image[xj, xi, 2] * percetage), a_max=255, a_min=0)return image_copy# 旋转
def rotate(image, angle, center=None, scale=1.0):(h, w) = image.shape[:2]# If no rotation center is specified, the center of the image is set as the rotation centerif center is None:center = (w / 2, h / 2)m = cv2.getRotationMatrix2D(center, angle, scale)rotated = cv2.warpAffine(image, m, (w, h))return rotated# 翻转
def flip(image):flipped_image = np.fliplr(image)return flipped_imagedef work(file_dir):
# 图片文件夹路径for img_name in os.listdir(file_dir):img_path = file_dir + '\\' + img_nameimg = cv2.imread(img_path)# cv2.imshow("1",img)# cv2.waitKey(5000)# 旋转rotated_90 = rotate(img, 90)cv2.imwrite(file_dir +'\\'+ img_name[0:-4] + '_r90.jpg', rotated_90)# rotated_180 = rotate(img, 180)# cv2.imwrite(file_dir +'\\'+ img_name[0:-4] + '_r180.jpg', rotated_180)# for img_name in os.listdir(file_dir):#     img_path = file_dir + img_name#     img = cv2.imread(img_path)#     镜像#     flipped_img = flip(img)#     cv2.imwrite(file_dir +'\\' + img_name[0:-4] + '_fli.jpg', flipped_img)## # 增加噪声# img_salt = SaltAndPepper(img, 0.3)#   cv2.imwrite(file_dir + '\\' + img_name[0:-4] + '_salt.jpg', img_salt)#  img_gauss = addGaussianNoise(img, 0.3)#  cv2.imwrite(file_dir +'\\' +  img_name[0:-4] + '_noise.jpg', img_gauss)## # 变亮、变暗# img_darker = darker(img)# cv2.imwrite(file_dir +'\\' + img_name[0:-4] + '_darker.jpg', img_darker)# img_brighter = brighter(img)# cv2.imwrite(file_dir + '\\' + img_name[0:-4] + '_brighter.jpg', img_brighter)## blur = cv2.GaussianBlur(img, (7, 7), 1.5)# #      cv2.GaussianBlur(图像,卷积核,标准差)# cv2.imwrite(file_dir + img_name[0:-4] + '_blur.jpg', blur)

调用含opencv库的*.py C++函数:


int MainWindow::testYBZQ()
{const wchar_t * pythonHome = L"C:/Users/xuanm/AppData/Local/Programs/Python/Python312";Py_SetPythonHome(pythonHome);// 初始化 Python 解释器Py_Initialize();// 添加目录到 Python 模块搜索路径PyObject* sysPath = PySys_GetObject("path");PyObject* pPath = PyUnicode_FromString("C:/temp");PyList_Append(sysPath, pPath);Py_DECREF(pPath);  // 释放引用// 添加标准库路径PyObject* stdLibPath = PyUnicode_FromString("C:/Users/xuanm/AppData/Local/Programs/Python/Python312/libs");PyList_Append(sysPath, stdLibPath);Py_DECREF(stdLibPath);// 添加 site-packages 路径PyObject* sitePackagesPath = PyUnicode_FromString("C:/Users/xuanm/AppData/Local/Programs/Python/Python312/Lib/site-packages");PyList_Append(sysPath, sitePackagesPath);Py_DECREF(sitePackagesPath);// 导入 Python 脚本PyObject* pModule = PyImport_ImportModule("data_augmentation");if (!pModule) {PyErr_Print();std::cerr << "Failed to load module." << std::endl;return 1;}// 获取函数对象PyObject* pFunc = PyObject_GetAttrString(pModule, "work");if (!pFunc || !PyCallable_Check(pFunc)) {PyErr_Print();std::cerr << "Failed to get function." << std::endl;return 1;}// 准备参数std::string strParam = "C:/temp/sar_sample";PyObject* pStrParam = PyUnicode_FromString(strParam.c_str());PyObject* pArgs = PyTuple_Pack(1, pStrParam);// 调用函数PyObject* pValue = PyObject_CallObject(pFunc, pArgs);if (pValue) {// 打印结果std::cout << "Result: " << PyLong_AsLong(pValue) << std::endl;Py_DECREF(pValue);} else {PyErr_Print();std::cerr << "Function call failed." << std::endl;}// 清理Py_XDECREF(pFunc);Py_XDECREF(pModule);Py_XDECREF(pArgs);// 结束 Python 解释器Py_Finalize();
}

程序运行出了正确结果,报错:

Result: -1
TypeError: 'NoneType' object cannot be interpreted as an integer

再次感谢各位大佬的帖子,谢谢。

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

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

相关文章

操作系统中的并发控制——使用条件变量同步

本期主题&#xff1a; 操作系统中的并发控制&#xff0c;条件变量 往期链接&#xff1a; linux设备驱动中的并发操作系统中的多线程问题——原子操作、自旋锁的底层实现操作系统并发控制——使用互斥锁实现同步 操作系统并发控制之条件变量同步 1. 问题描述2. 条件变量的API讲…

云栖实录 | Hologres3.0全新升级:一体化实时湖仓平台

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 姜伟华 | 阿里云智能集团资深技术专家、Hologres 负责人 丁 烨 | 阿里云智能集团产品专家、Hologres 产品负责人 活动&#xff1a; 2024 云栖大会 - 商用大数据计算与分析平台论…

Python中的数据可视化:从入门到进阶

数据可视化是数据分析和科学计算中的重要环节&#xff0c;它通过图形化的方式呈现数据&#xff0c;使复杂的统计信息变得直观易懂。Python提供了多种强大的库来支持数据可视化&#xff0c;如Matplotlib、Seaborn、Plotly等。本文将从基础到进阶&#xff0c;详细介绍如何使用这些…

[单master节点k8s部署]31.ceph分布式存储(二)

Ceph配置 Ceph集群通常是一个独立的存储集群&#xff0c;可以部署在 Kubernetes 集群之外。Ceph 提供分布式存储服务&#xff0c;能够通过 RADOS、CephFS、RBD&#xff08;块存储&#xff09;、和 RGW&#xff08;对象存储&#xff09;等方式与 Kubernetes 集成。即使 Ceph 部…

基于深度学习的手势控制模型

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 1. 项目简…

Nexpose 6.6.271 发布下载,新增功能概览

Nexpose 6.6.271 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 26, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.or…

安全工具 | 搭建带有 Web 仪表板的Interact.sh

介绍 Interactsh 是一个用于检测带外交互的开源工具。它是一种旨在检测导致外部交互的漏洞的工具。本文将主要介绍在子域上设置私有 Interact.sh 服务器以及部署其 Web 应用程序。只需一个 AWS EC2 或 VPS 实例和一个域。 要求 •具有静态IP的AWS EC2 / VPS •拥有自己的域…

实例讲解电动汽车VIN写入规则及Simulink建模方法(三)——VIN设置状态反馈及Simulink建模方法

目录 一、整车VIN设置状态反馈规则 二、整车VIN设置状态反馈设置策略 1、VIN设置状态判定 2、VIN设置状态反馈发送 三、整车VIN设置状态反馈Simulink建模 1、VIN设置状态判定 2、VIN设置状态反馈发送 3、整车VIN设置状态反馈设置完整Simulink模型 四、总结 一、整车VI…

Node.js入门——fs、path模块、URL端口号、模块化导入导出、包、npm软件包管理器

Node.js入门 1.介绍 定义&#xff1a;跨平台的JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序作用&#xff1a;使用Node.Js编写服务器端代码Node.js是基于Chrome V8引擎进行封装&#xff0c;Node中没有BOM和DOM 2.fs模块-读写文件 定义&#xff1a;封装了与…

WIFI网速不够是不是光猫的“路由模式”和“桥接模式”配置错了?

光猫&#xff08;光纤调制解调器&#xff09;是一种用于将光纤信号转换为数字信号的设备&#xff0c;通常用于家庭或企业网络中。光猫可以在不同的工作模式下运行&#xff0c;其中最常见的两种模式是“路由模式”和“桥接模式”。以下是这两种模式的详细解释及其优缺点。 一、路…

python发邮件附件:配置SMTP服务器与认证?

python发邮件附件技巧&#xff1f;Python发送多附件邮件的方法&#xff1f; Python作为一种强大的编程语言&#xff0c;提供了丰富的库和工具来实现这一功能。AokSend将深入探讨如何使用Python发邮件附件&#xff0c;并详细介绍配置SMTP服务器与认证的关键步骤。 python发邮件…

通过阿里云Milvus与PAI搭建高效的检索增强对话系统

阿里云Milvus现已无缝集成于阿里云PAI平台&#xff0c;一站式赋能用户构建高性能的RAG&#xff08;Retrieval-Augmented Generation&#xff09;对话系统。您可以利用Milvus作为向量数据的实时存储与检索核心&#xff0c;高效结合PAI和LangChain技术栈&#xff0c;实现从理论到…

第69期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

react 知识点汇总(非常全面)

React 是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开发并维护。它的核心理念是“组件化”&#xff0c;即将用户界面拆分为可重用的组件。 React 的组件通常使用 JSX&#xff08;JavaScript XML&#xff09;。JSX 是一种 JavaScript 语法扩展&#xff0c;…

HCIP——GRE和MGRE

目录 VPN GRE GRE环境的搭建 GRE的报文结构 GRE封装和解封装报文的过程 GRE配置​编辑 R1 R2 GRE实验​​​​​​​​编辑 MGRE 原理 MGRE的配置 R1 R2 R3 R4 查看映射表 抓包 MGRE环境下的RIP网络 综合练习​编辑 VPN 说到GRE&#xff0c;我们先来说个大…

Http 协议和 RPC 协议有什么区别?

Http 协议和 RPC 协议有什么区别&#xff1f; 三个层面来述说&#xff1a; 从功能特性来说&#xff1a; HTTP是一个属于应用层的超文本传输协议&#xff0c;是万维网数据通信的基础&#xff0c;主要服务在网页端和服务端的数据传输上。 RPC是一个远程过程调用协议&#xff0…

AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案

随着信息技术的飞速发展和智能制造的深入推进&#xff0c;火电制造行业作为国民经济的重要组成部分&#xff0c;正面临着智能化转型的迫切需求。为了提升生产效率、保障设备安全、优化管理流程&#xff0c;火电制造企业迫切需要引入先进的视频监控与人工智能技术。EasyCVR安防监…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下&#xff0c;注意&#xff1a;AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频&#xff0c;一期视频将常用配置和用法梳理清楚&#xff0…

【Mybatis篇】Mybatis的注解开发

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】&#xff0c;【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af; Select注解 …