Ubuntu16.04+VS code+libdmtx+opencv+Cpp


本文记录了自己在ubuntu系统下使用vs code编译器,使用libdmtx库,结合opencv,使用C++语言进行datamatrix二维码识别的过程。仅做个人记录,或许还可以帮到其他朋友。如需转载,请注明本文地址。

0. 参考内容

  1. opencv在ubuntu下安装:https://www.learnopencv.com/install-opencv-4-on-ubuntu-16-04/
  2. vs code安装教程:https://code.visualstudio.com/docs/?dv=linux64_deb
  3. vs code视频讲解:https://youtu.be/UHS-aenkPPg
  4. libdmtx官网:http://libdmtx.wikidot.com/start
  5. libdmtx下载:https://github.com/dmtx/libdmtx
  6. 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)"文件创建。
创建launch.json文件-1
创建launch.json文件-2创建tasks.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"进行安装即可。简单记录如下:

  1. (如果执行2失败时需要) 安装automake, libtool, pkgconfig三个依赖项。直接 “$sudo apt-get install xxx” 即可
  2. $./config
  3. $make
  4. $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(&reg);
		}
		//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. 总结

这篇文档的主要目的还是用于个人记录学习过程,便于今后自己使用。如果能够帮到其他朋友,会格外开心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值