美文网首页Coding
dll打包以及调用

dll打包以及调用

作者: e26f55e7ec23 | 来源:发表于2020-05-06 08:24 被阅读0次

    主要是为了给c++打包opencv的dll库
    参考:https://blog.csdn.net/m0_37170593/article/details/76445972
    https://blog.csdn.net/hit2015spring/article/details/52624985(需要注意头文件)
    https://blog.csdn.net/dearKundy/article/details/73331514

    1.生成dll

    1.创建dll生成项目

    创建dll生成工程

    此时测试的文件目录:
    generdll.cpp是会因为项目名称的不同而不同~


    文件目录

    2.添加generdll.cpp对应的头文件

    头文件作用:创建接口,以供多个cpp文件公用;[http://www.cplusplus.com/forum/articles/10627/]
    此时工程目录如下:

    图片.png

    3.修改文件

    1.创建对应程序的头文件(generdll.h)

    _declspec(dllexport)表示你要把自己的代码生成dll给别人用,需要导出函数给别人。
    _declspec(dllimport)表示你在调用别人的dll里面的函数

    #pragma once
    
    #include<string>
    
    using namespace std;
    
    __declspec(dllexport) int opencv_dll_main(string sImagePath);
    __declspec(dllexport) void opencv_lines_main(string sImagePath);
    
    2.创建cpp文件(generdll.cpp)

    接口函数的调用函数正常定义声明就可以了;接口函数无需提前声明。

    // generdll.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    #include<iostream> 
    #include <opencv2/core/core.hpp> 
    #include <opencv2/highgui/highgui.hpp> 
    #include <opencv2\imgproc\imgproc.hpp>
    #include <string>
    
    using namespace cv;
    using namespace std;
    
    void cvThin(cv::Mat& src, cv::Mat& dst, int intera);
    double get_point_angle(CvPoint pointO, CvPoint pointA);
    void rotate_arbitrarily_angle(Mat &src, Mat &dst, double angle);
    
    __declspec(dllexport) int opencv_dll_main(string sImagePath)
    {
    
        // 读入一张图片(测试图) 
        Mat img = imread(sImagePath), tempImage;
    
        // 创建一个名为 "处理后图片"的窗口 
        cvNamedWindow("处理后图片", 0);
        cvResizeWindow("处理后图片", int(img.rows), int(img.rows));
        cvNamedWindow("原始图片", 0);
        cvResizeWindow("原始图片", int(img.rows), int(img.rows));
        //进行颜色空间的转换
        cvtColor(img, tempImage, COLOR_LBGR2Lab);
        // 在窗口中显示测试图 
        imshow("处理后图片", tempImage);
        imshow("原始图片", img);
        // 等待操作,关闭显示
    
        waitKey(0);
        return 0;
    }
    
    __declspec(dllexport) void opencv_lines_main(string sImagePath)
    {
        cout << "enter success!" << endl;
        Mat imgHSV, imgray, mask, dstimage, rotateimage;
        Mat image = imread(sImagePath);
        Mat rotate_orimage, orimage = image;
    
        const int alpha = 100;
        double angree = 0, angree2 = 0;
    
        Scalar whiteUSL = Scalar(180, 30, 255);
        Scalar whiteLSL = Scalar(0, 0, 221);
        vector<Mat> hsvSplit;
    
        imshow("origin", image);
        cvtColor(image, imgray, CV_BGR2GRAY);//灰度图
                                             //cvtColor(orimage, orimage, CV_BGR2GRAY);//源图像灰度图
                                             //imshow("gray", imgray);
        cvtColor(image, imgHSV, CV_BGR2HSV);//转化为HSV
                                            //imshow("imgHSV", imgHSV);
    
    
                                            //转化成直方图均衡化
        split(imgHSV, hsvSplit);
        equalizeHist(hsvSplit[2], hsvSplit[2]);
        merge(hsvSplit, imgHSV);
        //imshow("imgHSV2", imgHSV);
    
        inRange(imgHSV, whiteLSL, whiteUSL, mask);
        //imshow("mask", mask);
    
        cvThin(mask, dstimage, 6);
        imshow("thin", dstimage);
    
        Mat image_canny(image.size(), CV_8UC1, Scalar(0));//创建图像存储边缘
                                                          //imshow("image_canny", imgHSV);
        Canny(imgHSV, image_canny, 100, 150, 3, true);//Canny边缘处理
    
        imshow("result", image_canny);
    
        vector<Vec2f> lines;
        HoughLines(dstimage, lines, 1, CV_PI / 180, 150, 0, 0);
        cout << "size:" << lines.size() << endl;
    
        waitKey(0);
    }
    
    void cvThin(cv::Mat& src, cv::Mat& dst, int intera)
    {
    }
    
    double get_point_angle(CvPoint pointO, CvPoint pointA)
    {
    }
    
    void rotate_arbitrarily_angle(Mat &src, Mat &dst, double angle)
    {
    }
    

    4.生成dll文件

    生成了dll和lib文件


    图片.png

    2.调用dll文件

    1.创建工程

    基本和创建dll工程没有区别,但是有一个需要注意的地方:


    创建工程.png

    我一般都是选择空项目,不过不选择也是可以的~

    工程目录如下:


    工程目录

    2.添加dll文件

    C:\generdll\x64\Debug这个文件目录中复制这两项到当前目录下

    复制dll和lib
    C:generdll这个文件目录中复制generatedll.h(在生成dll文件是添加的头文件)到当前目录下
    此时当前目录的:
    添加dll、lib和头文件之后的目录情况
    3.添加文件到工程中

    .lib文件添加到资源文件中,.h文件添加到头文件中;

    图片.png
    4.修改main.cpp文件
    #include<iostream>
    #include "generdll.h"//注意添加头文件哦
    #include<string>
    
    using namespace std;
    
    int main()
    {
        string path = "C:\\2020.png";
        int a = opencv_dll_main(path);
        opencv_lines_main(path);
        cout << "ok" << endl;
        return 0;
    }
    
    

    虽然.lib让人有点困惑,但是是之后还是可以愉快的运行了

    .lib文件的问题下此解决,准备上班~~~

    相关文章

      网友评论

        本文标题:dll打包以及调用

        本文链接:https://www.haomeiwen.com/subject/tetmghtx.html