C/C++开发,win下OpenCV+MinGW编译环境搭建

目录

一、源码下载

二、源码编译

         2.1 cmake-gui配置编译选项

         2.2 动态库编译

         2.3 静态库编译(可选)

   三、案例测试

        3.1 工程设计及配置

        3.2 动态使用测试

        3.3 静态库使用测试


一、源码下载

        opencv可以在官网(Courses - OpenCV)、github、gitee下载源码编译自己所需要的特定功能的库,也可以在SourceForge获得已经编译好的库直接应用。

        gitee镜像:opencv: Open Source Computer Vision Library

        建议用国内镜像:git clone [email protected]:mirrors/opencv.git

        cmake下载:Index of /files,自行下载需要的版本,建议2.8以上,win的直接下载编译好的安装版本,安装过程略过。

        MinGW+gcc的安装部署参见:https://pyfree.blog.csdn.net/article/details/129844783

二、源码编译

        2.1 cmake-gui配置编译选项

        进入cmake安装目录bin下,启动cmake-GUI界面

         在Cmake GUI管理界面,配置编译的源(src)和编译输出目录(bulid):

         点击configure配置按钮,进入编译工具选择界面,本人电脑安装了多个编译工具,为了防止cmake配置乱切入其他编译器,选择第二项手动指定本地编译器路径:

        点击next进入c/c++编译工具路径配置界面,选择安装好的MinGW-gcc/g++编译路径:

         点击完成按钮完成配置。cmake工具会执行配置及构建编译信息,等待configure它执行完成,完成后,我们可以修改一些配置信息(例如关闭一些不必要的编译模块-BUILD_opencv_*),也可以保持默认,建议修改python模块支持和安装目录

         本文取消了python2模块(本人电脑安装了一个2两个3的python版本)支持,以及修改了安装目录:

        点击Genrate生成Makefile文件。

         2.2 动态库编译

        进入编译输出目录(opencv_build),启动命令行工具

         对于部分MinGW版本,需要去mingw\include\c++\12.2.0\math.h:91将using std::hypot;这一执行语句注释掉,因为有些版本并没有包含hypot声明定义。

        输入命令make进行编译(编译时间较长,如果可以采用多核编译加快编译时间,make -j4,或mingw32-make,4是核数):

        我们也可以按需编译,mingw32-make help指令可以输出包含哪些可以编译的模块,

         mingw32-make 模块名可以指定编译哪些模块,例如mingw32-make opencv_python3

         编译mingw32-make opencv_python2时,如果电脑上安装了python3和python2的话,可能会出错,需要自行指定对于版本的位置。

        如果编译过程出现问题,主要是去cmake-gui配置界面查看配置信息是否正确,主要是一些编译工具依赖路径是否正确,或者去生成编译路径下查看Makefile文件信息作出调整。

        编译完后,mingw32-make install进行安装:

        最后安装目录结构如下,最主要使用到的就是include和lib目录:

        安装好的动态态库文件在mingw/bin目录,如下:

        由于本人的电脑以及设置了VC2015编译好的opencv库目录加入环境路径,这个就不加了,读友可以自行将mingw/lib和mingw/bin加入环境变量设置中。

         2.3 静态库编译(可选)

        静态库编译就是在cmake-gui界面,取消BUILD_SHARED_LIBS选项:

        并开启BUILD_opencv_world选项(动态库不建议,否则程序需要伴随一个大dll库划不来),否则使用静态库链接时需要作出很多静态链接的配置:

         然后再次生产新的 Makefile 文件,重新类似动态库编译那样做一次编译过程,由于前面已经编译过动态库,这次主要是生成静态库,所有相对编译较快。

mingw32-make -j4
mingw32-make install

        编辑及安装完成后,会在x64/mingw目录下新建一个staticlib目录,里面存放着静态库,在开启了选项后,有关 OpenCV的库只有一个,不像动态库那样按模块生成一堆小文件库:

   三、案例测试

        3.1 工程设计及配置

        创建一个工程如下:

