win10 mingw 调用python

news2025/1/24 7:15:10

ubuntu调用pythonhttps://blog.csdn.net/qq_39942341/article/details/129333969

我这里mingw是用msys2的
opencv也是msys2装的
安装msys2和opencv可以参考这个https://blog.csdn.net/qq_39942341/article/details/129380197?spm=1001.2014.3001.5502

环境变量里加入python路径,例如D:\Miniconda3\envs\DL

D:\Miniconda3\envs\DL\libs里,python37.lib复制一份改成python37_d.lib
在这里插入图片描述

有个玄学的问题,我用不了imgaug这个库

opencv+numpy+pytorch

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>

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;
    }
    import_array();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("import os");
    PyRun_SimpleString("print(os.path.abspath('.'))");
    PyRun_SimpleString("sys.path.append('../python_script')");

    //相当于import
    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 = cv2.resize(img, (416, 512), interpolation=cv2.INTER_LINEAR)
    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 = r'E:\PyCharmProject\pythonProject3\001.bmp'
    img = cv2.imread(path, 0)
    init_model('best.pth')
    print('finish_init')
    print(get_predict_xy(img).shape)
    print(get_predict_xy(img).dtype)

CMakeLists.txt

cmake_minimum_required(VERSION 3.24)
project(C_PLUS_PLUS VERSION 0.1.0)

IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE Release)
ENDIF()

set(CMAKE_CXX_STANDARD 17)
set(PYTHON_INCLUDE_DIRS "D:/Miniconda3/envs/DL/include/")
set(NUMPY_INCLUDE_DIR "D:/Miniconda3/envs/DL/Lib/site-packages/numpy/core/include")
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR})
link_directories("D:/Miniconda3/envs/DL/libs")
set(PYTHON_LIBRARIES "D:/Miniconda3/envs/DL/libs/python37.lib")
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${PYTHON_LIBRARIES})

# Where to find CMake modules and OpenCV
# set(OpenCV_DIR "D:\\opencv-4.5.5\\opencv-4.5.5\\build")
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV Include: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV LIBRARIES: ${OpenCV_LIBRARIES}")
message(STATUS "OpenCV Libs: ${OpenCV_LIBS}")

INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME}  ${OpenCV_LIBS})

在这里插入图片描述

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

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

相关文章

Spring的IOC/DI,依赖注入的实现

Spring的IOC/DI&#xff0c;依赖注入的实现 https://download.csdn.net/download/weixin_41957626/87546826 资源地址 1.什么是Spring 1.1spring3 的体系结构图 图1 spring3的体系结构图 图2 spring4体系结构图 比较spring3的体系结构图&#xff0c;spring4去掉了spring3中的st…

Pandas库:从入门到应用(一)

一、Pandas简介 pandas是 Python 的核⼼数据分析⽀持库&#xff0c;提供了快速、灵活、明确的数据结构&#xff0c;旨在简单、直观地处理关系型、标记型数据。pandas是Python进⾏数据分析的必备⾼级⼯具。 pandas的主要数据结构是 **Series(**⼀维数据)与 DataFrame (⼆维数据…

搭建Samba服务器

搭建Samba服务器 文章目录搭建Samba服务器samba安装安装命令配置-ubuntu侧为samba服务器创建一个共享目录share创建使用该共享文件夹的账号修改samba服务器配置文件重启samba服务windows创建映射1.点击映射网络驱动器2.输入Ubuntu中的ip地址及其用户信息3.输入用户信息及其密码…

笔记 - Java 内存结构与模型

-- Java里内存结构与内存模型是两种概念 一、Java内存结构&#xff1a; HeapMemory - 堆内存Java Stacks - 栈内存 &#xff08;运行时&#xff09;Method Area - 方法区Native Method Stack - 本地方法栈 真实和系统打交道的地方Jit Compiler - 将java运行指令编译成机器指令G…

特斯拉、小鹏开路,城市NOA距好用还有几年?

作者 | Marshall 编辑 | 张祥威一项新技术&#xff0c;狂热的技术开发者往往会高估其发展速度&#xff0c;认为当下偶尔发生的安全问题&#xff0c;会随着数据积累和功能迭代被逐渐解决。 他们往往会说&#xff0c;“这个问题没有包含在我们的场景库中&#xff0c;但现在我们知…

C++ | 详细介绍缺省参数的作用

文章目录一、前言1、缺省参数概念2、缺省参数的使用规则二、全缺省参数【备胎是如何使用的♿】1、四种实参传递方式说明2、疑难细究三、半缺省参数【⭐】1、错误用法示范2、正确用法示范&#x1f525;实参缺省与形参缺省的混合辨析&#x1f525;3、小结四、缺省参数的实际应用 …

XILINX AXI总线学习

