qq_41747698 2021-09-22 13:58 采纳率: 75%
浏览 170
已结题

c++ 类打包dll 含第三方依赖

写了一个基于opencv的算法,会用到opencv的Net、Mat等类型和函数,大概是几个个接口用来接受参数路径,把读取net放在了循环之外因此private中含有Net类型,参考了dllexport但是头文件类的声明有mat、net存在仍然需要拷贝opencv的所有东西和环境
现需要使用ocr::rec函数以及读取模型的readmodel函数,输入图像返回运算图像
将它打包成一个dll交付给他人使用应该如何做到,纯虚函数是否可行,请教具体方法?
目前头文件如下

#pragma once

#ifdef _DLL_EXPORTS
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endif
#include <stdlib.h>  
#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/all_layers.hpp>
#include <string>
#include <vector>
#include <algorithm>
#include <array>
#include<cmath>
#include<windows.h>

#ifndef INTERFACE_DEFINE_AND_REALIZE
#define INTERFACE_DEFINE_AND_REALIZE
#include <string>
using std::string;
//define interface

using namespace std;
using namespace cv;
using namespace dnn;

class _declspec(dllexport) ocr
{
private:
    int crop_mode = 1;
    int thresh_mode=1;
    int bitwise_mode2 = 0;
    double blur1 = 3;
    double blur2 = 11;
    //int rect_morph_x;
    //int rect_morph_y;
    int morph_x = 1;
    int morph_y = 9;
    int iteration = 1;
    int canny_max = 300;
    int min_width = 8;
    int i;//高斯模糊
    int flag;
    int flag2;
    string model_path = "./1.onnx";
    Net net;                            //此处为opencv的net类型
    int rect_thresh = 0;
    int blocksize = 31;
    int C = 10;
    int left = 0;
    int right = 0;
    int up = 0;
    int down = 0;

    int softmax_thresh;

    //block,C,threshold

    //unsigned char * img


public:
    //void ~ocr(){}

    //inline
    void set_morph(int x, int y, int iter)
    {
        morph_x = x;
        morph_y = y;
        iteration = iter;
    }
    
    void set_blocksize(int x)
    {
        blocksize = x;
    }
    //inline
    void set_net(string model_path)                       
    {
        net = cv::dnn::readNetFromONNX(model_path);
    }

    void set_rect_thresh(int x)
    {
        rect_thresh = x;
    }



    void set_C(int x)
    {
        C = x;
    }

    void set_canny_max(int x)
    {
        canny_max = x;
    }

    void set_abcd(int x, int y, int z, int f)
    {
        up = x;
        down = y;
        left = z;
        right = f;
    }

    void set_min_width(int x)
    {
        min_width = x;
    }

    void set_softmax_thresh(int x)
    {
        softmax_thresh = x;
    }

    void load_model(const string model_path, Net &net);//Net net

    void char2mat(unsigned char* cimg, Mat &mat, int h, int w, int channel);

    void rotate(Mat &frame);

    void undistort(Mat &frame);

    void find_rect(cv::Mat& frame, Mat &dst, Point &startpoint, int rect_thresh, int rect_morph_x = 1, int rect_morph_y = 1, int operation = 0, int erosion_elem = 0, int iteration = 1);

    void getthresh(Mat &frame, int thresh1, int thresh3, int bitwise_mode = 0, int thresh_mode = 0, int blocksize = 35, int C = 29, int i = 7);

    void canny_crop(Mat &frame, Mat &output, vector<int>&result, vector<double>&softmax, int &flag2, Net net, vector<Rect> &digit_rect, int bitwise_mode2, int morph_x = 1, int morph_y = 9, //9
        int iteration = 1, int padding = 0, int canny_max = 300);

    void vertical_crop(Mat &frame);

    //blobfromimages

    void rec_single(Mat &img, int &num, float &prob, int &flag2, Net net, float scale = 1.0 / 255);

    void findSquares(Mat &frame, Mat &out);

    void SortRotatedRectPoints(Point2f vetPoints[], RotatedRect &rect, int flag);

    //void thinimage(Mat &srcimage);
    void thinimage(Mat &input_src, Mat & output_dst, int number = 1);
    Mat ImgSkeletonization_H(Mat &input_src, int *search_arr);
    Mat ImgSkeletonization_V(Mat &input_src, int *search_arr);

    //int morph_x, int morph_y, a, b, c, d;
    void rec(Mat &frame, Mat &output, Mat &canny_crop, Mat &rect_crop);

    void crec(unsigned char *input, unsigned char *output, unsigned char *rect, unsigned char *threshold, unsigned char *canny);//gauss置于morph后
};
#endif

  • 写回答

3条回答 默认 最新

  • orange4reg 2021-09-22 16:43
    关注

    找一个查看dll依赖的程序看看依赖性,把需要的外dll都放在一起。如果想隐蔽一点,就把它加进自己的dll里面,在网上找个动态加载内存中的dll的代码,这样就不用加载实体dll了,用户也看不见你调用了什么。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 已采纳回答 9月23日
  • 修改了问题 9月22日
  • 创建了问题 9月22日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题