Ubuntu中在VS code中C++编写使用libdmtx的opencv代码
本文记录了自己在ubuntu系统下使用vs code编译器,使用libdmtx库,结合opencv,使用C++语言进行datamatrix二维码识别的过程。仅做个人记录,或许还可以帮到其他朋友。如需转载,请注明本文地址。
0. 参考内容
- opencv在ubuntu下安装:https://www.learnopencv.com/install-opencv-4-on-ubuntu-16-04/
- vs code安装教程:https://code.visualstudio.com/docs/?dv=linux64_deb
- vs code视频讲解:https://youtu.be/UHS-aenkPPg
- libdmtx官网:http://libdmtx.wikidot.com/start
- libdmtx下载:https://github.com/dmtx/libdmtx
- gcc入门教程:http://c.biancheng.net/gcc/
1. VS code中编写Cpp代码
1.1 插件安装
只需要安装C/C++ IntelliSense即可,有些地方提到了code runner插件,但仅对于运行简单的cpp比较方便,添加opencv、libdmtx库时个人觉得不方便。
1.2 .json文件的创建
编写完基本的main.cpp后F5进行Debug,会提示创建用于调试的文件(或在debug窗口单击齿轮config自行创建),上方会显示如下内容,选择C++(GDB/LLDB)后再选择"Defualt Configuration",将会创建一个launch.json文件。这个文件用于调试,但还没有进行编译,所以需要创建编译文件。创建方式同样在命令面板(ctrl+p)输入">"后选择"C/C++: Edit configurations(JSON)"文件创建。
1.3 .json文件修改与解释
之后需要修改两个文件中的一些设置内容。
// launch.json文件
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg", // 使用cppdbg编译,不要修改
"request": "launch",
"program": "${workspaceFolder}/main.o", //这个是debug目标文件(.o)时的路径和文件,需要修改。
//如果错误会提示找不到xxx.o文件。 ${workspaceFolder}是当前目录,后面跟可执行文件输出文件。
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true, // 使用外部控制台显示。youtube上视频教程建议使用true
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build" // 这行默认是不存在的,需要自己添加。
//这句话的意义在于,执行launch.json文件前,首先执行一个名为"build"的task。否则需要每次运行前执行编译过程。
//这个"build"是任意一个名称,但要与后面tasks.json中的"label"保持一致。
}
]
}
之后修改tasks.json文件。tasks.json文件用于编译。
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build", // 这个名称需要与launch.json文件中的"proLaunchTask"名称一致
"type": "shell",
"command": "g++", // 表示使用gcc指令进行编译。具体参考gcc教程。
"args":[
"-g", "main.cpp", "-o", "main.o",
// -g指令表示生成调试信息,编译的文件是"main.cpp","-o"输出文件为"main.o"。
//输出名称需要与launch.json中"program"中保持一致。
],
"problemMatcher":"$gcc" // 输出错误信息仅保留gcc相关的
}
]
}
修改完这两个文件之后,理论上可以直接运行,然后外部控制台会输出结果。
2. VS code中使用opencv库
在windwos中使用visual studio社区版时,执行了几步操作,包括:include上opencv的头文件路径,添加.lib和.dll库。这些操作同样需要在vs code中执行。
2.1 包含opencv头文件
打开tasks.json文件,添加编译main时需要搜寻的路径。将"args"中增加如下参数。"-I"表示include的路径,后面加opencv头文件所在路径。
"args":[
"-g", "main.cpp", "-o", "main.o",
"-I","/usr/local/include",
"-I","/usr/local/include/opnecv",
"-I","/usr/local/include/opnecv2",
],
之后回到main.cpp中,添加"#include <opencv2/opencv.hpp>"时可以自动补全,并且使用cv中的函数例如imread等,可以提示函数原型。说明已经成功添加头文件。
2.2 包含opencv库
但此时运行会报错“`undefined reference to cv:imread",因为并没有添加运行这个函数时的链接库。所以需要进一步进行添加。将"args"参数中再添加以下内容:
"-L","/usr/lib/x86_64-linux-gnu",
"-l", "opencv_core",
"-l", "opencv_highgui",
其中"-L"表示链接库路径。这个可以通过在终端中输入"$pkg-config --libs opencv"查看路径。下图显示了路径为"/usr/lib/x86_64-linux-gnu"
“-l"表示库的名称,/注意到每个库文件命名为libxxx.so。写库名称时不加"lib"与”.so",只有中间部分。由于imread函数只涉及opencv_core与opencv_highgui两个库,故暂时只添加这两个。此时运行main.cpp文件可以正常运行。
3. libdmtx使用
3.1 libdmtx下载与安装
通过https://github.com/dmtx/libdmtx下载libdmtx-master.zip并解压,进入目录安装里面的"README"进行安装即可。简单记录如下:
- (如果执行2失败时需要) 安装automake, libtool, pkgconfig三个依赖项。直接 “$sudo apt-get install xxx” 即可
- $./config
- $make
- $sudo make install
3.2 libdmtx加到vs code
首先将make之后生成的"dmtx.h" 文件和"libdmtx.la"文件复制到当前vs code工程目录下。
此时在main.cpp中包含dmtx头文件可以直接找到,即输入"#include <dmtx.h>"能够自动补全,因为这个头文件已经自动被添加到工程路径中。具体可以通过"ctrl+p"调出panel后输入"c_cpp_properties.json"文件查看。这个文件是自动生成的,里面内容如下:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
其中有一行"includePath",里面"${workspaceFolder}/star-star" 中的"/**"表示当前目录下循环递归的寻找所有文件中的头文件。所以将"dmtx.h"复制到工程文件后就已经被添加了。
之后按照opencv库添加方式,将libdmtx.la添加到tasks.json即可。直接将args参数中加入
"-l", "dmtx",
即可。因为这个库也是在当前路径下包含了。
3.3 libdmtx代码
参考代码如下:
//--------------------------------------
DmtxMessage *msg;
DmtxRegion *reg;
DmtxImage *img;
img = dmtxImageCreate(src.data, src.cols, src.rows, DmtxPack8bppK); //注意使用CV_8UC1时使用DmtxPack8bppK定义。否则要进行相应修改
DmtxDecode *dec = dmtxDecodeCreate(img, 1);
//以下几行用于限制搜寻时间。
//DmtxTime beginTime = dmtxTimeNow();
//long timeout_ms = 100;
//DmtxTime stopTime = dmtxTimeAdd(beginTime, timeout_ms);
reg = dmtxRegionFindNext(dec, stopTime);// stopTime=0 means no constraint
if (reg != NULL)
{
msg = dmtxDecodeMatrixRegion(dec, reg, DmtxUndefined);
if (msg != NULL)
{
cout << msg->output << endl;
dmtxMessageDestroy(&msg);
}
dmtxRegionDestroy(®);
}
//else
// cout << "Cannot find codes..." << endl;
dmtxDecodeDestroy(&dec);
dmtxImageDestroy(&img);
//--------------------------------------
3.4. 完整的tasks.json文件
{
// 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", "main.cpp", "-o", "main.o",
"-I","/usr/local/include",
"-I","/usr/local/include/opnecv",
"-I","/usr/local/include/opnecv2",
"-L","/usr/lib/x86_64-linux-gnu",
"-l", "opencv_core",
"-l", "opencv_highgui",
"-l", "dmtx",
],
"problemMatcher":"$gcc"
}
]
}
4. 总结
这篇文档的主要目的还是用于个人记录学习过程,便于今后自己使用。如果能够帮到其他朋友,会格外开心。