win10 C++调用conda的python

news2024/10/3 6:38:00

普通

比如说是conda的DL环境,路径是D:\Miniconda3\envs\DL

VC++目录->包含目录里加入D:\Miniconda3\envs\DL\include
在这里插入图片描述
VC++目录->库目录里加入D:\Miniconda3\envs\DL\libs
在这里插入图片描述
链接器->输入->附加依赖项里加入D:\Miniconda3\envs\DL\libs\python37.lib
在这里插入图片描述

在libs底下,将python37.lib复制一份改成python37_d.lib
在这里插入图片描述
将python37.dll复制到exe所在路径里
python37.dll一般跟python在一块
exe一般在cpp的上一级的x64里,如果需要debug,就复制到debug里,如果哟啊release,就复制到release里
在这里插入图片描述
在这里插入图片描述
创建一个python_script
在这里插入图片描述
python_script/main.py

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import os


def func():
    print('hello world')


if __name__ == '__main__':
    func()

main.cpp

Py_SetPythonHome里是python路径
sys.path.append(‘python_script’)是用来找python文件的

#include <Python.h>
#include <iostream>
#include <string>

int main() {
	Py_SetPythonHome(L"D:\\Miniconda3\\envs\\DL");
	Py_Initialize();
	if (0 == Py_IsInitialized()) {
		std::cout << "python init fail" << std::endl;
		return -1;
	}
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('python_script')");
	//相当于import
	PyObject* pModule = PyImport_ImportModule("main");
	if (NULL == pModule) {
		std::cout << "module not found" << std::endl;
		return -1;
	}

	PyObject* pFunc = PyObject_GetAttrString(pModule, "func");
	if (NULL == pFunc || 0 == PyCallable_Check(pFunc)) {
		std::cout << "not found function func" << std::endl;
		return -1;
	}


	PyObject_CallObject(pFunc, NULL);
	Py_Finalize();
	return 0;
}

opencv+numpy+pytorch

我这里,只成功了release模式,debug模式搞不定
然后imgaug这个库也加载不了= =
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

main.cpp

load_model
加载模型

get_predict_xy
用C++的opencv读图片,转numpy传入python
python再用pytorch预测,返回一个numpy

simple_test
用C++的opencv读图片,转numpy传入python
python直接传回来给C++,转opencv

顺带提一下,import_array()一定要写

#include <Python.h>
#include <iostream>
#include <string>
#include <numpy/arrayobject.h>
#include <opencv2/opencv.hpp>

size_t init_numpy() {
	import_array();
	return 1;
}

void load_model(PyObject* pModule, const std::string& model_path) {
	PyObject* init_model = PyObject_GetAttrString(pModule, "init_model");
	if (NULL == init_model || 0 == PyCallable_Check(init_model)) {
		std::cout << "not found function init_model" << std::endl;
		exit(-1);
	}
	PyObject* pArgs = PyTuple_New(1);
	PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", model_path.c_str()));

	PyObject* result = PyObject_CallObject(init_model, pArgs);
	if (NULL == result) {
		std::cout << "init_model failed" << std::endl;
		exit(-1);
	}
	int return_value = -1;
	PyArg_Parse(result, "i", &return_value);
	std::cout << "returned " << return_value << std::endl;
}

void get_predict_xy(PyObject* pModule, const std::string& img_path) {
	cv::Mat img = cv::imread(img_path, 0);
	PyObject* predict = PyObject_GetAttrString(pModule, "get_predict_xy");
	if (NULL == predict || 0 == PyCallable_Check(predict)) {
		std::cout << "not found function get_predict_xy" << std::endl;
		exit(-1);
	}
	npy_intp dims[] = { img.rows, img.cols };
	PyObject* pValue = PyArray_SimpleNewFromData(2, dims, NPY_UINT8, img.data);
	PyObject* pArgs = PyTuple_New(1);
	// PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", img_path.c_str()));
	PyTuple_SetItem(pArgs, 0, pValue);

	PyObject* result = PyEval_CallObject(predict, pArgs);
	if (NULL == result) {
		std::cout << "get_predict_xy failed" << std::endl;
		exit(-1);
	}
	if (!PyArray_Check(result)) {//None
		std::cout << "didn't return numpy" << std::endl;
		exit(-1);
	}
	PyArrayObject* ret_array;
	PyArray_OutputConverter(result, &ret_array);
	if (2 != PyArray_NDIM(ret_array)) {
		exit(-1);
	}
	npy_intp* shape = PyArray_SHAPE(ret_array);
	int n = shape[0];
	int m = shape[1];
	cv::Mat return_key_points(n, m, CV_32F, PyArray_DATA(ret_array));
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			int* cur = reinterpret_cast<int*>(PyArray_GETPTR2(ret_array, i, j));
			std::cout << *cur << ' ';

		}
		std::cout << std::endl;
	}

	//PyArray_GETPTR2
}