AXI介绍什么是AXI&#xff1f;AXI&#xff08;高级可扩展接口&#xff09;&#xff0c;是ARM AMBA的一部分&#xff1b;AMBA:高级微控制器总线架构&#xff1b;是1996年首次引入的一组微控制器总线&#xff1b;开放的片内互联的总线标准&#xff0c;能在多主机设计中实现多个控…

电子台账:模板制作之五——二级过滤与多条件组合

1 前言工作中&#xff0c;经常会遇到很复杂的数据&#xff0c;比如内销产品和出口产品、正常产品和报废产品都混在一块儿。电子台账中&#xff0c;需要把这些数据都区分开&#xff0c;分别汇总。这种情况&#xff0c;可以用台账软件的二级过滤功能来处理&#xff0c;实际上就是…

QML Popup详解

1.简介 弹出式用户界面控件&#xff0c;它可以与Window或ApplicationWindow一起使用&#xff0c;默认不可见。 常用属性介绍&#xff0c;一些公用的基础属性就不作介绍&#xff0c;可以查看我前面写的文章。 closePolicy : enumeration &#xff1a;此属性决定弹出窗口关闭的…

【Java基础】HashMap的底层数据结构是怎样的?

HashMap就是以Key-Value的方式进行数据存储的一种数据结构。 HashMap在jdk1.7之前和jdk1.8之后的底层数据结构是不一样的。 在jdk1.7之前是数组链表的形式&#xff0c;并通过entry节点保存key和value值&#xff1b;当Hash冲突比较严重的时候&#xff0c;在数组上形成的链表就会…

【ArcGIS学习记录02】--利用DEM数据提取河网溪流

【ArcGIS学习记录02】–利用DEM数据提取河网溪流 注&#xff1a;本文仅作为自己的学习记录以备以后复习查阅 不得不说这读个研究生可太不容易了&#xff0c;啥都得会点&#xff0c;这也得学那也得学&#xff0c;我的脑容量快要不够了。。。。。 一 数据准备&#xff08;DEM数…

[数据结构]:14-选择排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 选择排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…

使用Ubuntu中的Docker部署Remix

一、简介1.博主这里使用的是腾讯云的服务&#xff0c;然后使用Docker进行部署Remix。2.踩了几个坑&#xff0c;没有花费过多时间&#xff0c;所以这篇文章会记录踩过的坑。然后避免你们掉进去&#xff0c;然后花费过多时间。3.这里就不写怎么安装Docker了&#xff0c;因为博主上…

UML学习备忘录

UML学习备忘录 UML 全称是 Unified Modeling Language&#xff08;统一建模语言&#xff09;&#xff0c;它以图形的方式来描述软件的概念。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。UML的本质就是为了交流。 UML的概念包括了UML语义&#xff08;Se…

前端ES5对象特性

ES5对象特性 对象和函数的原型 JS中每一个对象都有一个特殊的内置属性&#xff0c;这个特殊的对象可以指向其他的对象 我们通过引用对象的属性key来获取一个value时&#xff0c;它会触发 Get 的操作首先检查该对象是否有对应的属性&#xff0c;如果有的话就使用对象内的如果…

Pytorch中utils.data 与torchvision简介

Pytorch中utils.data 与torchvision简介1 数据处理工具概述2 utils.data简介3 torchvision简介3.1 transforms3.2 ImageFolder1 数据处理工具概述 Pytorch涉及数据处理&#xff08;数据装载、数据预处理、数据增强等&#xff09;主要工具包及相互关系如下图所示&#xff0c;主…

文献阅读(48)—— 长序列time-series预测【Informer】

文献阅读&#xff08;48&#xff09;—— 长序列time-series预测【Informer】 文章目录文献阅读&#xff08;48&#xff09;—— 长序列time-series预测【Informer】先验知识/知识拓展文章结构文章方法1. 文章核心网络结构&#xff08;1&#xff09; 传统意义上的transformer应…

数据结构4——线性表3:线性表的链式结构

基本概念 ​ 链式存储结构用一组物理位置任意的存储单元来存放线性表的数据元素。 ​ 这组存储单元既可以是连续的又可以是不连续的甚至是零散分布在任意位置上的。所以链表中元素的逻辑次序和物理次序不一定相同。而正是因为这一点&#xff0c;所以我们要利用别的方法将这些…

Kafka消息中间件(Kafka与MQTT区别)

文章目录KafkaKafka重要原理Topic 主题Partition 分区Producer 生产者Consumer 消费者Broker 中间件Offset 偏移量Kafka与mqtt区别Kafka Kafka是一个分布式流处理平台&#xff0c;它可以快速地处理大量的数据流。Kafka的核心原理是基于发布/订阅模式的消息队列。Kafka允许多个…

C++基础——C++面向对象之重载与多态基础总结(函数重载、运算符重载、多态的使用)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…