#一个读取图片的测试项目
test 
    bin
        2.bmp        #随便一张图片
    src
        main.cpp
    Makefile

        main.cpp

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
    if( argc != 2)
    {
     cout <<" Usage: " << argv[0] << " ImageToLoadAndDisplay" << endl;
     return -1;
    }
    Mat image;
    image = imread(argv[1], IMREAD_COLOR); // Read the file
    if( image.empty() ) // Check for invalid input
    {
        cout << "Could not open or find the image" << std::endl ;
        return -1;
    }
    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
    imshow( "Display window", image ); // Show our image inside it.
    waitKey(0); // Wait for a keystroke in the window
    return 0;
}

        Makefile文件配置,主要是要包含opencv的头文件及用到的库

#/bin/sh
CX= g++ 

BIN 		:= ./bin
TARGET      := testMinGW.exe
FLAGS		:= -std=c++11 
#-static
SRCDIR 		:= ./src
#INCLUDES
INCLUDEDIR 	:= -I"$(SRCDIR)" -I"../opencv_MinGW/include"
LIBDIR		:= -L"../opencv_MinGW/x64/mingw/bin" -lopencv_core460 -lopencv_highgui460 -lopencv_imgcodecs460
source		:= $(wildcard $(SRCDIR)/*.cpp) 

$(TARGET) :
	$(CX) $(FLAGS) $(INCLUDEDIR) $(source)  -o $(BIN)/$(TARGET) $(LIBDIR)

clean:
	rm  $(BIN)/$(TARGET)

        3.2 动态使用测试

        直接make或mingw32-make命令编译

         由于是动态库使用,需要去mingw/bin拷贝相关动态库到程序输出目录下(如果是已经将动态库加入环境变量中则不用),然后运行输出程序:

        3.3 静态库使用测试

        现在修改为静态编译看看,修改Makefile文件:

#/bin/sh
CX= g++ 

BIN 		:= ./bin
TARGET      := testMinGW.exe
FLAGS		:= -std=c++11 -static
SRCDIR 		:= ./src
#INCLUDES
INCLUDEDIR 	:= -I"../opencv_MinGW/include" 
#-I"$(SRCDIR)"
staticDir   := ../opencv_MinGW/x64/mingw/staticlib/
LIBDIR		:= $(staticDir)/libopencv_world460.a\
			   $(staticDir)/libade.a \
			   $(staticDir)/libIlmImf.a \
			   $(staticDir)/libquirc.a \
			   $(staticDir)/libzlib.a \
			   $(wildcard $(staticDir)/liblib*.a) \
			   -lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 
#opencv_world放弃前,然后是opencv依赖的第三方库,后面的库是MinGW编译工具的库
#和后面这种库引用等价
#LIBDIR 	    := -L $(staticDir) -lopencv_world460 -lade -lIlmImf -lquirc -lzlib \
#				-llibjpeg-turbo -llibopenjp2 -llibpng -llibprotobuf -llibtiff -llibwebp \
#				-lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 

source		:= $(wildcard $(SRCDIR)/*.cpp) 

$(TARGET) :
	$(CX) $(FLAGS) $(INCLUDEDIR) $(source)  -o $(BIN)/$(TARGET) $(LIBDIR)

clean:
	rm  $(BIN)/$(TARGET)

        再次编译make(mingw32-make):

         进入bin目录,清除动态库编译时拷贝进来的动态库(屏蔽影响),运行程序,同样能达成效果:

         本文到此结束!

        感谢读友能耐心看到最后,本人文章都很长,知识点很细,可能会有所遗漏和失误,如果有不妥之处,烦请指出。如果内容对您有所触动,请点赞关注一下防止不迷路

猜你喜欢

转载自blog.csdn.net/py8105/article/details/129845234