void simple_test(PyObject* pModule, const std::string& img_path) {
	cv::Mat img = cv::imread(img_path, 0);
	PyObject* predict = PyObject_GetAttrString(pModule, "simple_test");
	if (NULL == predict || 0 == PyCallable_Check(predict)) {
		std::cout << "not found function simple_test" << std::endl;
		exit(-1);
	}
	npy_intp dims[] = { img.rows, img.cols };
	PyObject* pValue = PyArray_SimpleNewFromData(2, dims, NPY_UINT8, img.data);
	PyObject* pArgs = PyTuple_New(1);
	// PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", img_path.c_str()));
	PyTuple_SetItem(pArgs, 0, pValue);

	PyObject* result = PyEval_CallObject(predict, pArgs);
	if (NULL == result) {
		std::cout << "simple_test failed" << std::endl;
		exit(-1);
	}
	if (!PyArray_Check(result)) {//None
		std::cout << "didn't return numpy" << std::endl;
		exit(-1);
	}
	PyArrayObject* ret_array;
	PyArray_OutputConverter(result, &ret_array);
	if (2 != PyArray_NDIM(ret_array)) {
		exit(-1);
	}
	npy_intp* shape = PyArray_SHAPE(ret_array);
	int n = shape[0];
	int m = shape[1];
	cv::Mat return_img(n, m, CV_8UC1, PyArray_DATA(ret_array));
	// cv::imshow("test", return_img);
	// cv::waitKey(0);
	// cv::destroyAllWindows();
	for (int i = 0; i < n; ++i) {
		uchar* data1 = img.ptr<uchar>(i);
		uchar* data2 = return_img.ptr<uchar>(i);
		for (int j = 0; j < m; ++j) {
			if (data1[j] != data2[j]) {
				std::cout << "not equal" << std::endl;
				return;
			}
		}
	}
	std::cout << "equal" << std::endl;
}

int main() {
	Py_SetPythonHome(L"D:\\Miniconda3\\envs\\DL");
	Py_Initialize();
	if (0 == Py_IsInitialized()) {
		std::cout << "python init fail" << std::endl;
		return -1;
	}
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("import os");
	PyRun_SimpleString("print(os.path.abspath('./python_script'))");
	PyRun_SimpleString("sys.path.append('./python_script')");
	init_numpy();
	PyObject* pModule = PyImport_ImportModule("predict");
	if (NULL == pModule) {
		std::cout << "module not found" << std::endl;
		return -1;
	}
	simple_test(pModule, "python_script\\001.bmp");
	load_model(pModule, "python_script\\best.pth");
	get_predict_xy(pModule, "python_script\\001.bmp");
	get_predict_xy(pModule, "python_script\\001.bmp");
	Py_Finalize();
	return 0;
}

predict.py
UNet我没放出来

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import os
import numpy as np

from model.u2net import UNet
import torch
from cv2 import cv2
import imgaug.augmenters as iaa

model = UNet(in_channels=1, out_channels=19)
device = torch.device('cuda:0')
augmentation = iaa.Sequential([
    iaa.Resize({"width": 416, "height": 512})
])


def init_model(path):
    global model, device
    if not os.path.exists(path):
        print(f'not found {os.path.abspath(path)}')
        return -1
    model_state_dict = torch.load(path)
    model.load_state_dict(model_state_dict)
    model = model.to(device)
    return 0


def get_img_aug(img):
    global augmentation
    print('----get_img_aug------')
    print(img.shape)
    print('------------------')
    # img = cv2.imread(path, 0)  # 2490*1935
    img_aug = augmentation(image=img)
    img_aug = (img_aug - img_aug.min()) / (img_aug.max() - img_aug.min())
    img_aug = torch.FloatTensor(img_aug).unsqueeze(0).unsqueeze(0)  # torch.Size([1, 1, 512, 416])
    return img_aug


def get_heatmap_coordination_batch_numpy(heatmap):
    """
    get heatmap coordination by batch

    :param heatmap: (B,C,H,W) or (B,C,H,W,D) (C is the num of landmark)
    :return: coordination (B,C,2) or (B,C,3)
    """
    origin_shape = heatmap.shape
    heatmap = heatmap.reshape(*origin_shape[:2], -1)
    temp = np.argmax(heatmap, axis=-1)[..., np.newaxis]

    # unravel_index
    out = []
    for dim in reversed(origin_shape[2:]):
        out.append(temp % dim)
        temp = np.floor_divide(temp, dim)
    out = np.concatenate(out[::-1], axis=-1)
    return out


