日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

CMake下調(diào)用anaconda的pytorch及numpy傳參CV::Mat給python(多線程版)

作者:晝行plus 更新時間: 2022-07-16 編程語言

經(jīng)測試發(fā)現(xiàn)上次寫的
CMake下調(diào)用anaconda的pytorch及numpy傳參CV::Mat給python
在多線程下就掛了…… 經(jīng)過各種實驗,終于完成了多線程的實現(xiàn),在此分享一下:

主要結(jié)構(gòu)如下:

//
// Created by daybeha on 2022/7/8.
//

//c++ python聯(lián)合編程 問題記錄
//
//        多線程下代碼框架完成,
//但Mat轉(zhuǎn)numpy的核心函數(shù) PyArray_SimpleNewFromData()在第三次調(diào)用時會報段錯誤


#define PY_SSIZE_T_CLEAN

#include <Python.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include "numpy/arrayobject.h"
#include <stdio.h>
//#include <time.h>
//#include <pthread.h>

#include <thread>
#include "loopclose.h"

using namespace std;


const char *python_modle = "sg_match";
//const char * python_func =  "compute_score";
const char *python_func = "con_show";
//const char * python_func =  "show_img";


void fun() {
    //文獻[3]中在此處需要調(diào)用PyGILState_Check()檢測當前線程是否擁有GIL,
    //但我的環(huán)境并不能編譯PyGILState_Check,但我實測沒有PyGILState_Check也OK.
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();   //如果沒有GIL,則申請獲取GIL
    Py_BEGIN_ALLOW_THREADS;
        Py_BLOCK_THREADS;
        
        // 調(diào)用Python C API函數(shù),如PyRun_SimpleString、PyImport_Import、PyObject_CallObject、……
        
        Py_UNBLOCK_THREADS;
    Py_END_ALLOW_THREADS;
    PyGILState_Release(gstate);    //釋放當前線程的GIL
}


int main() {
    //初始化Python環(huán)境,如果是C++ class,可以將這一部分放到class的構(gòu)造函數(shù)中去。
    //**********************************************
    Py_Initialize(); //初始化Python環(huán)境
    if (!Py_IsInitialized()) //檢測是否初始化成功
    {
        return -1;
    } else {
        PyEval_InitThreads();     //開啟多線程支持
        int nInit = PyEval_ThreadsInitialized();  //檢測線程支持是否開啟成功
        if (nInit) {
            PyEval_SaveThread();  //因為調(diào)用PyEval_InitThreads成功后,當前線程就擁有了GIL,釋放當前線程的GIL,
        }
    }

    thread *a = new thread(fun);

//    loopclose *lc = new loopclose();
//    thread *b = new thread(&loopclose::run, lc);
//
//    b->join();
//    cout << "b finished!" << endl;
    a->join();
    cout << "a finished!" << endl;


    //結(jié)束Python環(huán)境,如果是C++ class,可以將這一部分放到class的析構(gòu)函數(shù)中去。
    //**********************************************
//    PyGILState_Ensure();
    Py_Finalize();
    //**********************************************
    return 0;
}

編譯方式參考:ROS+Pytorch的聯(lián)合使用示例(語義分割)

catkin_make -DPYTHON_EXECUTABLE=/home/daybeha/anaconda3/envs/pytorch/bin/python -DPYTHON_INCLUDE_DIR=/home/daybeha/anaconda3/envs/pytorch/include/python3.9 -DPYTHON_LIBRARY=/home/daybeha/anaconda3/envs/pytorch/lib/libpython3.9.so -DCMAKE_BUILD_TYPE=Release -DSETUPTOOLS_DEB_LAYOUT=OFF

有一個需要注意的問題:

cv::Mat轉(zhuǎn) numpy的函數(shù) **PyArray_SimpleNewFromData()**在多線程里可能會報內(nèi)存問題,特別是循環(huán)調(diào)用時

如有大佬路過有解法,懇請評論區(qū)指導我!!!

Reference

【Python筆記1.1】C/C++多線程調(diào)Python

原文鏈接:https://blog.csdn.net/weixin_48592526/article/details/125742379

欄目分類
最近更新