STM32H5移植zbar记录

ZBar是一种流行的二维码扫描和解码工具,它在嵌入式系统中拥有广泛的应用。在嵌入式系统中,我们面临着有限的资源和更严格的性能要求,因此,选择适当的库来完成特定的任务非常重要。
ZBar适用于各种嵌入式平台,包括ARM、x86和MIPS等处理器架构。它可以轻松地整合到各种嵌入式系统中,如智能家居设备、智能手机、平板电脑、远程控制设备、工业控制器等。
ZBar使用C/C++编写,具有高度优化的算法,能够快速准确地读取各种二维码和条形码,包括QR码、Data Matrix码、PDF417码、EAN-13码等等。同时,ZBar还支持自定义解码器,开发者可以根据自己的需求配置扫描器以实现更好的解码效果。
ZBar还具有非常灵活的API,可用于C/C++、Python、Java、Ruby等语言,开发人员可以根据自己的需求灵活选择相应的API。此外,ZBar还支持多种操作系统和平台,包括Linux、Windows、Mac OS X等。
总之,ZBar是一种非常有用的嵌入式二维码和条形码扫描库,它提供了高效的解码算法、可定制的解码器和灵活的API,能够轻松地满足嵌入式设备的扫描和解码需求。

这里感谢之前大佬移植zbar库到stm32,具体链接如下:http://www.cnblogs.com/greyorbit/p/8456814.html

移植步骤也很简单,按照博文把对应文件和头文件路径加入到工程中,然后使用图片数组转成灰度数据,在调用zbar既可以识别。

不过移植后会有一个问题,不能重复调用识别二维码,很容易内存就崩了。为了解决这个问题,让这个zbar库可以真正的用起来,不得不找到问题所在。

这里直观的看就是内存问题,奈何如果从源码直接去查找malloc和free的匹配所需时间太大,只能动态调试查找原因,所以第一步,我移植了rt-thread系统,使用rt的内存管理api。

移植rt-thread很方便,现在stm32代码生成工具cubemx可以直接添加rt-thread库,所以移植rt-thread系统很快。具体如下图:

移植完rt-thread后,就需要把zbar库中用到的malloc、calloc、free等操作函数换成 rt-malloc、rt-calloc、rt-free等,直接用全局搜索和替换。

替换后打开rt的内存调试功能宏定义:在rtdebug.h文件中

更改后既可以看到打印内存申请和释放日志,以下为日志打印内容