def get_predict_xy(img):
    global model
    # if not os.path.exists(path):
    #     return None
    img = get_img_aug(img).to(device)# 1 * 1 * 512 * 416
    output = model(img)['output'].to('cpu').detach().numpy() # 1 * 1 * 19 * 2
    predict_xy = get_heatmap_coordination_batch_numpy(output).squeeze(0)  # 19 * 2
    print(predict_xy)
    return predict_xy

def simple_test(img):
    return img

if __name__ == '__main__':
    path = '/mnt/data/datasets/landmark/ISBI2015_ceph/raw/001.bmp'
    init_model('best.pth')
    print('finish_init')
    print(get_predict_xy(path).shape)
    print(get_predict_xy(path).dtype)

https://zhuanlan.zhihu.com/p/377640206

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

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

相关文章

“ 寻友之旅 “ 的三种解决办法

题目来源于&#xff1a;稀土掘金 " 寻友之旅 " 的三种解决办法&#xff01; 本文将分别讲解如何使用BFS、双向BFS以及 Dijsktra堆优化的方法来解决此题~ 一起来看看吧&#xff01; 附Java题解代码&#xff01; 文章目录" 寻友之旅 " 的三种解决办法&#…

如何将两个或多个PDF文件合并成一个?这3个方法可以看看

在工作中&#xff0c;有时候我们需要把两个或多个PDF文件合并成一个&#xff0c;这样一来&#xff0c;可以方便阅读、修改&#xff0c;还能快速打印文件。 下面分享3个工具&#xff0c;看看如何将两个或多个PDF文件合并成一个文件。 方法一&#xff1a;使用美图工具 如果PDF文…

【Spring AOP】如何统一“拦截器校验、数据格式返回、异常返回”处理?

目录 一、Spring 拦截器 1.1、背景 1.2、实现步骤 1.3、拦截原理 二、 统一url前缀路径 2.1、方法一&#xff1a;在系统的配置文件中设置 2.2、方法二&#xff1a;在 application.properies 中配置 三、统一异常处理 四、统一返回数据返回格式处理 4.1、背景 4.2、…

PTA:L1-025 正整数A+B、L1-026 I Love GPLT、L1-027 出租(C++)

目录 L1-025 正整数AB 问题描述&#xff1a; 实现代码&#xff1a; L1-026 I Love GPLT 问题描述&#xff1a; 实现代码&#xff1a; L1-027 出租 问题描述&#xff1a; 实现代码&#xff1a; 原理思路&#xff1a; 出租那道题有点意思哈 L1-025 正整数AB 问题描述…

【Java学习笔记】13.Java StringBuffer 和 StringBuilder 类

Java StringBuffer 和 StringBuilder 类 当对字符串进行修改的时候&#xff0c;需要使用 StringBuffer 和 StringBuilder 类。 和 String 类不同的是&#xff0c;StringBuffer 和 StringBuilder 类的对象能够被多次的修改&#xff0c;并且不产生新的未使用对象。 在使用 St…

Tomcat8安装

1、前置环境 Tomcat 8 对应jdk 1.8 版本&#xff1b;如果你的jdk版本是8以上&#xff0c;则安装对应的tomcat版本。 jdk8 官方下载安装时&#xff0c;先安装jdk版本&#xff0c;最后单独安装jre。所以电脑会有两套jre&#xff0c;一套是jdk中的jre&#xff0c;位于 \jre 目录下…

客户案例|三强联手,深度集成,实现四方共赢

关键发现&#xff1a; 用户痛点&#xff1a;以现有ERP系统台账表单模式管理设备&#xff0c;已经不能满足伯恩业务增长所需的设备管理优化与革新的要求。 解决方案&#xff1a;利用西门子Mendix低代码平台与SAP PM模块进行集成开发的联合解决方案&#xff0c;为实现客户设备资…

3.8 并查集

并查集 题目链接 用途 维护集合 将两个集合合并询问两个元素是否在一个集合当中 实现思路 用树的形式维护集合每个集合用一棵树表示&#xff0c;树根的编号就是整个集合的编号&#xff0c;每个节点存储他的父节点&#xff0c;p[x]表示节点x的父节点判断树根的方法:p[x]x求…

运维视角:rabbitmq教程(三)镜像集群

