lengshizai 2024-08-15 00:11 采纳率: 32.1%
浏览 16
已结题

C++ 中std无法跨lib或dll的问题解决方案

上个问题因信息提供不足结题,重新发布:
编写LIb过程中,出现了std类型返回值 无法导出lib传递的问题。
假如我想在exe中接收ocr_results返回值。
但是std无法跨dll或lib,请给出三种高效的解决方案,并举出简洁示例。使我能传递std类型返回值
答案满足要求即采纳。
lib中的代码如下:包括结构体:

//涉及到的结构体:
struct OCRPredictResult {
  std::vector<std::vector<int>> box;
  std::string text;
  float score = -1.0;
  float cls_score;
  int cls_label = -1;
};

struct StructurePredictResult {
  std::vector<float> box;
  std::vector<std::vector<int>> cell_box;
  std::string type;
  std::vector<OCRPredictResult> text_res;
  std::string html;
  float html_score = -1;
  float confidence;
};

//导出函数的代码
std::vector<std::vector<OCRPredictResult>> processImagesOcr(PPOCR& ocrInstance, const OCRFlags& flags) {
    check_params();

    if (!Utility::PathExists(flags.image_dir)) {
        std::cerr << "[ERROR] image path not exist! image_dir: " << flags.image_dir
            << std::endl;
        exit(1);
    }
    std::vector<cv::String> cv_all_img_names;
    cv::glob(flags.image_dir, cv_all_img_names);
    if (!Utility::PathExists(flags.output)) {
        Utility::CreateDir(flags.output);
    }
    if (flags.benchmark) {
        ocrInstance.reset_timer();
    }
    std::vector<cv::Mat> img_list;
    std::vector<cv::String> img_names;
    for (int i = 0; i < cv_all_img_names.size(); ++i) {
        cv::Mat img = cv::imread(cv_all_img_names[i], cv::IMREAD_COLOR);
        if (!img.data) {
            std::cerr << "[ERROR] image read failed! image path: "
                << cv_all_img_names[i] << std::endl;
            continue;
        }
        img_list.push_back(img);
        img_names.push_back(cv_all_img_names[i]);
    }

    std::vector<std::vector<OCRPredictResult>> ocr_results =
        ocrInstance.ocr(img_list, flags.det, flags.rec, flags.cls);
    
    if (flags.benchmark) {
        ocrInstance.benchmark_log(cv_all_img_names.size());
    }
    return ocr_results;
}

主函数中代码如下

//加载 链接lib省略

std::vector<std::vector<OCRPredictResult>> predictResults =processImagesOcr();
  • 写回答

25条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-08-15 00:12
    关注
    获得0.30元问题酬金

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    要解决这个问题,首先需要了解如何将OCR结果的STD::VECTOR转换为STD::STRING以便使用STD::COUTSTD::ENDL输出。以下是一个基本的示例:

    1. 在你的应用程序中创建一个STD::VECTOR<STD::STRING>来存储OCR结果。
    STD::VECTOR<STD::STRING> RESULT = {"RESULT1", "RESULT2"};
    
    1. 使用STD::STRINGSTREAM或其他字符串格式化工具将RESULT转换为STD::STRING

    2. 使用STD::COUTSTD::ENDL输出转换后的字符串。

    下面是一些可能的解决方案:

    • 使用BOOST::ALGORITHM::SPLITBOOST::TEXT::REPLACE工具来分隔文本。
    #INCLUDE <IOSTREAM>
    #INCLUDE <SSTREAM>
    #INCLUDE <BOOST/ALGORITHM.HPP>
    
    INT MAIN() {
        STD::VECTOR<STD::STRING> TEXT = {"RESULT1", "RESULT2"};
        BOOST::ALGORITHM::SPLIT(TEXT, " ", STD::BACK_INSERTER(RESULT));
        FOR (CONST AUTO& S : RESULT) {
            STD::COUT << S << STD::ENDL;
        }
        RETURN 0;
    }
    
    • 使用STD::ISTRINGSTREAM和其他字符串格式化工具来读取STD::VECTOR<STD::STRING>中的内容。
    #INCLUDE <IOSTREAM>
    #INCLUDE <SSTREAM>
    #INCLUDE <FSTREAM>
    #INCLUDE <BOOST/ALGORITHM.HPP>
    
    INT MAIN() {
        STD::IFSTREAM FILE("PATH/TO/RESULT.TXT");
        IF (!FILE.IS_OPEN()) {
            THROW STD::RUNTIME_ERROR("FAILED TO OPEN THE FILE.");
        }
    
        STD::STRING LINE;
        WHILE (GETLINE(FILE, LINE)) {
            STD::ISTRINGSTREAM ISS(LINE);
            STD::STRING TOKEN;
            STD::GETLINE(ISS, TOKEN, ' ');
            RESULT.PUSH_BACK(TOKEN);
        }
    
        FOR (CONST AUTO& S : RESULT) {
            STD::COUT << S << STD::ENDL;
        }
        RETURN 0;
    }
    
    • 使用STD::OFSTREAM等其他文件操作类来写入STD::VECTOR<STD::STRING>
    #INCLUDE <IOSTREAM>
    #INCLUDE <FSTREAM>
    #INCLUDE <BOOST/ALGORITHM.HPP>
    
    INT MAIN() {
        STD::OFSTREAM FILE("PATH/TO/RESULT.TXT");
        IF (!FILE.IS_OPEN()) {
            THROW STD::RUNTIME_ERROR("FAILED TO OPEN THE FILE.");
        }
    
        STD::STRING LINE;
        WHILE (GETLINE(FILE, LINE)) {
            STD::ISTRINGSTREAM ISS(LINE);
            STD::STRING TOKEN;
            STD::GETLINE(ISS, TOKEN, ' ');
            RESULT.PUSH_BACK(TOKEN);
        }
    
        FOR (CONST AUTO& S : RESULT) {
            STD::COUT << S << STD::ENDL;
        }
        RETURN 0;
    }
    

    以上就是解决这个问题的一些基本方法。根据你使用的编程语言和库,可能会有更具体的实现方式。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月23日
  • 创建了问题 8月15日

悬赏问题

  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?