主要是为了给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/]
此时工程目录如下:
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
这个文件目录中复制这两项到当前目录下
从
C:generdll
这个文件目录中复制generatedll.h
(在生成dll文件是添加的头文件)到当前目录下此时当前目录的:
添加dll、lib和头文件之后的目录情况
3.添加文件到工程中
将.lib
文件添加到资源文件中,.h
文件添加到头文件中;
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文件的问题下此解决,准备上班~~~
网友评论