精华内容
下载资源
问答
  • 如何匹配
    千次阅读
    2021-11-19 14:16:02

    前言

    双目立体匹配的原理类似于人类的视觉原理:分别单独使用左眼和单独使用右眼去观察一个物体,该物体在两个视角中的相对位置会存在一定的偏移,人类视觉系统可以根据该偏移去判断该物体的距离远近。

    同样的,在双目立体匹配中,只要能在两张图像中正确地找到匹配点,结合相机的内部参数和外部参数,就能精准地计算出空间点距离拍摄相机的距离。

    目录

    一、立体匹配简介

    二、国内外研究现状

    更多相关内容
  • 立体视觉入门指南(7):立体匹配

    千次阅读 多人点赞 2022-02-12 12:07:47
    关于立体匹配,我之前写了很多博客,重复去写就没有必要,学习的朋友请阅读如下链接,本文我们随便聊聊立体匹配的方法论和弱纹理恢复问题。

    关于立体匹配,我之前写了很多博客,重复去写就没有必要,学习的朋友请阅读如下链接。

    本文我们随便聊聊立体匹配的方法论和弱纹理恢复问题。

    立体匹配系列

    0

    双目立体匹配步骤详解

    1 SGM系列

    理论恒叨系列

    【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
    【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换
    【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)
    【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化

    码上实战系列

    【码上实战】【立体匹配系列】经典SGM:(1)框架与类设计
    【码上实战】【立体匹配系列】经典SGM:(2)代价计算
    【码上实战】【立体匹配系列】经典SGM:(3)代价聚合
    【码上实战】【立体匹配系列】经典SGM:(4)代价聚合2
    【码上实战】【立体匹配系列】经典SGM:(5)视差优化
    【码上实战】【立体匹配系列】经典SGM:(6)视差填充
    【码上实战】【立体匹配系列】经典SGM:(7)弱纹理优化

    2 PatchMatch系列

    理论恒叨系列

    【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
    【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计
    【理论恒叨】【立体匹配系列】经典PatchMatch: (3)后处理(一致性检查与视差填充)

    码上实战系列

    【码上实战】【立体匹配系列】经典PatchMatch: (1)框架
    【码上实战】【立体匹配系列】经典PatchMatch: (2)主类
    【码上实战】【立体匹配系列】经典PatchMatch: (3)随机初始化
    【码上实战】【立体匹配系列】经典PatchMatch: (4)代价计算
    【码上实战】【立体匹配系列】经典PatchMatch: (5)迭代传播
    【码上实战】【立体匹配系列】经典PatchMatch: (6)后处理

    3 AD-Census系列

    理论恒叨系列

    【理论恒叨】【立体匹配系列】经典AD-Census: (1)代价计算
    【理论恒叨】【立体匹配系列】经典AD-Census: (2)十字交叉域代价聚合(Cross-based Cost Aggregation)
    【理论恒叨】【立体匹配系列】经典AD-Census: (3)扫描线优化(Scanline Optimization)
    【理论恒叨】【立体匹配系列】经典AD-Census: (4)多步骤视差优化

    码上实战系列

    【码上实战】【立体匹配系列】经典AD-Census: (1)框架
    【码上实战】【立体匹配系列】经典AD-Census: (2)主类
    【码上实战】【立体匹配系列】经典AD-Census: (3)代价计算
    【码上实战】【立体匹配系列】经典AD-Census: (4)十字交叉域代价聚合
    【码上实战】【立体匹配系列】经典AD-Census: (5)扫描线优化
    【码上实战】【立体匹配系列】经典AD-Census: (6)多步骤视差优化

    如果你能学会SGM和PatchMatch,那么立体匹配你就完全入门了。

    关于方法论

    而真正需要学习的是立体匹配的方法论,从SGM算法,你可以学习马尔科夫随机场是如何应用于立体匹配的,进而你可以深入去了解马尔科夫随机场这个经典的理论,它在三维重建里应用比较广泛,你会在不同的地方看到它的身影,简而言之,大部分标签分配问题都可以用马尔科夫随机场来建模,而解决马尔科夫随机场这个能量最优问题,都是用效率高的近似方法,比如SGM的扫描线优化(Scanline Optimize)、动态规划(Dynamic Programming)、置信度传播(Belief Propagation)、合作优化(Cooperative Optimization)等。

    我们会发现,无论在科学研究还是在工程实践中,建模都很重要且关键,当你发现立体匹配问题可以转化为标签分配问题便很快想到可以用马尔科夫随机场建模,进而尝试用众多成熟的优化算法之一去解决问题。大多数论文都是这样产出,研究进展的突破就在你转化问题的那一瞬间,当然前提是你要掌握一定数量的算法模型,这便是你应该掌握的基本知识之一。

    而从PatchMatch算法上,和SGM对比我们可以明显感知到,基于离散空间的标签分配方法似乎并不是立体匹配问题的最优解,而基于连续空间的视差平面方法,在精度和效果上有明显的优势。尤其是在边界和细小结构的恢复上,离散空间带来的不精确性以及SGM的代价聚合模型对边界的处理并不清晰(或者说并不精确),使得SGM和PatchMatch差距明显,下图是一个例子:

    原图
    SGM
    PatchMatch

    边界恢复问题,并不能说是离散空间的问题,现在的深度神经网络,本质上还是离散空间的标签分配方法,但是将效果提升到了另一层次,对边界的恢复也比传统的标签分配方法要更好,但是在最终点云的精度上,对比PatchMatch并没有显现出优势,如果深度神经网络能在精度上打败传统几何算法,那算得上是一种全方位的颠覆,但是这并非不可能发生,因为目前所知的传统算法也并非在最好的状态,就算目前来看几何精度最好的PatchMatch也有精度分辨率,最终视差精细化时还是落到了离散空间,所以它未来被深度学习网络超越是可能的。

    我觉得理论上的观点是,如果深度学习和传统几何都受到同样的关注度和研究度,那么传统几何算法的结果精确度一定会持续表现出优势,而深度学习的结果完整度和准确度也让传统几何算法难以望其项背。但是现实情况是,深度学习有着远超传统几何算法的关注度和研究度,这一定程度上导致深度学习和某些注重精度的工业实践中存在一个鸿沟,所以你可以看到,在精度无比重要的精确测量领域,比如工业测量、测绘、定位抓取等,深度学习还很少应用,反而是原理简单而精度很高的结构光重建技术大行其道。

    而在一些不过分追求高精度的应用中,比如自动驾驶里的深度获取,并不需要每个点的精度都非常高,而完整度显得更重要,毕竟车前是否有物,和其离车距离是否足够精确两者之间,显然前者要更重要;再比如目前很流行的深度相机,虽然大多都是传统算法,但实际上很多情况下其并不需要非常高的精度,而采用传统算法居多的原因是传统算法的低算力,如果深度学习算力要求下降,或者芯片算力增强,则深度学习也将变得主流。

    关于弱纹理恢复问题

    弱纹理恢复是立体匹配的老大难,辐射差异对所有立体匹配来说至关重要,这是区分两个点是否为同一点的最关键信息。但是弱纹理的辐射差异十分微小且辐射值高度相似,这给基于局部窗口的立体匹配方法带来很大困难。

    目前我所知的弱纹理恢复方法,大体上是有两类,一类是聚类分割法、一类是多尺度估计法。

    聚类分割法建立的假设是局部的一块颜色相近的弱纹理区域极可能是属于同一块连续表面的,通常这个表面会假设为一个平面,在这个假设下有两类具体的思路去完成优化:
    1、先对所有像素完成视差估计,在对像素进行聚类分割,对于恢复失败的像素,用同一块内的其他有效视差进行平面拟合,拟合方程可用来填补该缺失像素。
    2、先对像素进行聚类分割,再基于聚类后的尺度上进行立体匹配,再将匹配结果映射到细粒度的像素尺度上。
    这类方法实际应用是很少的,因为其假设看上去有明显缺陷,聚类分割本身就存在过分割和欠分割的问题难解决,且前景背景颜色相近的情况并不少见,这让问题反而变得更加棘手。

    我这里想多聊聊另一类方法:多尺度估计方法。尺度是在我们人类感知中很重要的因子,如果将一块纯白的墙超近距离放在你的眼前,你肯定一头雾水,不知道这是什么东西,而且你的距离感会非常弱,感知不到这东西离你的眼睛到底有多远。而当距离慢慢拉远,你渐渐看到了墙周围的信息而推断出这是一堵墙,且距离感也会越来越清晰。尺度的大小决定了我们在有限视野内能接受到的信息范围,显然信息范围越大对我们的识别和定位都有好处,但也要认识到信息范围越大同时也会导致单位元尺寸下的信息清晰度变弱,两者必然是相互矛盾的。

    回到立体匹配问题上,我们显然无法单靠一个像素信息来完成左右像素的配对,像素周围的局部信息是必须的,但是前提是局部窗口有足够的信息熵,在上一个例子来说,在距离拉远的过程中,在看到白墙轮廓之前,你都依旧无法识别它,所以对弱纹理来说,对局部信息范围的扩大需求显得尤为突出,我们认识到周围信息的范围对识别并定位能力非常重要,所以我们希望更大的窗口以接受更大范围的信息,所以增大窗口尺寸往往对弱纹理的优化有一定的帮助。

    但增大窗口尺寸往往带来的是增大数倍的计算量,所以其实更实用的是减小图像分辨率,生成多个分辨率下的多尺度图像,在低分辨率尺度上对弱纹理取得更好的效果并投影到高分辨率尺度上。

    我这里做了组对比实验来验证多尺度下的的SGM算法效果:

    原图
    原图匹配
    1/2图匹配
    1/4图匹配

    随着图像分辨率尺度的变小,在墙面上的视差越来越完整。这是多尺度匹配有助于恢复弱纹理的一个佐证。

    好了本篇就到这里了,时隔半年的更新,希望能给到你帮助,再见!

    展开全文
  • 最近在做图像检测上的项目,需要进行图像匹配的相关内容,查阅了opencv的匹配方法,整理了模版匹配和特征点匹配的内容,并总结成博客。 模版匹配与特征点匹配 模板匹配 模版匹配是一种最原始、最基本的识别方法。...

    最近在做图像检测上的项目,需要进行图像匹配的相关内容,查阅了opencv的匹配方法,整理了模版匹配和特征点匹配的内容,并总结成博客。

    模版匹配与特征点匹配

    • 模板匹配
      模版匹配是一种最原始、最基本的识别方法。简单来说,模板匹配就是用一幅已知的模板图片在目标图片上依次滑动(类似于滑窗法),每次滑动都计算模板与模板下方的目标子图的相似度
      但模板匹配具有一定的局限性,也是我在实际操作时发现的。局限性主要表现在模版图片只能在目标图标上进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。也就是说,如果模版图片和目标子图上的方向、大小不一致,则无法匹配成功。

    • 特征点匹配
      特征匹配(FBM),也称为角点匹配,就是指将从影像中提取的特征作为共轭实体,而将所提特征属性或描述参数(实际上是特征的特征)作为匹配实体,通过计算匹配实体之间的相似性测度以实现共轭实体配准的影像匹配方法。即指寻找两幅图像之间的特征像素点的对应关系,从而确定图像的位置关系。
      在匹配目标发生旋转或大小变化时,该算法依旧有效。

    模版匹配

    模板匹配就是用一幅已知的模板图片在目标图片上依次滑动(类似于滑窗法),每次滑动都计算模板与模板下方的目标子图的相似度

    如果是单个目标的匹配,只需要取相似度最大值所在的位置就可以得到匹配位置。

    如果要匹配多个目标,设定一个合理的阈值,只要相似度大于阈值则认为是匹配的目标。

    # cv2中使用matchTemplate进行模版匹配
    result = cv2.matchTemplate(target,template,cv2.method)
    

    matchTemplate提供了六种模版匹配方法

    • cv2.TM_SQDIFF(差值平方和匹配):该方法计算模板与某个子图的对应像素的差值平方和。因此最佳的匹配结果在结果为0处,越相似值越小,值越大匹配结果越差。

    • cv2.TM_SQDIFF_NORMED(标准化差值平方和匹配):该方法使用归一化的平方差进行匹配,最佳匹配也在结果为0处。

    • cv2.TM_CCORR(相关匹配法):该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳匹配位置在值最大处,值越小匹配结果越差。

    • cv2.TM_CCORR_NORMED(归一化相关匹配):归一化的相关性匹配方法,去除了亮度线性变化对相似度计算的影响。可以保证图像和模板同时变量或变暗k倍时结果不变。与相关性匹配方法类似,最佳匹配位置也是在值最大处,越相似值越大。

    • cv2.TM_CCOEFF(相关性系数匹配方法):该方法使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关。

    • cv2.TM_CCOEFF_NORMED(归一化的相关性系数匹配方法):把图像和模板都减去了各自的平均值,再各自除以各自的方差,保证图像和模板分别改变光照不影响计算结果,计算出的相关系数限制在-1到1之间,1 表示完全相同,-1 表示两幅图像的亮度正好相反,0 表示没有线性关系。负值表示效果不好,正值表示匹配效果好。

    #opencv模板匹配----单目标匹配
    import cv2
    #读取目标图片
    target = cv2.imread("target.jpg")
    #读取模板图片
    template = cv2.imread("template.jpg")
    #获得模板图片的高宽尺寸
    theight, twidth = template.shape[:2]
    #执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
    result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
    #归一化处理
    cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )
    #寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    #对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趋近与0匹配度越好,匹配位置定点取min_loc,对于其他方法max_val越趋近于1匹配度越好,匹配位置取max_loc
    strmin_val = str(min_val)
    #绘制矩形边框,将匹配区域标注出来
    cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
    #显示结果,并将匹配值显示在标题栏上
    cv2.imshow("MatchResult----MatchingValue="+strmin_val,target)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    

    FLANN特征点匹配

    对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化。

    基于FLANN的匹配器(FLANN based Matcher)的特征匹配。FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。

    • 使用SIFT特征提取关键点;
    • 计算SIFT特征描述子;
    • 使用FLANN匹配器进行描述子向量匹配。

    SIFT + Ratio Test

    SIFT的大概流程描述:
    在图中选择出一些比较有特色的点,并把他们编码成特征向量,现在要做两个图的特征点匹配,所以要用SIFT对两个图分别做特征点选择,并且每个特征点编码成相同维度的特征向量,比如都是长度为512的向量。两个图上的特征点数量是不一样的,比如第一个图有3个特征点,第二个图有5个特征点,要做特征点匹配的话,计算第一个图中3个点跟第二个图里的5个点两两之间的距离,这个距离一般就是向量的欧式距离。特征点匹配中,就是要找两个图中比较相似的特征点,特征点的特征向量越相近,说明这两个点附近的情况就越相似。

    ratio test 筛选的思想:
    首先找到图一中某一个特征点在图二中的最相似点和次相似点,然后把最相近点的距离跟次相近点的距离相除,获得一个ratio,这个值从直观上理解就是,最相近点比次相近点 更加相似的程度。ratio越小,就表示相近点比次相近点要更加相似很多,相反ratio越大,就表示相近点比次相近点都是一般相似。ratio test就是用ratio值去筛选,它认为:ratio小于一个特定的阈值,这对特征点匹配才会被接受,否则就筛选掉。因为ratio小的特征点对,说明最相近点比其它匹配点(次相近点在这里就代表了其它所有的特征点)都要明显很多,说明这一对匹配是非常有特色的,是可以保留的,保留了基本不会错,因为没有其它干扰因素;ratio比较大的时候,就说明这对匹配是存疑的,把最相近点换成次相近点的相似度也差不多,所以无法断定这一对特征点有没有匹配错,那么就把其筛选掉。Lowe推荐ratio的阈值为0.8。

    FLANN特征匹配

    我这边是有五个类的模版图,在目标图中进行特征匹配,判断属于哪一个类。我的思路则是依次进行特征匹配,比较最后特征点对点多少,从而判断更接近哪一类别。

    import cv2
    import os
    from matplotlib import pyplot as plt
    
    def FLANN():
        # flags=0 
        # 灰色读入目标图像
        targetPath = 'target.jpg'
        trainingImage = cv2.imread(targetPath, flags=0)
        # 灰色读所有模板图片
        templatePath = 'templatePath/'
        icons = os.listdir(templatePath)
        iconMatch= dict({'name': '未识别', 'value': 0})
        for icon in icons:
            queryImage = cv2.imread(templatePath + icon, 0)
            # 使用SIFT 检测角点
            sift = cv2.SIFT_create()
            kp1, des1 = sift.detectAndCompute(queryImage, None)
            kp2, des2 = sift.detectAndCompute(trainingImage, None)
            # 设置FLANN匹配器参数,定义FLANN匹配器,使用 KNN 算法实现匹配
            indexParams = dict(algorithm=0, trees=5)
            searchParams = dict(checks=50) 
            flann = cv2.FlannBasedMatcher(indexParams,searchParams)
            matches = flann.knnMatch(des1,des2,k=2)
    
            # 根据matches生成相同长度的matchesMask列表,列表元素为[0,0]
            matchesMask = [[0,0] for i in range(len(matches))]
            matchNumber = 0
            # 去除错误匹配, 此处阈值设定为0.7
            for i,(m,n) in enumerate(matches):
                if m.distance < 0.7 * n.distance:
                    matchesMask[i] = [1,0]
                    matchNumber = matchNumber+1
            
            # 将图像显示
            # matchColor是两图的匹配连接线,连接线与matchesMask相关
            # singlePointColor是勾画关键点
            drawParams = dict(matchColor = (0,255,0), matchesMask = matchesMask[:50], flags = 0)
            resultImage = cv2.drawMatchesKnn(queryImage,kp1,trainingImage,kp2,matches[:50],None,**drawParams)
    
            if matchNumber > iconMatch['value']:
                iconMatch['name'] = icon.split('_')[0]
                iconMatch['value'] = matchNumber
    
        return resultImage, iconMatch
    
    
    if __name__ == '__main__':
        resultImage, res = FLANN()
        plt.imshow(resultImage)
        plt.show()
    
    
    展开全文
  • 正则匹配详解

    千次阅读 2022-02-01 09:05:56
    序列 ‘\’ 匹配 “” 而 “(” 则匹配 “(”。 . 匹配除换行符之外的任何单字符 ^ 匹配输入字符串的开始 例如 ^a ,表示 字符串必须以a开头,才会继续匹配,如果不是以a开始,则返回空 $ 表示匹配字符串的...

    1. 元字符

    字符描述应用
    \将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符‘n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\’ 匹配 “” 而 “(” 则匹配 “(”。
    .匹配除换行符之外的任何单字符
    ^匹配输入字符串的开始例如 ^a ,表示 字符串必须以a开头,才会继续匹配,如果不是以a开始,则返回空
    $表示匹配字符串的结尾例如 a$ ,表示 字符串必须以a结尾,如果不是以a结尾,则返回空
    \b匹配一个单词边界例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
    \s匹配所有空白符,包括换行
    \S匹配非空白符,不包括换行
    \w匹配字母、数字、下划线或汉字
    \d表示匹配一个数字字符,等同于[0-9]
    \D表示匹配一个非数字字符,等同于 [^0-9]
    |表示 或a|b 表示匹配 a 或者b
    [^]表示不匹配集合中的任何元素[^0-9] 表示匹配非数字字符, [^a-zA-Z] 表示匹配非英文字符
    []表示匹配集合中的任何一个元素[abc] 表示匹配a、b、c 三个元素中的一个, [a-z] 表示 匹配任意小写英文字符,[A-Z] 表示匹配任意大写英文字符,[0-9]表示匹配任意一个数字
    ()标记一个子表达式的开始和结束位置。要匹配这些字符,请使用 \( 和 \)

    2. 重复限定符

    字符功能描述应用
    *匹配前一个位置的字符0次或多次ba* 可以匹配 b,ba,baa,baaaa
    +匹配前一个位置的字符1次或多次ba* 可以匹配到 ba,baa,baaaa 但是匹配不到b
    匹配前一个字符 0次或者1次,或指明一个非贪婪限定符ba? 只能匹配到 b 、ba
    {n}表示匹配元素n次a{3} 表示匹配的字符串为 aaa
    {n,}表示匹配元素大于等于n次a{3} 表示匹配的字符串为 aaa,aaaa,aaaaaa
    {n,m}表示匹配字符次数在n和m次之间a{3,5} 表示匹配的字符串为 aaa aaaa aaaaa 这三种

    应用举例

    -- 1.匹配8位数字的QQ号码:
    ^\d{8}$
    --2. 匹配1开头11位数字的手机号码
    ^1\d{10}$
    --3. 匹配以a开头的,0个或多个b结尾的字符串
     ^ab*$
    -- 4. 匹配字符串中包含0到多个ab开头
     ^(ab)*
    --5. 要匹配以(ab)开头
     ^(\(ab\))*
    --6. 联通有130/131/132/155/156/185/186/145/176等号段,假如让我们匹配一个联通的号码
     ^((13[0-2])|(15[56])|(18[5-6])|145|176)\d{8}$
    

    *+ 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。

    -- 字符串: string= "<h1>RUNOOB-菜鸟教程</h1> " 
    <.*>   -- 匹配整个字符串
    

    贪婪模式:在贪婪匹配下,.* 会匹配尽可能多的字符。使用 .* 的话就可以匹配任意长度的任意字符
    上面的表达式匹配从开始小于符号 < 到关闭 h1 标记的大于符号 > 之间的所有内容。

    <.*?>/  -- 只会匹配0或1次第一个< >中的内容    当.*?匹配到h1时,再往后的字符就是>,而>恰好可以匹配
    

    非贪婪模式:非贪婪匹配就是尽可能匹配少的字符
    如果您只需要匹配开始和结束 h1 标签,下面的非贪婪表达式只匹配 <h1>

    <.*?>/   --只会匹配0或1次第一个< >中的内容    当.*?匹配到h1时,再往后的字符就是>,而>恰好可以匹配
    

    **注:**但是这里需要注意,如果匹配的结果在字符结尾,.*?就有可能匹配不到任何结果了,因为他会尽可能匹配少的字符,例:

    select regexp_extract('hello 1234567 world/python','he.*?(\\d).*rld/(.*?)',2)   -- 返回为空
    
    select regexp_extract('hello 1234567 world/python','he.*?(\\d+).*rld/(.*)',2)  -- python
    

    3. SQL 中正则匹配

    3.1. 正则匹配

    语法: regexp_extract(string subject, string pattern, int index)
    说明: 将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

    ---语法事例:
    ---regexp_extract  从起始位置开始匹配,当匹配到目标后,便停止匹配,返回index指定的group对应的字符串,每个() 表示一个group
    SELECT regexp_extract('asbdad100-200喜马拉雅', '(\\d+)-(\\d+)', 1);  
               
    ---regexp_extract_all 从起始位置开始匹配,当匹配到目标后,仍然继续匹配,生成一个大的group,返回每个sub_group中index对应的字符串
    SELECT regexp_extract_all('100-200, 300-400', '(\\d+)-(\\d+)', 1);   
    

    3.2 正则替换

    -- 使用字符串num替换匹配到的所有字符串
    SELECT regexp_replace('100-200,300-400', '(\\d+)', 'num');    
    

    3.3 应用实例

    -- 1. regexp_replace用法
        -------- a. 截取字符串中的汉字部分
    select regexp_replace('七夕节comming!来啦','([^\\u4E00-\\u9FA5]+)','')           --- 七夕节来啦
        -------- b. 截取字符串中字母和数字的部分
    select regexp_replace('wo爱你123CHINA中国!','([^a-zA-Z0-9]+)','')              --- wo123CHINA
        -------- c. 将字符串中英文和数字的组合替换
    SELECT regexp_replace('七夕节Coming666!','([a-z]+|[A-Z]+|[0-9]+)','') 
    
    -- 2. regexp_extract用法
    select regexp_extract('ab3.35_52-36_53-34_51.1063ef','(.*\\.)(\\d+.*\\d)(\\..*)',2)
    select regexp_extract('七夕节coming666','([0-9]+)',1)             ---- 666
    select regexp_extract('152天内有67天无通话记录','([0-9]+).*([0-9]+)',1) .   ----- 152
    
    • 去除字段里包含”地域“的标签
      在这里插入图片描述
    select
        id,
        -- 相似应用: transfrom   filter
        regexp_replace(last_30d_ai_label_play_map,'(地域[^,]*,)|(,地域[^,]*\\d)|(地域[^,]*\\d$)','') as last_30d_ai_label_play_map
    from xxx where last_30d_ai_label_play_map 
    like "%地域%"
    as res;
    
    • 使用transfrom 函数,处理数据
      应用实例:数据中出现类似: 郑渊洁:1.0,好习惯:0.33,郑渊洁给孙女的好习惯书:十二生肖童话绘本:0.75,孙女:0.67 的脏数据
    select 
        id,
        nlp_labels_intros,
        concat_ws(',',transform(split(nlp_labels_intros,','), x -> if(size(split(x,':'))=3, concat(split(x,':')[0],split(x,':')[1],':',split(x,':')[2]) , x))) as label
    from xxxx 
    
    • 提取各个画像对应的标签和权重
      在这里插入图片描述
    select 
        cast( album_id as string) as album_id ,
        -- 使用非贪婪匹配模式
        split(regexp_replace(regexp_extract_all(get_json_object(label_group, '$.labels_ai'),'(t".")(.*?)(})',2 ),'\\]|\\[|","w"','') ,',') as nlp_labels_ai,  
        split(regexp_replace(regexp_extract_all(get_json_object(label_group, '$.labels_app'),'(t".")(.*?)(})',2 ),'\\]|\\[|","w"','') ,',') as nlp_labels_app,
        split(regexp_replace(regexp_extract_all(get_json_object(label_group, '$.labels_conp'),'(t".")(.*?)(})',2 ),'\\]|\\[|","w"',''),',' ) as  nlp_labels_conp,
        split(regexp_replace(regexp_extract_all(get_json_object(label_group, '$.titles'),'(t".")(.*?)(})',2 ),'\\]|\\[|","w"',''),',') as nlp_labels_titles,
        split(regexp_replace(regexp_extract_all(get_json_object(label_group, '$.intros'),'(t".")(.*?)(})',2 ),'\\]|\\[|","w"','') ,',') as  nlp_labels_intros,
        '$current(yyyyMMdd,-1)' as dt
    from xxxxx
    as res;
    

    python 正则表达式

    sublime中正则表达式的使用:
    在这里插入图片描述

    展开全文
  • PSM倾向得分匹配

    千次阅读 2021-10-30 16:34:48
    局部线性回归匹配(Local linear regression matching),通过局部线性回归来估计权重进行匹配 样条匹配(Spline matching),使用“三次样条”来估计权重进行匹配 在实际进行匹配时,我们应根据具体数据的样本量,...
  • opencv 模板匹配&&形状匹配

    千次阅读 2022-04-28 20:17:23
    所以今天就趁机会讲讲模板匹配,正好之前的项目有一部分重要工作就是和模板匹配紧密相关,对于今天作业来说,之前的项目难度更大,因为涉及到许多要考虑的因素,还要考虑效率实时性等问题。太详细的我也不方便展开,...
  • 匹配单个字符 学习目标 能够使用re模块匹配单个字符 1. 匹配单个字符 在上一小节中,了解到通过re模块能够完成使用正则表达式来匹配字符串 本小节,将要讲解正则表达式的单字符匹配 代码 功能 . 匹配任意...
  • 【NLP】深度文本匹配综述

    万次阅读 2021-06-29 22:07:28
    3.深度文本匹配与传统文本匹配 4.深度文本匹配国内外研究现状 4.1基于单语义表达的文本匹配 4.2基于多语义表达的文本匹配 4.3基于注意力机制的文本匹配 4.4深度文本匹配框架总结 5.未来研究方向展望 5.1变长...
  • Python正则表达式及常用匹配

    千次阅读 多人点赞 2021-05-24 16:04:26
    group() 返回被 RE 匹配的字符串。 start() 返回匹配开始的位置 end() 返回匹配结束的位置 span() 返回一个元组包含匹配 (开始,结束) 的位置 2 正则表达式修饰符 - 可选标志 re.I 大小写不敏感 re.L 做本地化识别...
  • nginx匹配规则详解

    千次阅读 2022-02-17 15:39:57
    本文结合语法、优先级、匹配规则做描述。 二、location指令语法 location [=|~|~*|^~|@] /uri/ { … } 或 location @name { … } location 顺序/优先级: (location =) > (location 完整路
  • OpenCV模板匹配(cv2.matchTemplate)

    万次阅读 多人点赞 2021-05-17 21:51:04
    除了轮廓过滤和处理之外,模板匹配可以说是对象检测的最简单形式之一: 它实现简单,只需要2-3行代码 模板匹配计算效率高 不需要执行阈值化,边缘检测等操作即可生成二进制图像(例如轮廓检测和处理) 通过基本扩展...
  • 阻抗匹配是什么意思?阻抗匹配原理详解

    万次阅读 多人点赞 2019-06-12 20:00:53
    阻抗匹配是什么意思_阻抗匹配原理详解 -------本文轉載自<http://m.elecfans.com/article/671550.html>  本文主要详解什么是阻抗匹配,首先介绍了输入及输出阻抗是什么,其次介绍了阻抗匹配的原理,最后...
  • 所谓词典正向最大匹配就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子字符串与字典中的词进行匹配,如果匹配成功则进行下一轮匹配,直到所有字符串处理完毕,否则将子字符串从末尾去除一个字,再...
  • 地图匹配实例-几何匹配

    千次阅读 2021-03-14 20:22:50
    由于苦心钻研了好久才弄明白,所以选择了对知识的收费,货真价实:效果图如下...说一下地图匹配的性质,我这个方法是对点的最近的线进行的几何性质的匹配,也就是说垂直映射到最近的线上,不需要的可以无需购买。 ...
  • LabVIEW图像模式匹配(基础篇—11)

    万次阅读 2021-07-18 21:36:59
    图像模式匹配是机器视觉系统最重要的功能之一,基于它可以实现目标对准、测量、检测以及分类等应用。
  • 比较常用的几个正则表达式(匹配数字) 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符...
  • 匹配滤波

    万次阅读 多人点赞 2020-09-23 20:45:27
    匹配滤波(matched filtering)是最佳滤波的一种。当输入信号具有某一特殊波形时,其输出达到最大。在形式上,一个匹配滤波器由以按时间反序排列的输入信号构成。且滤波器的振幅特性与信号的振幅谱一致。因此,对...
  • opencv+python实现图像匹配----模板匹配、特征点匹配

    万次阅读 多人点赞 2019-02-12 16:30:46
    文章目录模板匹配与特征匹配python的版本及依赖的库的安装opencv+python模板匹配[^1]匹配材料Template Matchingopencv+python特征匹配[^2]匹配材料BFMatching描述特征点--运行结果不精确基于FLANN的匹配器(FLANN ...
  • 图像匹配的方法主要分为基于灰度值相关和基于特征提取。 基于像素匹配: 基于灰度值相关的方法直接对原图和模板图像进行操作,通过区域属性(灰度信息或频域分析等)的比较来反映他们之间的相似性。基于灰度的...
  • 正则表达式,正则匹配冒号

    千次阅读 2020-12-20 13:36:42
    例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配...
  • 实例详解Halcon定位与模板匹配

    热门讨论 2014-03-07 17:45:48
    Halcon定位,模板匹配,大恒培训资料,实例详解Halcon定位与模板匹配,各参数具体含义。
  • 最优匹配:最优匹配又称为带权最大匹配,是指在带有权值边的二分图中,求一个匹配使得匹配边上的权值和最大。一般X和Y集合顶点个数相同,最优匹配也是一个完备匹配,即每个顶点都被匹配。如果个数不相等,可以通过补...
  • 模板匹配,特征点匹配-全

    千次阅读 2019-07-09 23:46:33
    模板匹配:模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,...
  • ACL匹配规则

    千次阅读 2021-08-21 14:00:04
    ACL工作原理 ACL由一条或多条规则组成 每条规则必须选择动作:允许或拒绝 每条规则都有一个id序列号(默认=5,间隔=5) 序列号越小越先进行匹配 只要有一条规则和报文匹配,就停止查找,称为命中规则 查找完所有...
  • NLP之文本匹配及语义匹配应用介绍

    万次阅读 多人点赞 2019-07-11 18:11:57
    2、文本匹配方法概述2-1 传统文本匹配方法2-2 主题模型2-3 深度语义匹配模型表示型交互型3、语义匹配应用介绍3-1 短文本-短文本语义匹配3-2 短文本-长文本语义匹配案例1-用户查询-广告页面相似度案例2:文档关键词...
  • 二分图匹配——匈牙利算法

    万次阅读 多人点赞 2019-05-31 16:57:03
    匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 基本原则就是在原有匹配(最开始的按优先顺序匹配)基础上...
  • nginx 正则路径匹配

    千次阅读 2021-11-15 11:57:02
    ^~ 表示uri以某个常规字符串开头,大多情况下用来匹配url路径,nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 ~ 正则匹配(区分大小写) ~* 正则匹配(不区分大小写)...
  • KMP模式匹配算法详解

    万次阅读 多人点赞 2020-02-23 15:48:40
    KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)...
  • Java正则多次匹配和多次组匹配

    千次阅读 2021-02-12 15:18:07
    关于正则表达式 , 可以学习下这篇介绍 : 正则表达式对于多次匹配, 正则表达式就需要讲究些技巧了.替换单文的多次匹配有以下几种方式 , 把a全匹配替换替换 a"aab".replaceAll("a{1}", "x"); //xxb"aba".replaceAll("a...
  • 图像匹配几种常见算法与实践

    万次阅读 多人点赞 2020-08-07 19:05:18
    奇技 · 指南本文主要内容1.模版匹配2.特征匹配3.深度学习去找目标图像匹配的应用及背景图像匹配是指通过一定的匹配算法在两幅或多幅图像之间识别同名点。应用:遥感(制图更新),计算机视觉...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,029,034
精华内容 1,211,613
关键字:

如何匹配