根据opencv的多边形拟合及凸包角点寻找文字的四个角坐标点

使用opencv的多边形拟合获取到的角点可能会存在很多个,对文字扭曲纠正,我本来是想找到4个角的坐标点,再使用透视变换纠正变形的文字,但自己研究,苦于没有找到好的方法,在此就自己写了个方法,还有一些问题存在,希望能提供一些指导及思路

#coding:utf-8
import numpy as np
hull=[[[31, 12]],[[21, 18]], [[6, 19]], [[8, 41]], [[35, 30]]]
def getfourpoints(hull,value=12,boder=0):
    alllist=[]
    minlist=sorted(hull)
    #左上角坐标
    left=(minlist[0][0][0]+boder,minlist[0][0][1]+boder)
    # 左下角坐标
    leftbottom=[]
    for i,p in enumerate(minlist):
        if i>0:
            if p[0][1]-minlist[0][0][1]>value:
                leftbottom=(p[0][0]+boder,p[0][1]+boder)
                break
            elif p[0][1]-minlist[0][0][1]<-value:
                leftbottom = left
                left = (p[0][0]+boder,p[0][1]+boder)
                break
            else:
                continue
    #右下角坐标
    data = np.array(hull)
    flist=data[np.lexsort(-data.T)]
    # 第一行的差值
    wjh = abs(flist[0][0][0][0] - flist[0][0][0][1])
    # 第二行的差值
    pwjh = abs(flist[0][1][0][0] - flist[0][1][0][1])
    # 第一行宽减第二行宽
    ojtw = flist[0][0][0][0] - flist[0][1][0][0]
    # 第一行高减第二行高
    ojth = flist[0][0][0][1] - flist[0][1][0][1]
    if ojtw < 0 and pwjh <= wjh:
        rightbottom = (flist[0][1][0][0] + boder, flist[0][1][0][1] + boder)
    else:
        rightbottom = (flist[0][0][0][0] + boder, flist[0][0][0][1] + boder)

    zlist=data[np.lexsort(data.T)][0]
    # 右上角坐标
    righttop=[]
    for i,p in enumerate(zlist):
        if i>0:
            if p[0][0]-left[0]>value:
                righttop=(p[0][0]+boder,p[0][1]+boder)
                break
            else:
                continue
        else:
            if p[0][0] - left[0]>value:
                righttop = (p[0][0]+boder,p[0][1]+boder)
                break
    alllist.append(left)
    alllist.append(leftbottom)
    alllist.append(rightbottom)
    alllist.append(righttop)
    #如果存在空则未找全4个角坐标
    if len(left)==0 or len(leftbottom)==0 or len(rightbottom)==0 or len(righttop)==0:
        alllist=[]
    return alllist

输出的4角坐标:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值