上期回顾 RabbitMQ集群中节点包括内存节点、磁盘节点。内存节点就是将所有数据放在内存&#xff0c;磁盘节点将数据放在磁盘上。如果在投递消息时&#xff0c;打开了消息的持久化&#xff0c;那么即使是内存节点&#xff0c;数据还是安全的放在磁盘。那么内存节点的性能只能体现…

如何编写BI项目之ETL文档

XXXXBI项目之ETL文档 xxx项目组 ------------------------------------------------1---------------------------------------------------------------------- 目录 一 、ETL之概述 1、ETL是数据仓库建构/应用中的核心…

Linux基础命令-kill向进程发送信号

Linux基础命令-setfacl设置文件ACL策略规则 Kill 一.命令介绍 先使用帮助文档查看命令的信息 NAME kill - terminate a process kill命令的主要功能就是向进程发送信号&#xff0c;这里我们主要用来终止结束进程的&#xff0c;与它的英文单词含义相同&#xff0c;在Linux系统…

matlab在管理学中的应用简matlab基础【三】

规划论及MATLAB计算 1、线性规划 问题的提出 例1. 某工厂在计划期内要安排甲、乙两种产品的生产&#xff0c;已知生产单位产品所需的资源A、B、C的消耗以及资源的计划期供给量&#xff0c;如下表&#xff1a; 问题&#xff1a;工厂应分别生产多少单位甲、乙产品才能使工厂获…

相亲交友直播APP源码

一、什么是亲交友直播APP源码&#xff1f; 亲交友直播APP源码是一款婚恋交友类型的APP&#xff0c;可以帮助单身男女在网络平台就可以进行相亲交友。APP源码分两端&#xff0c;一端是用户端&#xff0c;另外一端是后台端。采用的技术&#xff0c;前端是安卓IOS&#xff0c;后端…

SCI期刊写作必备(二):代码|手把手绘制目标检测领域YOLO论文常见的性能对比折线图,一键生成YOLOv7等主流论文同款图表,包含多种不同功能风格对比图表

绘制一个原创属于自己的YOLO模型性能对比图表 具体绘制操作参考:(附Python代码,直接一键生成,精度对比图表代码 ) 只需要改动为自己的mAP、Params、FPS、GFlops等数值即可,一键生成 多种图表风格📈,可以按需挑选 文章目录 绘制一个原创属于自己的YOLO模型性能对比图…

二、HTTP协议02

文章目录一、HTTP状态管理Cookie和Session二、HTTP协议之身份认证三、HTTP长连接与短连接四、HTTP中介之代理五、HTTP中介之网关六、HTTP之内容协商七、断点续传和多线程下载一、HTTP状态管理Cookie和Session HTTP的缺陷无状态。Cookie和Session就用来弥补这个缺陷的。 Cooki…

Kafka 位移主题

Kafka 位移主题位移格式创建位移提交位移删除位移Kafka 的内部主题 (Internal Topic) : __consumer_offsets (位移主题&#xff0c;Offsets Topic) 老 Consumer 会将位移消息提交到 ZK 中保存 当 Consumer 重启后&#xff0c;能自动从 ZK 中读取位移数据&#xff0c;继续消费…

Kafka和RabbitMQ有哪些区别,各自适合什么场景?

目录标题1. 消息的顺序2. 消息的匹配3. 消息的超时4. 消息的保持5. 消息的错误处理6. 消息的吞吐量总结1. 消息的顺序 有这样一个需求&#xff1a;当订单状态变化的时候&#xff0c;把订单状态变化的消息发送给所有关心订单变化的系统。 订单会有创建成功、待付款、已支付、已…

C++面向对象编程之三:初始化列表、类对象作为类成员、静态成员

初始化列表C提供了初始化列表语法&#xff0c;可以用于成员属性初始化。语法规则&#xff1a;无参构造函数():属性1(值1), 属性2(值2), ... { }有参构造函数(形参1, 形参2, ...):属性1(形参1), 属性2(形参2), ... { }example&#xff1a;写一个怪物类&#xff0c;有怪物id和血量…

【产品设计】ToB 增删改查显算传

入职培训时技术leader说&#xff1a;“我不需要你们太聪明&#xff0c;做好基础的增删改查就可以了。”看似很简单的活&#xff0c;要做好并不容易。基础的坑在哪里呢&#xff1f; 一、 增&#xff08;新增、创建、导入&#xff09; 1. 明确表字段类型 新增的业务是由不同类型…

Android Studio开发APP

1.下载Android Studio 官网下载:Android Studio for Window ... 百度云下载:android-studio-bundle-141.1903250-windows.exe Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用…