学习OpenCV环境准备

OpenCV配置

由于我的Ubuntu 16.04不知道什么时候已经安装了OpenCV,所以这里省略了安装过程。注意的是我的OpenCV应该不是按照官网的编译方式安装的,应该是之前有一些环境配置时所需依赖时以其他的方式安装的。

  • 使用vs code编译OpenCV程序

在vs code编译器中,用简单的读取图片的代码测试,运行时出现下面错误:

1
2
3
4
5
6
7
8
9
/tmp/cc9zYXpi.o: In function 'main':
/home/xxx/c++/main.cpp:5: undefined reference to 'cvLoadImage'
/home/xxx/c++/main.cpp:6: undefined reference to 'cvNamedWindow'
/home/xxx/c++/main.cpp:7: undefined reference to 'cvShowImage'
/home/xxx/c++/main.cpp:8: undefined reference to 'cvWaitKey'
/home/xxx/c++/main.cpp:9: undefined reference to 'cvReleaseImage'
/home/xxx/c++/main.cpp:10: undefined reference to 'cvDestroyWindow'
collect2: error: ld returned 1 exit status
The terminal process terminated with exit code: 1

我对于该错误出现的推测是,因为测试程序是在之前配置运行c++的环境下运行的,所以设置的默认编译指令也是用的之前的,所以对于当前的并不适用,应该需要对于OpenCV所需的指令重新设定默认编译指令。

  • 一种在终端编译的方式

在vs code中由于设置的问题出现报错,那有一种通用的方式是在终端输入命令行完成编译。命令行如下:

1
g++ main.cpp -o main_out `pkg-config --cflags --libs opencv`

注意:这里是`而不是‘,否则无法编译成功。

pkg-config可用于列举某个库的相关信息,比如此库的路径/相关头文件等。比如:

1
2
3
4
5
~$ pkg-config --cflags opencv
-I/usr/include/opencv

~$ pkg-config --libs opencv
/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so -lopencv_calib3d /usr/lib/x86_64-linux-gnu/libopencv_contrib.so -lopencv_contrib /usr/lib/x86_64-linux-gnu/libopencv_core.so -lopencv_core /usr/lib/x86_64-linux-gnu/libopencv_features2d.so -lopencv_features2d /usr/lib/x86_64-linux-gnu/libopencv_flann.so -lopencv_flann /usr/lib/x86_64-linux-gnu/libopencv_gpu.so -lopencv_gpu /usr/lib/x86_64-linux-gnu/libopencv_highgui.so -lopencv_highgui /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so -lopencv_imgproc /usr/lib/x86_64-linux-gnu/libopencv_legacy.so -lopencv_legacy /usr/lib/x86_64-linux-gnu/libopencv_ml.so -lopencv_ml /usr/lib/x86_64-linux-gnu/libopencv_objdetect.so -lopencv_objdetect /usr/lib/x86_64-linux-gnu/libopencv_ocl.so -lopencv_ocl /usr/lib/x86_64-linux-gnu/libopencv_photo.so -lopencv_photo /usr/lib/x86_64-linux-gnu/libopencv_stitching.so -lopencv_stitching /usr/lib/x86_64-linux-gnu/libopencv_superres.so -lopencv_superres /usr/lib/x86_64-linux-gnu/libopencv_ts.so -lopencv_ts /usr/lib/x86_64-linux-gnu/libopencv_video.so -lopencv_video /usr/lib/x86_64-linux-gnu/libopencv_videostab.so -lopencv_videostab

通过这种方式就可以开始OpenCV的学习了,但是这样会很不方便吧,所以还是要在vs code中配置一套属于OpenCV的环境。

  • 配置vs code编译OpenCV程序的环境

由上面的过程可以知道,究其原因就是之前的vs code设置的默认指令不匹配造成。同时也知道正确的指令应该是g++ main.cpp -o main_test.out 'pkg-config --cflags --libs opencv'
配置vs code的环境大同小异,这里简述一下:

1.新建文件夹LearningOpenCV
2.在根目录下新建.vscode文件夹,并在该文件夹下新建launch.json,settings.json,tasks.json三个设置文件
3.其中launch.json,settings.json的设置可以参考其他,重要的是tasks.json中args参数的设置,这个是默认指令的设置。我的tasks.json设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "g++",
"args":["-g","${workspaceRoot}/main.cpp","-o","main_test.out","`pkg-config","--cflags","--libs","opencv`"],
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher":
{
"owner": "cpp",
"fileLocation":["relative", "${workspaceRoot}"],
"pattern":[
{
"regexp": "^([^\\\\s].*)\\\\((\\\\d+,\\\\d+)\\\\):\\\\s*(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"location": 2,
"message": 5
}
]
}
}
]
}

可以看到tasks.json中的args参数正是我们上面说到的终端指令。
注意:由于args的参数设置时不能包含空格,所以pkg-config --cflags --libs opencv需要不同的引号分开,同时`注意不要搞错或者忘记。
到此为止,vs code的OpenCV编译环境已经完成了,接下来就在Ubuntu下面开始OpenCV的学习吧!