识别图片文本坐标;透视变换;输入点集坐标,输出凸包(最大多边形)顶点坐标

'''
    识别图片文本坐标
'''
import cv2
import pytesseract
from pytesseract import Output
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import numpy as np


def recoText(im):
    """
    识别字符并返回所识别的字符及它们的坐标
    :param im: 需要识别的图片
    :return data: 字符及它们在图片的位置
    """
    data = {}
    d = pytesseract.image_to_data(im, output_type=Output.DICT, lang='chi_sim')
    for i in range(len(d['text'])):
        if 0 < len(d['text'][i]):
            (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
            data[d['text'][i]] = ([d['left'][i], d['top'][i], d['width'][i], d['height'][i]])

            cv2.rectangle(im, (x, y), (x + w, y + h), (255, 0, 0), 1)
            # 使用cv2.putText不能显示中文,需要使用下面的代码代替
            cv2.putText(im, d['text'][i], (x, y-8), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (255, 0, 0), 1)

            pilimg = Image.fromarray(im)
            draw = ImageDraw.Draw(pilimg)
            # 参数1:字体文件路径,参数2:字体大小
            font = ImageFont.truetype("simhei.ttf", 15, encoding="utf-8")
            # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
            draw.text((x, y - 10), d['text'][i], (255, 0, 0), font=font)
            im = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)

    cv2.imshow("recoText", im)
    return data


if __name__ == '__main__':
    img = cv2.imread('D:\python course/tuxiangshibie\data/3.jpg')
    # cv2.imshow("src", img)
    data = recoText(img)
    print(data)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

计算透视投影矩阵:

import cv2
import numpy as np

pts = np.float32([[183,235],[643,465],[154,678],[477,675]])
pts1 = np.float32([[193,245],[653,475],[164,688],[487,685]])
M = cv2.getPerspectiveTransform(pts,pts1)
print(M)

求凸包坐标及其面积:

'''
    输入点集坐标,输出凸包顶点坐标
'''
# -*-coding:utf-8-*-
from math import sqrt

solution = []
def convex_hull(points: list):
    if len(points) <= 3:
        return points
    global solution
    points.sort(key=lambda x: x[0])  # 按照横坐标排序
    left_most = points[0]
    right_most = points[-1]
    solution.extend([left_most, right_most])

    helper(points, left_most, right_most, True)
    helper(points, left_most, right_most, False)
    return solution


def helper(points, left_most, right_most, upBool):
    """

    :param points:
    :param left_most:
    :param right_most:
    :param upBool: 上包为True
    :return:
    """
    global solution
    if len(points) <= 1:
        return
    l = line_helper(left_most, right_most)
    if upBool:
        up = []
        max_distance = 0
        max_point = ()
        for point in points:
            distance = 0 - (l[0] * point[0] + l[1] * point[1] + l[2]) / sqrt(l[0] * l[0] + l[1] * l[1])  # 与直线的距离
            if distance > 0:
                up.append(point)
                if distance > max_distance:
                    max_distance = distance
                    max_point = point
        if max_point != ():
            solution.append(max_point)
        helper(up, left_most, max_point, True)
        helper(up, max_point, right_most, True)
    else:
        down = []
        min_distance = 0
        min_point = ()
        for point in points:
            distance = 0 - (l[0] * point[0] + l[1] * point[1] + l[2]) / sqrt(l[0] * l[0] + l[1] * l[1])  # 与直线的距离
            if distance < 0:
                down.append(point)
                if distance < min_distance:
                    min_distance = distance
                    min_point = point
        if min_point != ():
            solution.append(min_point)
        helper(down, left_most, min_point, False)
        helper(down, min_point, right_most, False)


def line_helper(point1, point2):
    """
    计算距离
    :param point1:
    :param point2:
    :return:
    """
    if (point1[0] - point2[0]) != 0:
        m = (point1[1] - point2[1]) / (point1[0] - point2[0])
        c = point1[1] - m * point1[0]
        return [m, -1, c]
    else:
        return [1, 0, point1[0]]

def compute_polygon_area(points):  # 计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列
    point_num = len(points)
    if(point_num < 3): return 0.0
    s = points[0][1] * (points[point_num-1][0] - points[1][0])
    #for i in range(point_num): # (int i = 1 i < point_num ++i):
    for i in range(1, point_num): # 有小伙伴发现一个bug,这里做了修改,但是没有测试,需要使用的亲请测试下,以免结果不正确。
        s += points[i][1] * (points[i-1][0] - points[(i+1)%point_num][0])
    return abs(s/2.0)


if __name__ == '__main__':
    input_points = [(182, 151), (219, 201), (241.5, 246.75), (253.25, 297), (207, 329), (341.5, 422.5), (622.5, 498.25)]
    print("Input:", input_points)
    rst = convex_hull(input_points)
    print("Output", rst)
    polygon = rst
    print('凸包面积是:', compute_polygon_area(polygon))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值