malloc size 156
allocate memory at 0x2001008c, size: 168
malloc size 296
allocate memory at 0x20010134, size: 308
malloc size 32
allocate memory at 0x20010268, size: 44
malloc size 48
allocate memory at 0x20010294, size: 60
malloc size 2856
allocate memory at 0x200102d0, size: 2868
malloc size 52
allocate memory at 0x20010e04, size: 64
allocate memory at 0x20010e04, size: 64
malloc size 16
allocate memory at 0x20010e44, size: 28
malloc size 20
allocate memory at 0x20011388, size: 32
malloc size 60
allocate memory at 0x200113a8, size: 72
release memory 0x20011388, size: 32
malloc size 140
allocate memory at 0x200113f0, size: 152
release memory 0x200113a8, size: 72
malloc size 300
allocate memory at 0x20011488, size: 312
release memory 0x200113f0, size: 152
malloc size 620
allocate memory at 0x200115c0, size: 632
release memory 0x20011488, size: 312
malloc size 1260
allocate memory at 0x20011838, size: 1272
release memory 0x200115c0, size: 632
malloc size 2540
allocate memory at 0x20011d30, size: 2552
release memory 0x20011838, size: 1272
malloc size 20
allocate memory at 0x20011388, size: 32
malloc size 60
allocate memory at 0x200113a8, size: 72
release memory 0x20011388, size: 32
malloc size 140
allocate memory at 0x200113f0, size: 152
release memory 0x200113a8, size: 72
malloc size 300
allocate memory at 0x20011488, size: 312
release memory 0x200113f0, size: 152
malloc size 620
allocate memory at 0x200115c0, size: 632
release memory 0x20011488, size: 312
malloc size 1260
allocate memory at 0x20011838, size: 1272
release memory 0x200115c0, size: 632
malloc size 2540
allocate memory at 0x20012728, size: 2552
release memory 0x20011838, size: 1272
malloc size 352
allocate memory at 0x20011388, size: 364
malloc size 352
allocate memory at 0x200114f4, size: 364
malloc size 88
allocate memory at 0x20011660, size: 100
release memory 0x20011660, size: 100
malloc size 440
allocate memory at 0x20011660, size: 452
malloc size 440
allocate memory at 0x20011824, size: 452
malloc size 110, but align to 112
allocate memory at 0x200119e8, size: 124
release memory 0x200119e8, size: 124
malloc size 5792
allocate memory at 0x20013120, size: 5804
malloc size 80
allocate memory at 0x200119e8, size: 92
malloc size 20
allocate memory at 0x20011a44, size: 32
malloc size 32
allocate memory at 0x20011a64, size: 44
malloc size 5, but align to 8
allocate memory at 0x20011a90, size: 24
malloc size 8
allocate memory at 0x20011aa8, size: 24
release memory 0x20011aa8, size: 24
release memory 0x20011a90, size: 24
release memory 0x20011a64, size: 44
release memory 0x20011a44, size: 32
release memory 0x20011824, size: 452
release memory 0x20011660, size: 452
release memory 0x200114f4, size: 364
release memory 0x20011388, size: 364
malloc size 57600
allocate memory at 0x200147cc, size: 57612
malloc size 960
allocate memory at 0x20011388, size: 972
release memory 0x20011388, size: 972
malloc size 3, but align to 4
allocate memory at 0x20011388, size: 24
malloc size 360
allocate memory at 0x200113a0, size: 372
release memory 0x200113a0, size: 372
malloc size 360
allocate memory at 0x200113a0, size: 372
release memory 0x200113a0, size: 372
malloc size 176
allocate memory at 0x200113a0, size: 188
release memory 0x200113a0, size: 188
malloc size 176
allocate memory at 0x200113a0, size: 188
release memory 0x200113a0, size: 188
malloc size 552
allocate memory at 0x200113a0, size: 564
malloc size 552
allocate memory at 0x200115d4, size: 564
release memory 0x200113a0, size: 564
release memory 0x200115d4, size: 564
malloc size 52
allocate memory at 0x200113a0, size: 64
allocate memory at 0x200113a0, size: 64
malloc size 116
allocate memory at 0x200113e0, size: 128
malloc size 32

allocate memory at 0x20011460, size: 44
malloc size 32
allocate memory at 0x2001148c, size: 44
release memory 0x20011460, size: 44
release memory 0x2001148c, size: 44
malloc size 116
allocate memory at 0x20011460, size: 128
malloc size 8
allocate memory at 0x200114e0, size: 24
malloc size 70, but align to 72
allocate memory at 0x200114f8, size: 84
release memory 0x200113e0, size: 128
release memory 0x200113a0, size: 64
release memory 0x200114e0, size: 24
release memory 0x20011460, size: 128
malloc size 12
allocate memory at 0x200113a0, size: 24
malloc size 15, but align to 16
allocate memory at 0x200113b8, size: 28
release memory 0x200114f8, size: 84
malloc size 48
allocate memory at 0x200113d4, size: 60
release memory 0x20011388, size: 24
malloc size 4
allocate memory at 0x20011388, size: 24
malloc size 1, but align to 4
allocate memory at 0x20011410, size: 24
malloc size 31, but align to 32
allocate memory at 0x20011428, size: 44
malloc size 52
allocate memory at 0x20011454, size: 64
allocate memory at 0x20011454, size: 64
malloc size 8
allocate memory at 0x20011494, size: 24
malloc size 16
allocate memory at 0x200114ac, size: 28
release memory 0x20011494, size: 24
malloc size 24
allocate memory at 0x200114c8, size: 36
release memory 0x200114ac, size: 28
malloc size 32
allocate memory at 0x20011494, size: 52
release memory 0x200114c8, size: 36
malloc size 16
allocate memory at 0x200114c8, size: 28
release memory 0x20011428, size: 44
release memory 0x20011410, size: 24
release memory 0x200113b8, size: 28
release memory 0x200113a0, size: 24
release memory 0x200113d4, size: 60
release memory 0x200147cc, size: 57612
release memory 0x200119e8, size: 92
release memory 0x20013120, size: 5804
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
release memory 0x20010e04, size: 64
release memory 0x20011494, size: 52
release memory 0x200114c8, size: 28
release memory 0x20011454, size: 64
release memory 0x20010e44, size: 28
release memory 0x20010294, size: 60
release memory 0x20010268, size: 44
release memory 0x20010134, size: 308
release memory 0x20011d30, size: 2552
release memory 0x20012728, size: 2552
release memory 0x200102d0, size: 2868
release memory 0x2001008c, size: 168
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;56

 通过对申请和释放的对应关系,我们可以分析得出问题所在,zbar库在图片识别后释放了img->data指针,而这个指针是在zbar调用外部申请的空间,是不需要zbar内部释放的,具体代码如下:

