Coding

dll打包以及调用

2020-05-06  本文已影响0人  e26f55e7ec23

主要是为了给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文件的问题下此解决,准备上班~~~

上一篇 下一篇

猜你喜欢

热点阅读