【问题标题】:OpenCV - Estimating Box dimensions in PythonOpenCV - 在 Python 中估计盒子尺寸
【发布时间】:2017-06-08 20:29:42
【问题描述】:

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

在这里检测到角落。现在我试图估计较大盒子的尺寸,而较小的黑盒子尺寸是已知的。

谁能指导我估算盒子尺寸的最佳方法是什么?我可以用简单的欧几里得距离来做到这一点,但我不知道这是否正确。或者即使它是正确的方法,那么从元组(坐标)列表中,我怎样才能找到 A-B 或 A-D 或 G-H 之类的距离,而不是 A-C 或 A-F 之类的距离?

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

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

我已尽力解释我的问题。将非常高兴有一些答案:) 谢谢。

【问题讨论】:

  • 问你几个问题:你的“相似”图像是否总是在这个位置出现方框? (一个小的在一个大的前面,它们之间有足够的空间,所以你可以很容易地辨别它们?当你说你想估计大盒子的尺寸知道小盒子的尺寸时,你想透视考虑到(即图片中显示的越大的框越大)?为什么你认为欧几里得距离是错误的?

标签: python opencv image-processing dimension


【解决方案1】:

对于

我怎样才能找到像 A-B 或 A-D 或 G-H 这样的距离,而不是像 A-C 或 A-F

部分

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

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

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)

【讨论】:

  • 逻辑赞赏:)
【解决方案2】:

一般来说你不能,因为任何重建都只是按比例缩放的。

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

为此,您必须做出一些假设并将它们插入方程式。

表格示例:

  1. 框边相互垂直(这意味着每 2 个相邻点共享至少一个坐标值)。
  2. 您需要假设您知道底点的高度,即它们与校准框位于同一平面上(这将为您提供可见底点的 Z)。

希望这些约束足以为您提供更少的未知方程,并且您可以求解线性方程组。

【讨论】:

  • 你说得对,我必须做出一些假设。但我试图找到每两条线之间的角度,但它们都不是正好 90 度。还有一个角度是由小盒子里的点和一个大盒子里的点形成的,这使得一些角度接近 90。对此有什么建议吗?
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2014-02-14
相关资源
最近更新 更多