int main(void)
{
  /* USER CODE BEGIN 1 */
    uint8_t test[]="start test\n";
    uint16_t i,j;
    int qr_img_width = 240;
    
    uint16_t Color;
    uint16_t cnt = 0;
    
    unsigned char *pic_rgb = (unsigned char *)gImage_test;
    unsigned char *pic_hd = NULL;
	unsigned char *pic_data = NULL;
    
    void * ptr_start;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  //HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  //SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_ETH_Init();
  MX_ICACHE_Init();
  MX_LPUART1_UART_Init();
  //MX_USART3_UART_Init();
  MX_UCPD1_Init();
  MX_USB_PCD_Init();
  /* USER CODE BEGIN 2 */

  pic_data = rt_malloc(qr_img_width*qr_img_width);
  if(pic_data == NULL)
  {
      printf("malloc error\n");
      return 0;
  }
  else
  {
      printf("pic_data:0x%x\n",pic_data);
  }
    //memset(pic_data,0,qr_img_width*qr_img_width);
     pic_hd = pic_data;
    for(i=0;i<qr_img_width;i++)
    {
        for(j=0;j<qr_img_width;j++)		//将RGB565图片转成灰度
        {

            Color = (*pic_rgb) | (*(pic_rgb+1)<<8);
            *pic_hd = (((Color&0xF800)>> 8)*77+((Color&0x7E0)>>3)*150+((Color&0x001F)<<3)*29)/256;
            pic_hd++;
            pic_rgb++;
            pic_rgb++;
         
        }
    }
  

  /* USER CODE END 2 */
  

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      
      
      if( Zbar_Test((void* )pic_data,qr_img_width,qr_img_width) == 0 )
      {
          printf("zbar failed \n");
          //rt_free(pic_data);
      }
      else
      {
          cnt ++;
          printf("zbar ok \n");
          //rt_free(pic_data);
      }
      printf("zbar count;%d\n",cnt);
      //list_thread();
      rt_thread_mdelay(5000);
      
  }
  rt_free(pic_data);
  /* USER CODE END 3 */
}

  即pic_data灰度图片数据是不需要zbar释放的,但是zbar库中做了释放操作,代码如下:

inline void zbar_image_rt_free_data (zbar_image_t *img)
{
    if(!img)
        return;
    if(img->src) {
        /* replace video image w/new copy */
        assert(img->refcnt); /* FIXME needs lock */
        zbar_image_t *newimg = zbar_image_create();
        memcpy(newimg, img, sizeof(zbar_image_t));
        /* recycle video image */
        newimg->cleanup(newimg);
        /* detach old image from src */
        img->cleanup = NULL;
        img->src = NULL;
        img->srcidx = -1;
    }
    else if(img->cleanup && img->data) {
        if(img->cleanup != zbar_image_rt_free_data) {
            /* using function address to detect this case is a bad idea;
             * windows link libraries add an extra layer of indirection...
             * this works around that problem (bug #2796277)
             */
            zbar_image_cleanup_handler_t *cleanup = img->cleanup;
            img->cleanup = zbar_image_rt_free_data;
            cleanup(img);
        }
//传入图片为外部指针,zbar内部不用free此指针
//        else
//            rt_free((void*)img->data);
    }
    img->data = NULL;
}

  这里把这一句屏蔽,则可以解决问题,经过我测试,现在已经连续运行上千次

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4290
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4291
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4292
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4293
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4294

 

 

