精华内容
下载资源
问答
  • OpenCV中的模板匹配函数:cvMatchTemplate void cvMatchTemplate{ const CvArr* image, const CvArr* temp1, CVArr* result, int method };
  • python实现 字符串匹配函数

    千次阅读 2019-04-16 20:04:58
    通配符是 shell 命令中的重要功能, ? 表示匹配任意 1 个字符, *表示匹配 0 个或多个字符。...请使用你熟悉的编程语言实现一个字符串匹配函数, 支持 ? 和 * 通配符。如 “a?cd*d” 匹配 “abcdaccd” ...

    通配符是 shell 命令中的重要功能,

    ? 表示匹配任意 1 个字符,

    *表示匹配 0 个或多个字符。

    请使用你熟悉的编程语言实现一个字符串匹配函数,

    支持 ? 和 * 通配符。如 “a?cd*d” 匹配 “abcdaccd”

     

    展开全文
  • Emgu 模板匹配函数MatchTemplate理解

    千次阅读 2018-06-17 01:05:32
    简介 ...于是可以使用Emgu的模板匹配函数MatchTemplate来匹配字符串“ED”,以确定字符串的开始位置,截取图片,然后使用Tesseract OCR来识别截取的图片中的字符串. MatchTemplate口: void M...

    简介
    最近做一个识别护照护照号码OCR的项目,需要识别一张图像的护照号码,每张图片的号码的位置有些变化,这样就不好截取护照号码的图像,好在护照号码的以“ED”开头,长度,宽度固定.于是可以使用Emgu的模板匹配函数MatchTemplate来匹配字符串“ED”,以确定护照号码的开始位置,截取图片,然后使用Tesseract OCR来识别截取的图片中的护照号码.

    MatchTemplate接口:
    void MatchTemplate(IInputArray image, IInputArray templ, IOutputArray result, TemplateMatchingType method, IInputArray mask = null);
    参数解释:
    image-被匹配的图像矩阵(W*H)
    templ-模板图像矩阵(w*h)
    result-匹配结果矩阵((W-w)(H-h)):templ图像和image的卷积即temp在image图像上面从左到右,从上往下滑动,所以矩阵的大小是((W-w)(H-h)),result矩阵存放的数据是每个位置的图像的匹配度.
    method-图像的匹配度计算方法:
    method=TemplateMatchingType.Sqdiff,使用平方差的方法计算匹配度,很显然匹配度越高,平方差的和就越小,如果完全匹配,则平方差的和就为0,使用MinMaxLoc计算矩阵最大 最小值的时候,需要取最小值的位置坐标.
    这里写图片描述

    method=TemplateMatchingType.CcorrNormed,使用归一化相关系数匹配法计算匹配度.这个公式使用使用余弦相似度计算两个图像矩阵的相似度.详情参考(https://blog.csdn.net/u012160689/article/details/15341303),所以,匹配度越高,相关系数就越大,如果完全匹配,则相关系数为1(0度夹角的余弦值为1,完全相似),使用MinMaxLoc计算矩阵最大 最小值的时候,需要取最大值的位置坐标.
    这里写图片描述
    - 代码

            /// <summary>
            /// 获取匹配图像的位置
            /// </summary>
            /// <param name="Src">被匹配的源图像</param>
            /// <param name="Template">模板图像</param>
            /// <returns>匹配位置</returns>
            Rectangle GetMatchPos(Mat Src,Mat Template)
            {
                Mat MatchResult = new Mat();//匹配结果
                CvInvoke.MatchTemplate(Src, Template, MatchResult, Emgu.CV.CvEnum.TemplateMatchingType.CcorrNormed);//使用相关系数法匹配
                Point max_loc = new Point();
                Point min_loc = new Point();
                double max = 0, min = 0;
                CvInvoke.MinMaxLoc(MatchResult, ref min, ref max, ref min_loc, ref max_loc);//获得极值信息
                DisplayInfo("\r\nX:" + max_loc.X + " Y:" + max_loc.Y + " 最大相似度:" + max + " 最小相似度:" + min);
                return new Rectangle(max_loc,Template.Size);
            }
    

    运行效果:
    护照号码

    就这样完成了一张图片的护照号码的截取,但是有时由于翻页的机构的问题,多翻了一页,导致图片里边没有护照号码,需要提示人工翻到资料页,这时就需要使用最大相似度max判断图片是否包含护照号码,经过多个样本测试,相似度小于0.98就表示该图片里边没有护照号码,翻页机构出问题了.

    展开全文
  • 各种总线match匹配函数

    万次阅读 2012-11-13 15:28:17
    当向linux系统总线添加设备或驱动时,总是会调用各总线对应的match匹配函数来判断驱动和设备是否匹配,这些match函数之间都存在一定的差异,本文先对常用的match匹配函数进行讲解,以后会陆续添加新的内容。...

            当向linux系统总线添加设备或驱动时,总是会调用各总线对应的match匹配函数来判断驱动和设备是否匹配,这些match函数之间都存在一定的差异,本文先对常用的match匹配函数进行讲解,以后会陆续添加新的内容。 

    一. 驱动和设备匹配过程常用数据结构

    1. of_device_id

    struct of_device_id
    {
    char name[32];
    char type[32];
    char compatible[128];
    #ifdef __KERNEL__
    void *data;
    #else
    kernel_ulong_t data;
    #endif

    };

    2. platform_device_id

    struct platform_device_id {

    char name[PLATFORM_NAME_SIZE];

    kernel_ulong_t driver_data   __attribute__((aligned(sizeof(kernel_ulong_t))));

    };

    二. 平台设备、驱动匹配platform_match

              向系统添加平台驱动或添加设备时会调用平台总线platform_bus_type中的platform_match函数来匹配平台驱动和平台设备。

    static int platform_match(struct device *dev, struct device_driver *drv)
    {

    struct platform_device *pdev = to_platform_device(dev);

    struct platform_driver *pdrv = to_platform_driver(drv);

    /*通过驱动里定义了of_device_id项,则通过这一项来比对;*

    if (of_driver_match_device(dev, drv))

    return 1;

    /*如果在平台驱动中定义了id_table项,则通过对比id_table来判断*/

    if (pdrv->id_table)

    return platform_match_id(pdrv->id_table, pdev) != NULL;

    /*通过对比平台设备名字和平台驱动名字来判断*/

    return (strcmp(pdev->name, drv->name) == 0);

    }

               由platform_match可以看出,驱动和设备是否匹配可以通过三种方式来进行判断,首先是通过of_device_id结构:

    static inline int of_driver_match_device(struct device *dev, const struct device_driver *drv)
    {

    return of_match_device(drv->of_match_table, dev) != NULL;

    }

    struct of_device_id *of_match_device(const struct of_device_id *matches, const struct device *dev)
    {

    if ((!matches) || (!dev->of_node))

    return NULL;

    return of_match_node(matches, dev->of_node);

    }

    const struct of_device_id *of_match_node(const struct of_device_id *matches, const struct device_node *node)

    {

    if (!matches)

    return NULL;

    while (matches->name[0] || matches->type[0] || matches->compatible[0]) {

    int match = 1;
    if (matches->name[0])
    match &= node->name && !strcmp(matches->name, node->name);
    if (matches->type[0])
    match &= node->type && !strcmp(matches->type, node->type);
    if (matches->compatible[0])
    match &= of_device_is_compatible(node, matches->compatible);
    if (match)
    return matches;

    matches++;

    }

    return NULL;

    }

             如果driver中定义了of_device_id,则通过driver中的of_device_id和device中的device_node内容进行匹配判断,匹配工作由of_match_node来完成,该函数会遍历of_device_id列表,查找是否有成员与device_node相匹配,具体由matches的name,type和compatioble来进行对比,如果找到则返回相应的表项,否则返回null.如果没有定义of_device_id,device_node或不能找到对应的匹配项,则通过第二种方式platform_device_id来进行对比匹配,通过platform_match_id来完成:

    static const struct platform_device_id *platform_match_id( const struct platform_device_id *id, struct platform_device *pdev)
    {

    while (id->name[0]) {

    if (strcmp(pdev->name, id->name) == 0) {

    pdev->id_entry = id;

    return id;

    }

    id++;

    }

    return NULL;

    }

            platform_match_id函数遍历platfrom_device_id列表,通过比对平台设备与id的name来确定是否有匹配项,如果找到匹配的,则返回对应的id项,否则返回null。如果没有定义platform_device_id或没有找到匹配项,则通过第三种方式进行匹配,第三种方式通过比对平台设备和平台驱动的名字,如果相等,则匹配成功,否则失败。

    三. i2c设备、驱动匹配i2c_device_match

             当向i2c总线添加驱动或设备时会调用i2c_device_match来进行匹配判断,i2c_device_match函数定义如下所示:

    static int i2c_device_match(struct device *dev, struct device_driver *drv)

    {

    struct i2c_client*client = i2c_verify_client(dev);

    struct i2c_driver * driver;

    if (!client)

    return 0;

    /* 通过of_device_id匹配 */

    if (of_driver_match_device(dev, drv))

    return 1;

    driver = to_i2c_driver(drv);

    /*如果I2C 驱动中定义了id_table,则通过id_table进行匹配;*/

    if (driver->id_table)

    return i2c_match_id(driver->id_table, client) != NULL;

    return 0;

    }

    如i2c_device_match所示,i2c通过两种方式进行匹配设备和驱动,一种是of_device_id,另一种是i2c_device_id,i2c_device_id数据结构和platform_device_id一样。I2C里的两种匹配方式和之前的platform判断方式都是一样,这里就不展开。

    四. usb设备、驱动匹配usb_device_match

    当向usb总线上注册驱动或添加设备时,就会调用usb_match_device进行驱动和设备配对,函数如下:

    static int usb_device_match(struct device *dev, struct device_driver *drv)

    {

    if (is_usb_device(dev)) {

    if (!is_usb_device_driver(drv))

    return 0;

    return 1;

    } else if (is_usb_interface(dev)) {

    struct usb_interface *intf;

    struct usb_driver *usb_drv;

    const struct usb_device_id *id;

    if (is_usb_device_driver(drv))

    return 0;

    intf = to_usb_interface(dev);

    usb_drv = to_usb_driver(drv);

    id = usb_match_id(intf, usb_drv->id_table);

    if (id)

    return 1;

    id = usb_match_dynamic_id(intf, usb_drv);

    if (id)

    return 1;

    }

    return 0;

    }

            从函数可以看出,match分成两部分,一部分用于匹配usb设备,另一部分用于匹配usb 接口,对于usb设备,在初始化时会设置成usb_device_type,而usb接口,则会设成usb_if_device_type。而函数中的is_usb_device和is_usb_interface就是通过这两个属性来判别的,如果为判定为设备,则进入到设备分支,否则进入到接口分支继续判断。

            usb设备驱动通过usb_register_device_driver接口来注册到系统,而usb接口驱动则通过usb_register来注册到系统,驱动工程师的工作基本上集中在接口驱动上,所以通常是通过usb_register来注册usb驱动的。 

            不管是设备驱动usb_device_driver,还是接口驱动usb_driver数据结构中都包含了struct usbdrv_wrap项,其定义如下:

    struct usbdrv_wrap {

    struct device_driver driver;

    int for_devices;

    }

             数据结构中的for_devices用来表示该驱动是设备驱动还是接口驱动,如果为设备驱动,则在用usb_register_device_driver注册时,会将该变量for_devices设置成1,而接口驱动则设为0.

            usb_device_match中的is_usb_device_driver函数就是通过获取上而结构中的for_devices来进行判断是设备还是接口驱动的,函数定义如下:

    static inline int is_usb_device_driver(struct device_driver *drv)

    {

    return container_of(drv, struct usbdrv_wrap, driver)->for_devices;

    }

            当进入is_usb_device分支后,再通过is_usb_device_driver来判断是否为设备驱动,如果是则返回1,表示匹配成功,它接受所有usb设备。

            当进入到接口分支后,也会先用is_usb_device_driver来进行判断,如果不是设备驱动则继续判断,否则退出;然后再通过usb_match_id函数来判断设备和驱动中的usb_device_id是否匹配,usb_match_id定义如下:

    const struct usb_device_id *usb_match_id(struct usb_interface *interface,  const struct usb_device_id *id)
    {

    if (id == NULL)

    return NULL;

    for (; id->idVendor || id->idProduct || id->bDeviceClass ||  id->bInterfaceClass || id->driver_info; id++) {

    if (usb_match_one_id(interface, id))

    return id;

    }

    return NULL;

    }

             遍历接口驱动中的usb_device_id列表项,只要usb_device_id结构中的idVendor,idProduct,DeviceClass,binterfaceClass,driver_info项有效就调用usb_match_one_id进行判断,如找到匹配项则函数返回1,否则返回0 。

    int usb_match_one_id(struct usb_interface *interface,const struct usb_device_id *id)
    {

    struct usb_host_interface *intf;

    struct usb_device *dev;

    if (id == NULL)

    return 0;

    intf = interface->cur_altsetting;

    dev = interface_to_usbdev(interface);

    if (!usb_match_device(dev, id))

    return 0;

    if (dev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC && 
     !(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&

    (id->match_flags & (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)))

    return 0;

    if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&

     (id->bInterfaceClass != intf->desc.bInterfaceClass))

    return 0;

    if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) && 

    (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass))

    return 0;

    if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) && 

     (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol))

    return 0;

    return 1;

    }

    usb_match_one_id和函数中的usb_match_device都是围绕着usb_device_id进行匹配的,该结构定义如下:

    struct usb_device_id {

    /* which fields to match against? */

    __u16 match_flags;

    /* Used for product specific matches; range is inclusive */

    __u16 idVendor;

    __u16 idProduct;

    __u16 bcdDevice_lo;

    __u16 bcdDevice_hi;

    /* Used for device class matches */

    __u8 bDeviceClass;

    __u8 bDeviceSubClass;

    __u8 bDeviceProtocol;

    /* Used for interface class matches */

    __u8 bInterfaceClass;

    __u8 bInterfaceSubClass;

    __u8 bInterfaceProtocol;

    /* not matched against */

    kernel_ulong_tdriver_info;

    };

              match_flags用来规定驱动匹配时的具体项,如match_flags包含USB_DEVICE_ID_MATCH_VENDOR,则是通过驱动中的usb_device_id和设备dev中的idVendor来判断。



    展开全文
  • 目录 Vlookup函数 Index函数 ...常见的关联匹配函数: Vlookup Index Match Row Column Offset Vlookup函数 Vlookup函数的含义:调用符合条件的数据Vlookup函数的语法格式: =vlookup(lookup_v...

    目录

    1. Vlookup函数
    2. Index函数
    3. Match函数
    4. Index函数和Match函数联合使用
    5. Row函数和Column函数
    6. Offset函数

    常见的关联匹配函数:

    • Vlookup
    • Index
    • Match
    • Row
    • Column
    • Offset

    Vlookup函数

    Vlookup函数的含义:调用符合条件的数据
    Vlookup函数的语法格式:
    =vlookup(lookup_value, table_array, col_index_num, [range_lookup])
    解释:=vlookup(查找值,查找区域,返回查找区域第N列,查找模式)。
    应用:

    vlookup函数中的四个参数不太好理解,接下来,一步步解释每个参数的意义:

    ① lookup_value表示需要查找的值,作为函数查找的标识。比如,我们要在如下的表格中,查找出E列中三家公司对应的薪水,那么lookup_value参数就设置为E2单元格。

    ② table_array参数表示需要查找的目标单元格范围,这里设置为$A$2:$B$23。

    ③ col_index_num参数表示返回查找范围中的列数,比如我们需要返回薪水,而薪水在查找范围中在第二列,所以设置为2。

    ④ range_lookup参数若为设置为TRUE值,则为近似匹配,若参数设置为FALSE,则为精确匹配。这里设置为0或者FALSE。

    回车,对应的薪水则匹配完成。再使用填充功能,完成剩下的匹配。

    Index函数

    从字面上index函数貌似有些费解,具体应用时可加深理解。

    Index函数的语法格式:
    数组形式——=index(array,row_num,column_num)
    引用形式——=index(reference,row_num,column_num,area_num)
    解释:① Array为单元格区域或数组常数;Row_num为数组中某行的行序号,函数从该行返回数值。Column_num是数组中某列的列序号,函数从该列返回数值。② Reference是对一个或多个单元格区域的引用,如果为引用输入一个不连续的选定区域,必须用括号括起来。Area_num是选择引用中的一个区域,并返回该区域中row_num和column_num的交叉区域。

    应用:

    如下,单元格C14返回了A1:H11区域中第五行、第三列的数据。(数组形式)

    再来看index函数的引用形式,与数组形式不同的是,引用形式可以选定多个区域。如下图,最后一个参数area_num指定的是2,所以函数返回了第二个区域中的第三行第三列,即6.9。

    若area_num参数不指定,则默认为1,如下,函数返回了第一个区域的第三行第三列。

    Match函数

    Match函数的含义:Match函数即匹配函数,指返回指定数值在指定数组中的位置。
    Match函数的语法格式:
    =match(lookup_value, lookup_array, [match_type])
    解释:=match(查找值,查找区域,返回查找值的位置)。
    应用:

    如图,函数返回列B2:B11中值等于74的单元格所在位置。注意,match函数的lookup_array参数必须为一维数组,即只能指定某一行或某一列,最后一个参数match_type若为0,则表示精确匹配,即表示查找等于74的值。

    再来看看参数match_type值为1或-1时的情形:1表示小于,-1表示大于,但若match_type参数为非0,则lookup_array需升序或降序排序。Excel中会给出相应提示:

    如图,函数返回列B2:B11中小于值70的单元格所在位置。

    Index函数和Match函数联合使用

    如下,合理使用index函数和match函数的嵌套,可以达到vlookup函数的效果:

    再使用vlookup函数做一遍:

    Row函数和Column函数

    Row/Column函数的含义:返回所选择的某一个单元格的行/列数。
    Row/Column函数的语法格式:
    =row/column(reference)

    解释:如果省略reference,则默认返回row/column函数所在单元格的行数。
    函数用法比较简单,具体需要结合其他函数一起使用,可发挥大作用。

    Offset函数

    Offset函数的含义:以指定的(单元格或相连单元格区域的引用)为参照系,通过给定偏移量得到新的引用。 返回的引用可以是一个单元格也可以是一个区域(可以指定行列数)。
    Offset函数的语法格式:
    =offset(reference,rows,cols,height,width)
    解释:=Offset(参照单元格,行偏移量,列偏移量,返回几行,返回几列)
    应用:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • opencv学习: 模板匹配函数matchTemplate

    千次阅读 2015-03-10 14:58:19
    opencv中的模板匹配函数matchTemplate可以在模板块和输入图像之间寻找匹配,获得匹配结果图像。 函数原型: void cv::matchTemplate( InputArray _img, InputArray _templ, OutputArray _result, int method ); _img...
  • OpenCV模板匹配函数:matchTemplate()介绍 原理介绍:模板匹配是一种最原始、最基本的模式识别方法。研究某一特定对象物图案位于图像什么位置,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的...
  • Hive 正则匹配函数

    千次阅读 2019-06-20 17:39:34
    正则匹配字符解释: ^ 表示开头 $ 表示结尾 . 表示任意字符 * 表示任意多个 1、元字符匹配 (.) 表示匹配除换行符以外的任意字符。 (\w) 表示匹配字母、下划线、数字或汉字(\\W)。 (\d) 表示匹配数字 (\s) ...
  • PHP 正则表达式匹配函数 preg_match 与 preg_match_allpreg_match()preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。语法:1int preg_match( string pattern, string subject [, array ...
  • opencv中的匹配函数matchTemplate

    千次阅读 2018-05-31 12:09:51
    使用OpenCV函数 matchTemplate 在模板块和输入图像之间寻找匹配,获得匹配结果图像使用OpenCV函数 minMaxLoc 在给定的矩阵中寻找最大和最小值(包括它们的位置).原理什么是模板匹配?模板匹配是一项在一幅图像中...
  • js 正则表达式匹配函数

    千次阅读 2019-02-20 15:04:58
    函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null 。 < / b > < / p > < / div > < / template > < script > export default { name : 'Regex' , data ( ) ...
  • regexp_extract函数 语法: regexp_extract(string subject, string pattern, int index) 返回值: string 说明: 将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。 第一参数: 要...
  • OpenCV3学习(8.3)模板匹配函数matchTemplate详解

    万次阅读 多人点赞 2019-02-09 15:12:49
    opencv实现了一部分通过模板与目标图像进行寻找最佳匹配的方面matchTemplat();这个方法网上有很多讲解,基本思想是将模板图像在目标图像上滑动逐一对比,通过统计的基本方法进行匹配,比如方差检验,相关性检验等...
  • R匹配函数match.fun

    千次阅读 2016-11-04 19:21:30
    R允许将函数作为参数,但如果有一个与函数同名的对象,如下所示: > print > test + fun(o) + } > test(print,fun=print) Error in test(print, fun = print) : 没有"fun"这个函数 出错,没有...
  • 查找匹配函数FIND和SEARCH的基本用法

    千次阅读 2020-07-21 17:43:45
    一、Excel中FIND函数和SEARCH函数的用法 FIND函数区分大小写,不支持通配符 **SEARCH ** 函数不区分大小写,支持通配符 有这样一个产品: 注:文本 “KitchenAId 和 Stockwell”内有空格 现在我们看这两个函数的...
  • 初衷是想使用js的match函数配合正则表达式来匹配正确的ip格式,出现问题 var reg = /^([1-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){2}([1-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0...
  • vba中的查找匹配函数

    万次阅读 2015-09-29 10:42:52
    最朴树的find例子:Range("G4") = Range("B:B").Find(Range("G3")).Row解释: Range(“B:B”)表示要查找的...Row返回查找到的位置的行数工作表函数Match例子Range("A1") = application.WorksheetFunction.Match(Ran
  • 正则匹配函数——regcomp和regexec

    万次阅读 2011-01-12 11:50:00
    1.int regcomp(regex_t *compiled, const char *pattern, int cflags)这个函数把指定的规则表达式pattern编译成一种特定的数据格式compiled,这样可以使匹配更有效。函数regexec会使用这个数据在目标文本串中进行...
  • 利用MYSQL提供的正则匹配表达函数实现多个条件作用下的查询
  • 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题 1、声明/定义重载函数时,是如何解决命名冲突...
  • 注: (1)pre_match只匹配一次,而pre_match_all匹配所有的(2)前者是一维数组,而后者是二维数组(3)函数返回值对应匹配次数 注: (1)两者支持数组匹配替换,即$pattern, $replacement, $subject均可以为数组...
  • 昨天使用opencv2.3.1的SURF特征做特征点匹配时,发现了drawMatches函数总是出问题,异常提示为vector溢出?百思不得其解,为什么别人用的好好的,到我这就溢出了??!!!  今天仔细研究了一下opencv的手册,终于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 945,374
精华内容 378,149
关键字:

匹配函数