搭建Code::Blocks的OpenCV开发环境

\qquad 在 Code::Blocks 中搭建OpenCV的开发环境,需要使用 CMake工具 对 OpenCV 源码进行编译,生成相关的 bin、lib、include 等文件,才能够在 Code::Blocks 中进行 OpenCV 的配置,编译 OpenCV 源码所需的编译器则需要用到 MinGW 里的工具。

本文所列的所有过程都是在 64 64位模式 下进行。

\qquad VS固然是好,而且OpenCV都会提供编译好的库文件,但是架不住越来越庞大的规模。Code::Blocks 是个纯粹的编程环境,能够用来写 OpenCV 程序是再好不过,无非是麻烦一点需要自己来编译OpenCV库文件而已。

1. 安装MinGW

\qquad 安装 MinGW 可以直接下载 MinGW-w64 的安装程序,然后联网下载相关代码。

\qquad 本人更喜欢 msys2 的shell模式,在 msys2 中使用 pacman -S mingw-w64-x86_64-toolchain 来安装 mingw 的64位版本(32位版本使用 pacman -S mingw-w64-i686-toolchain 指令)。有关msys2 的详细操作可参考此处

\qquad 安装 MinGW 完毕之后,需要将 \msys64\mingw64\bin 加入到系统的环境变量中。

\qquad 安装 msys2 之后,会提供 msys2 MinGW 64-bit 和 msys2 MinGW 32-bit 两种 shell 环境,在64位环境中只能运行64位的MinGW,在32位环境中只能运行32位的MinGW,但是两种环境都可以使用 pacman 指令来完成软件包的安装、升级工作。可以设置 msys2 的更新服务器为清华的服务器(可参考此处),下载速度会快很多很多很多。
在这里插入图片描述
\qquad 如果下载的Code::Blocks是nomingw安装文件,则需要在Code::Blocks的Settings — Compiler 的 toolchain executables 中进行配置。其实最好还是选择nomingw方式,因为选择Code::Blocks自带的mingw是32位版本的。所以,为了避免一些可能出现的不匹配问题,最好还是选择nomingw方式安装Code::Blocks,然后自己设置 mingw(如下图)。
在这里插入图片描述

2. 使用CMake工具编译OpenCV(3.4.8)源代码

\qquad 在CMake中选择OpenCV源代码(本文所用的是 OpenCV 3.4.8),以及输出配置文件的目录(在opencv下新建了 build 目录),然后点击 Configure。
在这里插入图片描述
\qquad 在弹出界面中选择为哪种 IDE环境(包括各种VS版本等)进行编译,选择本地的编译器(也就是自己安装的 MinGW)。
在这里插入图片描述
\qquad 到 \msys64\mingw64\bin 目录中选择 x86_64-w64-mingw32-gcc 和 x86_64-w64-mingw32-g++作为 C 和 C++ 的编译器。
在这里插入图片描述
\qquad 然后,对CMake要编译的内容进行选择(每次更改了选择之后,都要重新点击Configure确认),然后 generate 代码。能否成功编译OpenCV源代码的关键就在于这些内容的选择(本人试了几次才编译成功,每次编译耗时一小时左右),主要是要去掉有关python的编译内容,也有网友试过要去掉cuda有关的内容。总之,关键的关键,就在于编译能否成功
在这里插入图片描述

其余的勾选内容用小图显示:
在这里插入图片描述 在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
\qquad 在 generate 代码之后,到 MSYS2 MinGW 64-bit 的 shell 中进入到 F:\opencv-3.4.8\build 目录,然后在 shell 中使用 mingw32-make install 指令,执行 OpenCV 的编译工作(经过漫长的等待,终于大功告成)。
在这里插入图片描述
\qquad 编译好的库文件记得保存好,可以直接拿给其他电脑上去用。 \textbf{编译好的库文件记得保存好,可以直接拿给其他电脑上去用。}
\qquad

\qquad 如果不小心编译了有关python的模块,很可能会报类似于下面的编译错误(都编译到94%了。。。):
[ 94%] Linking CXX shared library …\lib\cv2.pyd
E:/msys64/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/9.2.0/…/…/…/…/x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\opencv_python.dir/objects.a(cv2.cpp.obj):cv2.cpp:(.text$initcv2+0x1737): undefined reference to `__imp_Py_InitModule4’
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [modules\python\CMakeFiles\opencv_python.dir\build.make:139: lib/cv2.pyd] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:5285: modules/python/CMakeFiles/opencv_python.dir/all] Error 2
mingw32-make: *** [Makefile:162: all] Error 2

\qquad

3. 在Code::Blocks中配置OpenCV环境

\qquad 使用CMake编译成功之后,配置OpenCV所需的各种库文件有了,终于可以使用Code::Blocks了来写OpenCV程序了。

(1) 配置Compiler

\qquad 打开 Settings — Compiler,选择Search directories

\qquad 在 Compiler 中配置 include 文件

\qquad\qquad F:\opencv-3.4.8\build\install\include
\qquad\qquad F:\opencv-3.4.8\build\install\include\opencv
\qquad\qquad F:\opencv-3.4.8\build\install\include\opencv2
在这里插入图片描述
\qquad 在 Linker 中配置 lib 库文件,加入F:\opencv-3.4.8\build\lib
在这里插入图片描述
\qquad 在Linker settings中加入F:\opencv-3.4.8\build\lib中的所有文件
在这里插入图片描述

(2) 在Code::Blocks中生成OpenCV项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
\qquad Code::Blocks会自动生成这个OpenCV项目,Build 项目通过。
在这里插入图片描述
\qquad 运行程序结果,一个大大的施瓦辛格,欧耶~
在这里插入图片描述

一个opencv的例子:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;

const char *pstrWindowsSrcTitle = "原图";
const char *pstrWindowsDstTitle = "缩放图";
IplImage *pSrcImage, *pDstImage = NULL;

void on_trackbar(int pos, void* usrdata);
static string winName = "缩放图像";

int main()
{
	double fScale;				//缩放倍数
	Mat src, dst;
	int bins = 2;

	src = imread("lena.jpg");
	if (src.empty())
	{
		cerr << "Could not open file" << std::endl;
		return 1;
	}

	// 创建窗口1,显示原始图像
	namedWindow("原始图像", CV_WINDOW_AUTOSIZE);
	imshow("原始图像", src);

	// 创建Trackbar滚动条
	namedWindow(winName, CV_WINDOW_AUTOSIZE);
	imshow(winName, src);

	createTrackbar("阈值:", winName, &bins, 6, on_trackbar, &src);
	waitKey(0);

	return 0;
}

void on_trackbar(int pos, void* usrdata)
{
	Mat src1 = *(Mat*)(usrdata);
	Mat dst1;
	double fScale;
	if (pos == 0)
		fScale = 1;
	else
		fScale = pos / 2.0;
	Size czSize;
	czSize.height = src1.rows * fScale;
	czSize.width = src1.cols * fScale;
	resize(src1, dst1, czSize, 0, 0, 1);
	imshow(winName, dst1);
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xfijun/article/details/103101835