Ubuntu16.04+VS code+libdmtx+opencv+Cpp_c++调用libdmtx生成dm码例程-程序员宅基地

技术标签: cpp  libdmtx  软件与库  VS Code  opencv  


本文记录了自己在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. 总结

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tfb760/article/details/90022937

智能推荐

关于AD19 3维视图的问题_ad二维图和三维图倒了-程序员宅基地

文章浏览阅读2.1k次。关于AD19 3维视图的问题新人请教一下AD19 3维视图的问题,我的2维图没有做镜像,以及上下左右翻转,3维图里也没有问题。但是过了几天之后,3维视图却上下镜像了,2维图我也没有做任何翻转镜像什么的,很是疑惑,老哥们帮忙指点指点。..._ad二维图和三维图倒了

斐波那契(黄金分割)法查找:_黄金分割查找-程序员宅基地

文章浏览阅读348次。斐波那契(黄金分割)查找算法_黄金分割查找

小程序真机调试部分组件不显示_微信小程序在真机调试上面控件显示不出来-程序员宅基地

文章浏览阅读301次。点击推送更新基础库_微信小程序在真机调试上面控件显示不出来

springboot 在配置文件中配置 jdbc驱动时爆红_jdbcutil报红-程序员宅基地

文章浏览阅读6.2k次,点赞3次,收藏3次。起因今天刚想给vue用springboot建一个服务器时,建项目时选择了JPA和jdbc,但是在application.propertise配置driver-class-name属性值,后面的属性值 com.mysql.jdbc.Driver 爆红 ,让我的小心脏一阵不爽,刚建项目就给我出问题。如图所示:pom.xml文件<!--jpa --><dependency&g..._jdbcutil报红

TypeError: strptime() argument 1 must be str, not bytes_replace() argument 1 must be str, not bytes-程序员宅基地

文章浏览阅读2.3k次。TypeError Traceback (most recent call last) in ----> 1 dates,close = np.loadtxt(‘data.csv’,delimiter=’,’,usecols=(1,6),converters={1:datestr2num},unpack=True)2 pr..._replace() argument 1 must be str, not bytes

KBuild MakeFile介绍_kbuild和makefile的区别-程序员宅基地

文章浏览阅读656次。从Linux内核2.6开始,Linux内核的编译采用Kbuild系统,这同过去的编译系统有很大的不同,尤其对于Linux内核模块的编译。在新的系统下,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的Makefile,然后根据读到的内容第二次读取Kbuild的Makefile来编译Linux内核。Linux内核Makefile分类·_kbuild和makefile的区别

随便推点

libusb 编译-程序员宅基地

文章浏览阅读1k次。lib usb_libusb 编译

iOS svnX 使用流程_xcode svnx-程序员宅基地

文章浏览阅读620次。//联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪一、概念 SVNX是mac下一个开源的图形化操作工具,使用起来比较方便 .支持图形化查看需该,删除,提交,以及解决冲突文件。 二、操作流程 1.双击打开-效果_xcode svnx

UE4 To Support Framebuffer Fetch For OpenGL ES3.1_ue4使用opengl-程序员宅基地

文章浏览阅读2.3k次。1. IntroduceAs we all know, most of mobile devices are base on tile-based GPU architecture. For these kinds of GPU, There's no extra performance to fetch frame buffer directly in pixel shader. Corresp_ue4使用opengl

MATLAB遗传算法 单目标优化问题_单目标优化函数-程序员宅基地

文章浏览阅读8.7k次,点赞6次,收藏40次。clcclearclose all%%画出函数图figure(1);hold on;lb=0;ub=31;%函数自变量范围【0,31】ezplot('X^2',[lb,ub]);%画出函数曲线xlabel('自变量/X')ylabel('函数值/Y')%%定义遗传算法参数NIND=40;%个体数目MAXGEN=20;%最大遗传代数PRECI=20..._单目标优化函数

android滑动基础篇_event.getpressure()-程序员宅基地

文章浏览阅读6.1k次。因为觉得android用到滑动的地方比较多,所以在写一篇基础的里字..效果图:代码部分: activity类代码:package com.TouchView;import android.app.Activity;import android.os.Bundle;_event.getpressure()

技能高考 计算机 试题,计算机技能高考模拟试题一-程序员宅基地

文章浏览阅读902次。《计算机技能高考模拟试题一》由会员分享,可在线阅读,更多相关《计算机技能高考模拟试题一(4页珍藏版)》请在人人文库网上搜索。1、110计算机工作的环境湿度是越干燥越好。() 计算机技能高考模拟试题(2016年湖北) 组装与维护模块 本套试卷选取3套高考模拟卷,自制而成,请同学们45分钟完成全部答题(2018-06- (标准:总分80分,48分及格,64分良好,64以上优秀) 皿、计算机组装与维修(..._技能高考 windows 复习

推荐文章

热门文章

相关标签