首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一页Python / OpenCV上的一组和弦中确定角和弦

从一页Python / OpenCV上的一组和弦中确定角和弦
EN

Stack Overflow用户
提问于 2013-12-02 16:05:45
回答 1查看 391关注 0票数 0

给定一组点,如何确定哪个是左上角、右上角、右下角和左下角(TL,TR,BR,BL)

这些是位于下面的图像上的黑色方块的和弦。(每页各向下4页)

下面是共弦(x,y) (原点0,0是左上角):

代码语言:javascript
复制
[(147.68485399616046, 3304.5385975548143),
(168.3419544680192, 2336.686128749161),
(188.1491476566771, 1331.864619054719),
(211.6472437750393, 155.6040367158578),
(2216.6064720878203, 3330.396441392227),
(2233.7510405426237, 2363.6828015004367),
(2250.9856437171966, 1360.935679736544),
(2273.392518618822, 187.8742947415933)]

通过沿着x轴对这些数据进行排序,我可以取前4和底部4,这为页面的每一侧都提供了一列。

然后,我对和弦对进行了求和,即147+3304 = 3451等等。通过对这个求和值上的和弦进行排序,我可以将最小值作为TL的同弦,对于BR取最高的和弦(因为这将是最大的x+y组合)。

代码语言:javascript
复制
http://i.stack.imgur.com/GxXJd.jpg

这是好的,除了当我遇到这组和弦:

代码语言:javascript
复制
     [(203.68919057903938, 154.66471253728272),
     (2264.8873935264055, 180.78268029528675),
     (987.6169366297244, 1156.4133276499006),
     (184.2811080835604, 1331.004238570996),
     (167.45816773667582, 2336.89386528075),
     (2236.836364657011, 2356.0815089255643),
     (150.94371083838226, 3304.3057324840765),
     (2223.8576991353148, 3323.427188913703)]

如果按上面的方式处理,我的TR定位值为987,1156,而不是2264,180。

代码语言:javascript
复制
    http://i.stack.imgur.com/aVp4f.jpg

那么,我如何编程确定我的四个角和弦?

注意,我已经编辑了这些图像,但它们仍然给出了相同的输出。

代码语言:javascript
复制
http://i.stack.imgur.com/cyMG5.jpg
http://i.stack.imgur.com/aVp4f.jpg
http://i.stack.imgur.com/h8ylN.jpg
http://i.stack.imgur.com/rF7Sw.jpg
http://i.stack.imgur.com/GxXJd.jpg
http://i.stack.imgur.com/837nR.jpg
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-03 14:39:13

这是一种效率低下的方法,但我认为是直接的方法。

TL、TR、BL、BR的基本特征是它们最接近每个角。如果你取任何一组xy点,那么你所需要做的就是找到每个拐角的最短距离。

下面的代码正是用蛮力完成的(将所有点与所有角进行比较)。可以复制粘贴到解释器上。因为我不知道你给出的图像的极端性,所以我不得不根据可用的点来获取它们。您可以通过提供图像本身的角来跳过这一点。

代码语言:javascript
复制
ok = [(147.68485399616046, 3304.5385975548143),
      (168.3419544680192, 2336.686128749161),
      (188.1491476566771, 1331.864619054719),
      (211.6472437750393, 155.6040367158578),
      (2216.6064720878203, 3330.396441392227),
      (2233.7510405426237, 2363.6828015004367),
      (2250.9856437171966, 1360.935679736544),
      (2273.392518618822, 187.8742947415933)]
bad = [(203.68919057903938, 154.66471253728272),
       (2264.8873935264055, 180.78268029528675),
       (987.6169366297244, 1156.4133276499006),
       (184.2811080835604, 1331.004238570996),
       (167.45816773667582, 2336.89386528075),
       (2236.836364657011, 2356.0815089255643),
       (150.94371083838226, 3304.3057324840765),
       (2223.8576991353148, 3323.427188913703)]


def distance(xy1, xy2):
    (x1, y1), (x2, y2) = xy1, xy2
    return ((float(y2-y1))**2 + (float(x2-x1))**2)**0.5


def fake_image_corners(xy_sequence):
    """Get an approximation of image corners based on available data."""
    all_x, all_y = zip(*xy_sequence)
    min_x, max_x, min_y, max_y = min(all_x), max(all_x), min(all_y), max(all_y)
    d = dict()
    d['tl'] = min_x, min_y
    d['tr'] = max_x, min_y
    d['bl'] = min_x, max_y
    d['br'] = max_x, max_y
    return d


def corners(xy_sequence, image_corners):
    """Return a dict with the best point for each corner."""
    d = dict()
    d['tl'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['tl']))
    d['tr'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['tr']))
    d['bl'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['bl']))
    d['br'] = min(xy_sequence, key=lambda xy: distance(xy, image_corners['br']))
    return d


def main():
    for xy_sequence in (ok, bad):
        image_corners = fake_image_corners(xy_sequence)
        d = corners(xy_sequence, image_corners)
        print '********'
        for k, v in d.items():
            print k, v

main()

输出:

代码语言:javascript
复制
********
bl (147.68485399616046, 3304.5385975548143)
tl (211.6472437750393, 155.6040367158578)
tr (2273.392518618822, 187.8742947415933)
br (2216.6064720878203, 3330.396441392227)
********
bl (150.94371083838226, 3304.3057324840765)
tl (203.68919057903938, 154.66471253728272)
tr (2264.8873935264055, 180.78268029528675)
br (2223.8576991353148, 3323.427188913703)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20332562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档