OpenCV - Python中的估算框尺寸

时间:2017-01-24 06:29:42

标签: python opencv image-processing dimension

这是我previous question的延续。我现在有这样的图像

enter image description here

这里检测到角落。现在我正在尝试估计较大盒子的尺寸,同时知道较小的黑盒子尺寸。

任何人都可以指导我估算盒子尺寸的最佳方法是什么?我可以用简单的欧几里德距离来做,但我不知道它是否是正确的方法。或者即使它是正确的方式,然后从元组列表(坐标)我如何找到像A-B或A-D或G-H的距离,但不能像A-C或A-F那样?

必须保留序列才能获得正确的尺寸。此外我还有两个方框,所以当我创建角点坐标列表时,它应该包含A-J的所有坐标,而且我不知道哪个坐标属于哪个方框。那么我怎么能保留两个不同的盒子,因为我想运行这个代码来获得更多类似的图像。

注意:此图像中的角不是单个点而是一组点,因此我将角集合并对其进行平均以获得每个角的单个(x,y)坐标。

我尽力解释我的问题。得到一些答案会非常高兴:)谢谢。

2 个答案:

答案 0 :(得分:1)

对于

  

如何找到A-B或A-D或G-H之类的距离,但不能像A-C或A-C那样   A-F

部分

这是一个快速代码,对于有很多角落的图像效率不高,但对于你的情况,它没问题。我们的想法是从你在另一个问题中得到的扩张边缘图像开始(只有大盒子,但对于那个也有小盒子的图像,想法是一样的) dilated edges

然后对于每个可能的角落组合,你会看到它们之间的假想线上的几个点,然后检查这些点是否实际落在图像中的实线上。

import cv2
import numpy as np

#getting intermediate points on the line between point1 and point2
#for example, calling this function with (p1,p2,3) will return the point
#on the line between p1 and p2, at 1/3 distance from p2
def get_intermediate_point(p1,p2,ratio):
    return [p1[0]+(p2[0]-p1[0])/ratio,p1[1]+(p2[1]-p1[1])/ratio]

#open dilated edge images
img=cv2.imread(dilated_edges,0)

#corners you got from your segmentation and other question
corners=[[29,94],[102,21],[184,52],[183,547],[101,576],[27,509]]
nb_corners=len(corners)

#intermediate points between corners you are going to test
ratios=[2,4,6,8] #in this example, the middle point, the quarter point, etc
nb_ratios=len(ratios)

#list which will contain all connected corners
connected_corners=[]

#double loop for going through all possible corners
for i in range(nb_corners-1):
    for j in range(i+1,nb_corners):
        cpt=0
        c1=corners[i]; c2=corners[j]

        #testing every intermediate points between the selected corners
        for ratio in ratios:
            p=get_intermediate_point(c1,c2,ratio)

            #checking if these points fall on a white pixel in the image
            if img[p[0],p[1]]==255:
                cpt+=1

        #if enough of the intermediate points fall on a white pixel
        if cpt>=int(nb_ratios*0.75):
            #then we assume that the 2 corners are indeed connected by a line
            connected_corners.append([i,j])

print(connected_corners)

答案 1 :(得分:0)

一般情况下,你不能,因为任何重建都只是规模化。

基本上,给定校准相机和6个2D点(6x2 = 12),您需要找到6个3D点+比例= 6x3 + 1 = 19。方程式不够。

为了做到这一点,你必须做出一些假设并将它们插入方程式中。

表单示例:

  1. 盒子边缘彼此垂直(这意味着每2个相邻点共享至少一个坐标值)。
  2. 您需要假设您知道底部点的高度,即它们与校准盒位于同一平面上(这将为您提供可见底部点的Z)。
  3. 希望这些约束足以让您减少未知的方程式,并且可以求解线性方程组。