本文转载于网络 如有侵权请联系删除

相关文章

  • Visual Studio 2017 – Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小d…

    VisualStudio2017–Windows应用程序打包成exe文件(2)-AdvancedInstallerAdvancedInstaller:Freefor30days.Allfeatures. 下载地址:https://www.advancedinstaller.com/download.html 30天内免费 汉化版:http://www.jb51.net/softs/595612.html 选择VisualStudio应用,点击创建项目 可以输入应用名称和所在组织的名称,在安装制作的exe,安装界面会显示所在组织名称 保存后缀aip的文件会以输入的应用名默认保存,例如我设定的输入应用名称是123,保存的文件是123.aip,当然自己可以修改文件保存位置和名字。 这一步可以随便选,在构建的时候修改。 我保存在了ConsoleApp1项目所在的目录,下一步保存需要导入的解决方案 点击下一步会自动加载 加载完成后跳转下面的页面,选择需要导入的项目,一般选Release,前提是已经配置Release并编译 点击之后会自动检测安装包需要的dll文件,全部勾选 可以重命名快捷方式,我

  • TIDB 初级课程体验 6 (使用和连接TIDB,与参数配置)

    TIDB之所以能流行,主要的原因是兼容性,TIDB在设计之初就使用了兼容MYSQL的语法,让目前最大的数据库使用团体在语句的使用方面不需要在学习,也让TIDB和互联网的公司打的火热。 TIDB的连接是十分简单的,你只需要下载MYSQL的客户端就可以使用,端口是4000。TIDBSERVER模块是与我们的MYSQL客户端进行连接的,首先TIDBSERVER是一个无状态的静态节点,也就是他不是一个数据持久性的节点。TIDB的扩展也很简单和无状态。这样的情况下,我们的TIDB可以无限扩展并且可以进行负载均衡的方式来降低客户的连接数(TIDB).100%兼容mysql5.7协议,支持MYSQL5.7常用功能更和语法,对于像外键,存储过程,函数,触发器等都是不支持的。 对于MYSQL支持的客户端都可以连接到TIDB中,如WORKBENCH,NAVICATE等都是可以的。mysql-uroot-p-h127.0.0.1-P4000查看TIDB的版本,其中包含tidb的版本,版本的特性是社区办还是其他的版本以及我们的UTC的时间,tikv的信息. 基本上相关的语法与MYSQL没有差异数据库的配置中,

  • 【解决方案】无人机+EasyDSS实现直播推流警务安防类行业应用

    一、方案背景随着我国经济的快速发展和城市化的大步迈进,人、车、物等都流动加剧,社会公共安全形势日益复杂,安全监控、安全防范与安保工作的紧迫性不断加大。传统安保工作大都依靠普通二维地图或现场人员的指挥调度,这些已经远不能满足公安应急等紧急性特殊需求,现场可视化、灵活化的应用需求越来越迫切。而城市安防监控与保护工作的信息采集存在时间、空间、规模等方面的诸多不确定性,各方面因素复杂,现有的信息采集手段大都通过监控实现,但是不全面,维度不够。无人机作为安防技术应用的延伸,在军警安防行业中广泛应用于治安管理、交通巡查、活动安保、侦察抓捕、反恐处突、禁毒铲毒、边境巡防、模拟作战等。无人机具有机动灵活、全方位监控、任务载荷丰富、适应性强、隐蔽性强等优点,凭借“查的准、盯得住、传得快”等优势,能够快速高效地完成应急追踪、反恐防爆等各种艰难任务。所以无人机挂载监控设备推流到EasyDSS平台则可以弥补公共警务安防的不足,发挥不可替代的作用。二、方案概述此次方案大致分为三个部分:前端为无人机搭载的高清推流摄像机,监控设备具有红外夜视、高清推流、语音对讲、预警/告警、云台控制等功能,另外无人机有抛投系统;服

  • 腾讯云开发者社区端午节作者福利活动

    感谢各位创作者一直以来对腾讯云开发者社区的支持和贡献,端午佳节来临之际,社区准备了1000份腾讯云开发者社区定制粽子礼盒和大量周边礼品,与各位作者老师共庆佳节。粽子有限,先到先得,领取方式见活动详情。一、活动时间2020.6.10-2020.6.20二、活动形式【发文有礼】活动期间(6.10—6.20)按要求在腾讯云开发者社区原创发文≥1篇且文章通过质量审核即可申请领取。1、原创发文要求:文章在腾讯云开发者社区的发布时间(即审核通过后)在6.10-6.20之间文章需要从腾讯云开发者社区手动发布,同步的文章不计入2、质量审核标准:字数不少于800字(不含代码段)非历史文章重发相似度检测不得高于20%禁止抄袭文章须有一定深度和意义,禁止水文【邀请有奖】活动期间(6.10-6.20)邀请1位(含)以上新作者成功入驻腾讯云开发者社区即可申请领取。新作者要求:有20篇以上符合要求的可以同步到社区的技术文章入驻成功定义:新作者申请自媒体分享计划的时间在6.10-6.20,且审核通过的时间也在6.10-6.20——如何邀请? ——已入驻社区的作者可以通过自己的专属二维码邀请好友入驻社区,入驻成功双方

  • 计算机通信流程

    同一网段内计算机通信流程参考地址:https://www.processon.com/view/5d784083e4b01080c73b9ca8如上图为一个简单的同一网段内主机的示例。如果计算机A向计算机B发送消息,那么应用层会获取计算机B的ip地址(例如192.168.3.98,端口号为3456),并且将数据封装交给传输层 传输层会利用TCP协议将数据封装端口号(源端口号|目的端口号|数据),并交给网络层 网络层利用ip协议为数据封装IP地址(源IP地址|目的IP地址|源端口号|目的端口号|数据),并交给数据链路层 数据链路层进行判断判断自己的ARP表是否存在目的MAC地址。 存在 利用以太网协议给数据封装MAC地址(源MAC地址|目的MAC地址|源IP地址|目的IP地址|源端口号|目的端口号|数据),并交付物理层。 不存在 向本网段内发送一条ARP广播,含义为谁是IP192.168.3.98,你的MAC地址是多少。 此时计算机B收到广播后,发现IP是找自己的则先将计算机A的ip与MAC记录到自己的ARP表里,然后给计算机A回复一个ARP响应包,告诉自己的MAC地址。 计算机A接收到

  • PyTorch如何构建和实验神经网络

    作者|TirthajyotiSarkar来源|Medium介绍在本文中,将展示一个简单的分步过程,以在PyTorch中构建2层神经网络分类器(密集连接),从而阐明一些关键功能和样式。PyTorch为程序员提供了极大的灵活性,使其可以在张量流过网络时创建,组合和处理张量……核心组成用于构建神经分类器的PyTorch的核心组件是张量(在PyTorch中央数据结构)Tensor的Autograd功能nn.Module类,用来建立任何其他神经类分类优化器损失函数使用这些组件,将通过五个简单的步骤构建分类器将神经网络构造为自定义类(从该类继承nn.Module),其中包含隐藏层张量以及forward通过各种层和激活函数传播输入张量的方法使用此forward方法通过网络传播特征(从数据集)张量-得到一个output张量计算了loss通过比较output在地上真相,并使用内置的损失函数传播的梯度loss使用自动分化能力(Autograd)与backward方法使用损耗的梯度来更新网络的权重(这是通过执行所谓的优化器的一个步骤来实现的)optimizer.step()。这个五步过程构成了一个完整的训练

  • 30分钟入门图数据库(精编版)

    之前在公司内部以推文为教材做过一些简单的入门培训,最近有个契机需要对外直播选个主题,就把这个入门课程重新编排了一下,内容也更加的丰富。因为是入门课程,我会从关系数据库到NoSQL的历史,从NoSQL到图,从图的概念到图建模,从建模到场景,这样一个循序渐进的过程来展开。另外通过这个入门课程试水,看看外部对这个图领域的培训需求有多大,就目前来说这个市场是基本空白。 当然ppt是无法动态演示实操过程(如果有机会可以考虑以视频的方式呈献给大家),其中SQL章节是希望读者自行去安装真正动手去练习的。否则通过本文最多只能算是帮你做了个概念澄清,对后面的进阶是没有任何帮助的。 另外,若想获取完整无水印的PDF和视频请公众号直接回复“graphdb”即可。Amoderndatabaseengineeredforgreatnessfromthegroundup.It’stimetodosomethingepicwithyourdata.OrientDBEnterpriseEdition3.0expandsfromanunparalleledlegacyofpowerfulmulti-modelconce

  • rownum的SQL需求

    《从一条"错误"的SQL,了解rownum的作用》提到的案例中,原始需求是:检索name是(aaa或者bbb)的前10条记录,其中一种写法,如下,有朋友就问到,如果需求是:检索name是aaa的所有记录,以及前10条name是bbb的,如何实现?为了方便说明,我们增加了数据,现在表中数据,如下所示,有19条aaa和11条bbb,针对这个需求,“name是aaa”,这个很简单,就不说了,关键是如何同时得到“前10条name是bbb”。第一种写法惯性思维,我们先看下,如何得到“前10条name是bbb”,下面是其中一种,现在的问题,就是如何同“name是aaa”的所有记录,进行整合。相当于合并两个结果集,用的连接关键字,肯定是OR,“前10条name是bbb”,可以考虑使用rowid,直接定位结果集。通过子查询,将两个结果集,进行了合并,得到的结果集,应该是19条aaa,和10条bbb,总计29条记录,第二种写法Oracle提供了分析函数,功能非常强大,在这方面,我算是菜鸟,用的很少,不过针对这需求,倒是可以用row_number(),他会为查询出来的每一行记录生成一个

  • 机器学习系列-机器学习是什么?

    概述机器学习现在已经运用在很多领域和行业,比如通过机器学习系统来提高自己系统的准确率和目标、进行商业数据的分析与预测等等。机器学习是关于计算机基于数据构建的概率统计模型并运用模型对数据进行预测和分析。 机器学习:一个系统能够通过执行某个过程改进它的性能,它的对象是数据,从数据出发,提取数据的特征,抽象出数据的模型,发现数据中的知识,又回到对数据的分析和预测中去。 机器学习关于数据的基本假设是同类数据具有一定的统计规律性,这是统计学习的前提。机器学习方法机器学习致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。计算的手段有很多方法,下面介绍一下机器学习方法 1.supervisedlearning-监督学习 2.unsupervisedlearning-无监督学习 3.semi-supervisedlearning-半监督学习 4.reinforcementlearning-强化学习 从给定的、有限的、用于学习的训练数据集合出发,假设数据时独立同分布产生的,并且假设要学习的模型属于每个函数的集合成为假设空间,应用某个评价准则,从假设空间中选取一个最优的模型,使它对未知数据在给定

  • 曲线点抽稀算法-Python实现

    目录[-]何为抽稀在处理矢量化数据时,记录中往往会有很多重复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不光滑或不符合标准。因此要通过某种规则,在保证矢量曲线形状不变的情况下,最大限度地减少数据点个数,这个过程称为抽稀。 通俗的讲就是对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度保持原有形状。比较常用的两种抽稀算法是:道格拉斯-普克(Douglas-Peuker)算法和垂距限值法。道格拉斯-普克(Douglas-Peuker)算法Douglas-Peuker算法(DP算法)过程如下:1、连接曲线首尾两点A、B;2、依次计算曲线上所有点到A、B两点所在曲线的距离;3、计算最大距离D,如果D小于阈值threshold,则去掉曲线上出A、B外的所有点;如果D大于阈值threshold,则把曲线以最大距离分割成两段;4、对所有曲线分段重复1-3步骤,知道所有D均小于阈值。即完成抽稀。这种算法的抽稀精度与阈值有很大关系,阈值越大,简化程度越大,点减少的越多;反之简化程度越低,点保留的越多,形状也越趋于原曲线。下面

  • 操作Linux这些命令够用了

    操作Linux这些命令够用了玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了。当然你也可以在使用时去找一下man,他会帮你解决不少的问题。然而每个人玩Linux的目的都不同,所以他们常用的命令也就差异非常大,而我主要是用Linux进行C/C++和shell程序编写的,所以常用到的命令可以就会跟一个管理Linux系统的人有所不同。因为不想在使用是总是东查西找,所以在此总结一下,方便一下以后的查看。不多说,下面就说说我最常用的Linux命令。1、cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。如:cd/root/Docements#切换到目录/root/Docementscd./path#切换到当前目录下的path目录中,“.”表示当前目录cd../path#切换到上层目录中的path目录中,“..”表示上一层目录2、ls命令这是一个非常有用的查看文件与目录的命令,list之意,

  • Leetcode 202 Happy Number

    Writeanalgorithmtodetermineifanumberis"happy".Ahappynumberisanumberdefinedbythefollowingprocess:Startingwithanypositiveinteger,replacethenumberbythesumofthesquaresofitsdigits,andrepeattheprocessuntilthenumberequals1(whereitwillstay),oritloopsendlesslyinacyclewhichdoesnotinclude1.Thosenumbersforwhichthisprocessendsin1arehappynumbers.Example: 19isahappynumber12 +92 =8282 +22 =6862 +82 =10012 +02 +02 =1判断一个数是否为快乐数。正常做法是不断迭代,用map记录出现过的数字,如果出现了则表示循环返回false,变成1则返回true。做完正常的做法去看了一下discuss,有人通

  • 知识要点

    事务,常用于多条数据的增删查改  例子: try {1: DbClient.Ado.BeginTran(); DbClient.Saveable(model).UpdateIgnoreColumns(a=>new{a.createdOn,a.createdBy}).InsertIgnoreColumns(a=>new{a.modifiedOn,a.modifiedBy}).ExecuteCommand(); DbClient.Deleteable<crms_membership_group_detail>().Where(a=>a.crms_membergroup_hdrId==model.crms_membership_group_headerId).ExecuteCommand(); if(list.Count>0)DbClient.Saveable(list).ExecuteCommand(); 2: DbClient.Ado.CommitTran(); returnOkResult(true); } catch(Excepti

  • KAFKA 目录

    1基础 KAFKA基础(一):KAFKA概述 KAFKA基础(二):Kafka集群部署 KAFKA基础(三):Kafka架构深入(1)Kafka工作流程及文件存储机制 2架构 KAFKA基础(5):Kafka架构深入(3)Kafka生产者(2)生产者分区  KAFKA基础(6):Kafka架构深入(4)Kafka生产者(3)生产经验(1)提高吞吐量/数据可靠性/数据去重/数据有序/数据乱序  KAFKA基础(7):Kafka架构深入(5)KafkaBroker(1)KafkaBroker工作流程 KAFKA基础(8):Kafka架构深入(6)KafkaBroker(2)生产经验  KAFKA基础(9):Kafka架构深入(7)KafkaBroker(3)文件存储/高效读写数据 KAFKA基础(10):Kafka架构深入(8)Kafka消费者(1) KAFKA基础(11):Kafka架构深入(9)Kafka消费者(2)生产经验(1)分区的分配以及再平衡  KAFKA基础(12):Kafka架构深入(10)Kafka消费者(3)offset位移 KA

  • SQL Server解惑&mdash;&mdash;为什么你拼接的SQL语句换行符失效了?

     在SQLServer数据库的维护管理当中,我们经常要用SQL语句生成一些维护操作的SQL语句,例如,我们要批量的修改数据库的恢复模式。如下所示: --===========================================================================================================================复制--ScriptName:change_recovery_model_to_full.sql复制--Author:Kerry复制--CreateDate:2015-12-18复制--Description:将用户数据库的恢复模式从简单模式切换为完整模式。复制/******************************************************************************************************************复制Parameters:参数说明复制**************************

  • C++ Primer 第五版示例gcc源码

    官方资源,原封不动的。对应于GCC,因此文件名是以此命名的。 门牌号: https://github.com/ZeroPhong/Learning-Resource/blob/master/GCC_4_7_0.zip

  • 记大纲 填充大纲下面知识点

      记大纲 填充大纲下面知识点  填充例子  默写代码  对照笔记填充      TRANSLATEwithx English Arabic Hebrew Polish Bulgarian Hindi Portuguese Catalan HmongDaw Romanian ChineseSimplified Hungarian Russian ChineseTraditional Indonesian Slovak Czech Italian Slovenian Danish Japanese Spanish Dutch Klingon Swedish English Korean Thai Estonian Latvian Turkish Finnish Lithuanian Ukrainian French Malay Urdu German Maltese Vietnamese Gree

  • PHP获取Opcode及C源码

    是什么 在开始之前,必须要先介绍一下Opcode是什么. 众所周知,Java在执行的时候,会将.java后缀的文件预先编译为.class字节码文件,JVM加载字节码文件进行解释执行.而字节码文件存在的意义,就是为了加速执行. 那么PHP的Opcode与之类似,也是从.php文件到执行的过程中,所生成的预编译中间文件. 或者也可以这样粗鲁的理解,PHP程序是由C写的二进制程序,Opcode就是将.php文件翻译为c代码的结果. Opcode有什么用我们最后再说,先让我们看一下它长什么样子 获得 如何获得php文件的opcode呢?在PHP的源码中,可以通过c函数zend_compile_string获取PHP代码解析后的Opcode.但是我们要是为了获取Opcode得深入到c,是在有些得不偿失.好在,已经有前辈做好的扩展可直接获取.既:vld. vld扩展 安装扩展: #安装扩展 peclinstallhttps://pecl.php.net/get/vld #启用扩展.若不是docker,将"extension=vld.so"写入php.ini即可 docker-php-ext-ena

  • 【转】excel音标乱码

    源地址:https://zhidao.baidu.com/question/204553900.html 百度一个音标字体文件,下载后再拷贝到C:\WINDOWS\FONTS目录下面就可以了 下载地址:https://en-yinbiao.xiao84.com/2014/5210.html,我用第一个金山的就可以  

  • 小程序 ------ 弹窗的提示文字中添加链接

     页面展示: 在弹窗中点击链接后打开对应页面 实现: 借助modal组件,相当于一个弹窗组件,可以在里面添加其他组件共同组成一个弹窗页面    常用的属性 1、wxml中  hidden控制弹窗的打开与关闭 <viewclass="auth-btn"> <van-buttontype="primary"bind:click="buttonTap"size="large"block>我是求职者</van-button> <modaltitle="温馨提示"hidden="{{modalHidden}}"confirm-text="同意"cancel-text="不同意"bindconfirm="modalConfirm"bindcancel="modalCandel"> 亲,感谢您信任并使用本小程序obge!我们依据最新的法律法规、监管政策要求及业务实际情况更新了小程序obge <navigatorstyle="display:inline;color:#009e92;"url=

  • linux下python3离线加载nltk_data,不用nltk.download()

    在不能上网的服务器上把nltk_data关联到python3,已经安装anaconda3所以不需要安装nltk,环境是linux 首先没有nltk_data在使用nltk会报错 LookupError: ********************************************************************** Resource'tokenizers/punkt/PY3/english.pickle'notfound. PleaseusetheNLTKDownloadertoobtaintheresource:>>> nltk.download() Searchedin: -'/home/hadoopcj/nltk_data' -'/usr/share/nltk_data' -'/usr/local/share/nltk_data' -'/usr/lib/nltk_data' -'/usr/local/lib/nltk_data' -'/home/hadoopcj/nltk_data' -''复制 1.下载nltk_data htt

相关推荐

推荐阅读