質問

される2次元の矩形の歪みの視点:

enter image description here

のを知っている形状にしたもの矩形がわからないのです。

てしまうと、ピクセル座標の四隅にあるこの写真できるかを計算して、元のプロポーション、すなわち商(幅/高さ)矩形の?

(背景:この目的は、自動的にundistort写真の矩形の文書、エッジ検出れるだろうとハフ変換)

更新:

いても議論が可能かどうかについて全ての判断幅:高比率の情報を付与する。私のナイーブとは思えなければならないというかたを考えることができるようにプロジェクト例1:4の矩形を四角形を描きます。の比率が明確にありが1:1であるべき方を決定する数学的モデル化を行っている。私が今自分にとって直感的のようですね。

私は十分には整備されていないかの引数を記載していると思うがある暗黙の前提としての欠落ちることは解釈とは異なります。

しかし、時間を探索し、見つかの論文の問題です。私の苦労を理解する数学の利用があり、これまでのところなく成功。特に最初の論文はそう考えたかったので、残念なことになコード例は、非常に緻密なmath.

  • Zhengyou Zhang Li Weiた"ホワイトボードスキャン、画像の補正" http://research.microsoft.com/en-us/um/people/zhang/papers/tr03-39.pdf p.11

    "の視点で歪みをイメージの矩形が四角形.しかし、こでは矩形空間にしたいものとし、カメラの焦点距離の矩形のアスペクト比となります。"

  • ロバートM.HARALICKの決定""カメラのパラメータから投影の矩形" http://portal.acm.org/citation.cfm?id=87146

    "私たちの利用方法を示し、2次元透視投影のrectangleのサイズと位置を3次元空間を決定するカメラを見て角度のパラメータとの対比計画の矩形を塗りつぶします。"

役に立ちましたか?

解決

ここでは私たちなりの答私の質問を読んで論文

を操作して、方程式の一部の時間をセージがなかったのですがこの疑似コードc-スタイル:


// in case it matters: licensed under GPLv2 or later
// legend:
// sqr(x)  = x*x
// sqrt(x) = square root of x

// let m1x,m1y ... m4x,m4y be the (x,y) pixel coordinates
// of the 4 corners of the detected quadrangle
// i.e. (m1x, m1y) are the cordinates of the first corner, 
// (m2x, m2y) of the second corner and so on.
// let u0, v0 be the pixel coordinates of the principal point of the image
// for a normal camera this will be the center of the image, 
// i.e. u0=IMAGEWIDTH/2; v0 =IMAGEHEIGHT/2
// This assumption does not hold if the image has been cropped asymmetrically

// first, transform the image so the principal point is at (0,0)
// this makes the following equations much easier
m1x = m1x - u0;
m1y = m1y - v0;
m2x = m2x - u0;
m2y = m2y - v0;
m3x = m3x - u0;
m3y = m3y - v0;
m4x = m4x - u0;
m4y = m4y - v0;


// temporary variables k2, k3
double k2 = ((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x) /
            ((m2y - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) ;

double k3 = ((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y - m1y*m4x) / 
            ((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) ;

// f_squared is the focal length of the camera, squared
// if k2==1 OR k3==1 then this equation is not solvable
// if the focal length is known, then this equation is not needed
// in that case assign f_squared= sqr(focal_length)
double f_squared = 
    -((k3*m3y - m1y)*(k2*m2y - m1y) + (k3*m3x - m1x)*(k2*m2x - m1x)) / 
                      ((k3 - 1)*(k2 - 1)) ;

//The width/height ratio of the original rectangle
double whRatio = sqrt( 
    (sqr(k2 - 1) + sqr(k2*m2y - m1y)/f_squared + sqr(k2*m2x - m1x)/f_squared) /
    (sqr(k3 - 1) + sqr(k3*m3y - m1y)/f_squared + sqr(k3*m3x - m1x)/f_squared) 
) ;

// if k2==1 AND k3==1, then the focal length equation is not solvable 
// but the focal length is not needed to calculate the ratio.
// I am still trying to figure out under which circumstances k2 and k3 become 1
// but it seems to be when the rectangle is not distorted by perspective, 
// i.e. viewed straight on. Then the equation is obvious:
if (k2==1 && k3==1) whRatio = sqrt( 
    (sqr(m2y-m1y) + sqr(m2x-m1x)) / 
    (sqr(m3y-m1y) + sqr(m3x-m1x))


// After testing, I found that the above equations 
// actually give the height/width ratio of the rectangle, 
// not the width/height ratio. 
// If someone can find the error that caused this, 
// I would be most grateful.
// until then:
whRatio = 1/whRatio;

更新:ここではこれらの方程式が決定:

以下のコード SAGE.アクセス可能になりますのオンラインで http://www.sagenb.org/home/pub/704/.(Sageは本当に有用な解決方程式、および利用可能な他のブラウザのチェックアウト)

# CALCULATING THE ASPECT RATIO OF A RECTANGLE DISTORTED BY PERSPECTIVE

#
# BIBLIOGRAPHY:
# [zhang-single]: "Single-View Geometry of A Rectangle 
#  With Application to Whiteboard Image Rectification"
#  by Zhenggyou Zhang
#  http://research.microsoft.com/users/zhang/Papers/WhiteboardRectification.pdf

# pixel coordinates of the 4 corners of the quadrangle (m1, m2, m3, m4)
# see [zhang-single] figure 1
m1x = var('m1x')
m1y = var('m1y')
m2x = var('m2x')
m2y = var('m2y')
m3x = var('m3x')
m3y = var('m3y')
m4x = var('m4x')
m4y = var('m4y')

# pixel coordinates of the principal point of the image
# for a normal camera this will be the center of the image, 
# i.e. u0=IMAGEWIDTH/2; v0 =IMAGEHEIGHT/2
# This assumption does not hold if the image has been cropped asymmetrically
u0 = var('u0')
v0 = var('v0')

# pixel aspect ratio; for a normal camera pixels are square, so s=1
s = var('s')

# homogenous coordinates of the quadrangle
m1 = vector ([m1x,m1y,1])
m2 = vector ([m2x,m2y,1])
m3 = vector ([m3x,m3y,1])
m4 = vector ([m4x,m4y,1])


# the following equations are later used in calculating the the focal length 
# and the rectangle's aspect ratio.
# temporary variables: k2, k3, n2, n3

# see [zhang-single] Equation 11, 12
k2_ = m1.cross_product(m4).dot_product(m3) / m2.cross_product(m4).dot_product(m3)
k3_ = m1.cross_product(m4).dot_product(m2) / m3.cross_product(m4).dot_product(m2)
k2 = var('k2')
k3 = var('k3')

# see [zhang-single] Equation 14,16
n2 = k2 * m2 - m1
n3 = k3 * m3 - m1


# the focal length of the camera.
f = var('f')
# see [zhang-single] Equation 21
f_ = sqrt(
         -1 / (
          n2[2]*n3[2]*s^2
         ) * (
          (
           n2[0]*n3[0] - (n2[0]*n3[2]+n2[2]*n3[0])*u0 + n2[2]*n3[2]*u0^2
          )*s^2 + (
           n2[1]*n3[1] - (n2[1]*n3[2]+n2[2]*n3[1])*v0 + n2[2]*n3[2]*v0^2
          ) 
         ) 
        )


# standard pinhole camera matrix
# see [zhang-single] Equation 1
A = matrix([[f,0,u0],[0,s*f,v0],[0,0,1]])


#the width/height ratio of the original rectangle
# see [zhang-single] Equation 20
whRatio = sqrt (
               (n2*A.transpose()^(-1) * A^(-1)*n2.transpose()) / 
               (n3*A.transpose()^(-1) * A^(-1)*n3.transpose())
              ) 

簡便な方程式は、cコードが決定

print "simplified equations, assuming u0=0, v0=0, s=1"
print "k2 := ", k2_
print "k3 := ", k3_
print "f  := ", f_(u0=0,v0=0,s=1)
print "whRatio := ", whRatio(u0=0,v0=0,s=1)

    simplified equations, assuming u0=0, v0=0, s=1
    k2 :=  ((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x)/((m2y
    - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x)
    k3 :=  ((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y - m1y*m4x)/((m3y
    - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x)
    f  :=  sqrt(-((k3*m3y - m1y)*(k2*m2y - m1y) + (k3*m3x - m1x)*(k2*m2x
    - m1x))/((k3 - 1)*(k2 - 1)))
    whRatio :=  sqrt(((k2 - 1)^2 + (k2*m2y - m1y)^2/f^2 + (k2*m2x -
    m1x)^2/f^2)/((k3 - 1)^2 + (k3*m3y - m1y)^2/f^2 + (k3*m3x -
    m1x)^2/f^2))

print "Everything in one equation:"
print "whRatio := ", whRatio(f=f_)(k2=k2_,k3=k3_)(u0=0,v0=0,s=1)

    Everything in one equation:
    whRatio :=  sqrt(((((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y -
    m1y*m4x)/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) -
    1)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x)/((m2y -
    m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) - 1)*(((m1y -
    m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x)*m2y/((m2y - m4y)*m3x
    - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) - m1y)^2/((((m1y - m4y)*m2x -
    (m1x - m4x)*m2y + m1x*m4y - m1y*m4x)*m3y/((m3y - m4y)*m2x - (m3x -
    m4x)*m2y + m3x*m4y - m3y*m4x) - m1y)*(((m1y - m4y)*m3x - (m1x -
    m4x)*m3y + m1x*m4y - m1y*m4x)*m2y/((m2y - m4y)*m3x - (m2x - m4x)*m3y
    + m2x*m4y - m2y*m4x) - m1y) + (((m1y - m4y)*m2x - (m1x - m4x)*m2y +
    m1x*m4y - m1y*m4x)*m3x/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y
    - m3y*m4x) - m1x)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y -
    m1y*m4x)*m2x/((m2y - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x)
    - m1x)) + (((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y -
    m1y*m4x)/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) -
    1)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x)/((m2y -
    m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) - 1)*(((m1y -
    m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x)*m2x/((m2y - m4y)*m3x
    - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) - m1x)^2/((((m1y - m4y)*m2x -
    (m1x - m4x)*m2y + m1x*m4y - m1y*m4x)*m3y/((m3y - m4y)*m2x - (m3x -
    m4x)*m2y + m3x*m4y - m3y*m4x) - m1y)*(((m1y - m4y)*m3x - (m1x -
    m4x)*m3y + m1x*m4y - m1y*m4x)*m2y/((m2y - m4y)*m3x - (m2x - m4x)*m3y
    + m2x*m4y - m2y*m4x) - m1y) + (((m1y - m4y)*m2x - (m1x - m4x)*m2y +
    m1x*m4y - m1y*m4x)*m3x/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y
    - m3y*m4x) - m1x)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y -
    m1y*m4x)*m2x/((m2y - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x)
    - m1x)) - (((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y -
    m1y*m4x)/((m2y - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) -
    1)^2)/((((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y -
    m1y*m4x)/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) -
    1)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x)/((m2y -
    m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) - 1)*(((m1y -
    m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y - m1y*m4x)*m3y/((m3y - m4y)*m2x
    - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) - m1y)^2/((((m1y - m4y)*m2x -
    (m1x - m4x)*m2y + m1x*m4y - m1y*m4x)*m3y/((m3y - m4y)*m2x - (m3x -
    m4x)*m2y + m3x*m4y - m3y*m4x) - m1y)*(((m1y - m4y)*m3x - (m1x -
    m4x)*m3y + m1x*m4y - m1y*m4x)*m2y/((m2y - m4y)*m3x - (m2x - m4x)*m3y
    + m2x*m4y - m2y*m4x) - m1y) + (((m1y - m4y)*m2x - (m1x - m4x)*m2y +
    m1x*m4y - m1y*m4x)*m3x/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y
    - m3y*m4x) - m1x)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y -
    m1y*m4x)*m2x/((m2y - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x)
    - m1x)) + (((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y -
    m1y*m4x)/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) -
    1)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x)/((m2y -
    m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) - 1)*(((m1y -
    m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y - m1y*m4x)*m3x/((m3y - m4y)*m2x
    - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) - m1x)^2/((((m1y - m4y)*m2x -
    (m1x - m4x)*m2y + m1x*m4y - m1y*m4x)*m3y/((m3y - m4y)*m2x - (m3x -
    m4x)*m2y + m3x*m4y - m3y*m4x) - m1y)*(((m1y - m4y)*m3x - (m1x -
    m4x)*m3y + m1x*m4y - m1y*m4x)*m2y/((m2y - m4y)*m3x - (m2x - m4x)*m3y
    + m2x*m4y - m2y*m4x) - m1y) + (((m1y - m4y)*m2x - (m1x - m4x)*m2y +
    m1x*m4y - m1y*m4x)*m3x/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y
    - m3y*m4x) - m1x)*(((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y -
    m1y*m4x)*m2x/((m2y - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x)
    - m1x)) - (((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y -
    m1y*m4x)/((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) -
    1)^2))


# some testing:
# - choose a random rectangle, 
# - project it onto a random plane,
# - insert the corners in the above equations,
# - check if the aspect ratio is correct.

from sage.plot.plot3d.transform import rotate_arbitrary

#redundandly random rotation matrix
rand_rotMatrix = \
           rotate_arbitrary((uniform(-5,5),uniform(-5,5),uniform(-5,5)),uniform(-5,5)) *\
           rotate_arbitrary((uniform(-5,5),uniform(-5,5),uniform(-5,5)),uniform(-5,5)) *\
           rotate_arbitrary((uniform(-5,5),uniform(-5,5),uniform(-5,5)),uniform(-5,5))

#random translation vector
rand_transVector = vector((uniform(-10,10),uniform(-10,10),uniform(-10,10))).transpose()

#random rectangle parameters
rand_width =uniform(0.1,10)
rand_height=uniform(0.1,10)
rand_left  =uniform(-10,10)
rand_top   =uniform(-10,10)

#random focal length and principal point
rand_f  = uniform(0.1,100)
rand_u0 = uniform(-100,100)
rand_v0 = uniform(-100,100)

# homogenous standard pinhole projection, see [zhang-single] Equation 1
hom_projection = A * rand_rotMatrix.augment(rand_transVector)

# construct a random rectangle in the plane z=0, then project it randomly 
rand_m1hom = hom_projection*vector((rand_left           ,rand_top            ,0,1)).transpose()
rand_m2hom = hom_projection*vector((rand_left           ,rand_top+rand_height,0,1)).transpose()
rand_m3hom = hom_projection*vector((rand_left+rand_width,rand_top            ,0,1)).transpose()
rand_m4hom = hom_projection*vector((rand_left+rand_width,rand_top+rand_height,0,1)).transpose()

#change type from 1x3 matrix to vector
rand_m1hom = rand_m1hom.column(0)
rand_m2hom = rand_m2hom.column(0)
rand_m3hom = rand_m3hom.column(0)
rand_m4hom = rand_m4hom.column(0)

#normalize
rand_m1hom = rand_m1hom/rand_m1hom[2]
rand_m2hom = rand_m2hom/rand_m2hom[2]
rand_m3hom = rand_m3hom/rand_m3hom[2]
rand_m4hom = rand_m4hom/rand_m4hom[2]

#substitute random values for f, u0, v0
rand_m1hom = rand_m1hom(f=rand_f,s=1,u0=rand_u0,v0=rand_v0)
rand_m2hom = rand_m2hom(f=rand_f,s=1,u0=rand_u0,v0=rand_v0)
rand_m3hom = rand_m3hom(f=rand_f,s=1,u0=rand_u0,v0=rand_v0)
rand_m4hom = rand_m4hom(f=rand_f,s=1,u0=rand_u0,v0=rand_v0)

# printing the randomly choosen values
print "ground truth: f=", rand_f, "; ratio=", rand_width/rand_height

# substitute all the variables in the equations:
print "calculated: f= ",\
f_(k2=k2_,k3=k3_)(s=1,u0=rand_u0,v0=rand_v0)(
  m1x=rand_m1hom[0],m1y=rand_m1hom[1],
  m2x=rand_m2hom[0],m2y=rand_m2hom[1],
  m3x=rand_m3hom[0],m3y=rand_m3hom[1],
  m4x=rand_m4hom[0],m4y=rand_m4hom[1],
),"; 1/ratio=", \
1/whRatio(f=f_)(k2=k2_,k3=k3_)(s=1,u0=rand_u0,v0=rand_v0)(
  m1x=rand_m1hom[0],m1y=rand_m1hom[1],
  m2x=rand_m2hom[0],m2y=rand_m2hom[1],
  m3x=rand_m3hom[0],m3y=rand_m3hom[1],
  m4x=rand_m4hom[0],m4y=rand_m4hom[1],
)

print "k2 = ", k2_(
  m1x=rand_m1hom[0],m1y=rand_m1hom[1],
  m2x=rand_m2hom[0],m2y=rand_m2hom[1],
  m3x=rand_m3hom[0],m3y=rand_m3hom[1],
  m4x=rand_m4hom[0],m4y=rand_m4hom[1],
), "; k3 = ", k3_(
  m1x=rand_m1hom[0],m1y=rand_m1hom[1],
  m2x=rand_m2hom[0],m2y=rand_m2hom[1],
  m3x=rand_m3hom[0],m3y=rand_m3hom[1],
  m4x=rand_m4hom[0],m4y=rand_m4hom[1],
)

# ATTENTION: testing revealed, that the whRatio 
# is actually the height/width ratio, 
# not the width/height ratio
# This contradicts [zhang-single]
# if anyone can find the error that caused this, I'd be grateful

    ground truth: f= 72.1045134124554 ; ratio= 3.46538779959142
    calculated: f=  72.1045134125 ; 1/ratio= 3.46538779959
    k2 =  0.99114614987 ; k3 =  1.57376280159

他のヒント

更新

認後に更新を見て初参照(ホワイトボードスキャン、画像の補正)、見が欠点です。

入力データの問題である四重極(A、B、C、D) センターに映像が楽しめます。記事にもしっかり対応し提u0=v0=0になります。この点に問題が制約が比矩形を塗りつぶします。

問題は、その後修正再表示しており指ム(A、B、C、D、Z=0planeの目の位置E(0,0,h)h>0の3次元平面Pの予想(A、B、C、D)Pである矩形を塗りつぶします。

ご注意Pによって決E:を平行四辺形、Pが含まれている必要があ緯(EU)および(EV)、U=(AB)x(CD)V=(AD)x(BC).

実験でこの問題は一般的になかった独自のソリューションに対応する独自の価値w/h比の矩形を塗りつぶします。

alt text alt text

前の投稿

できませんの決定矩形の比率が高い。

一般の場合には、ム(A、B、C、D)の非コリニアポイントのZ=0planeの予知-予測研究への限りなく多くの矩形は、無限に多くの幅と高さです。

検討の消滅ポイントUの交差点(AB)(CD)とVの交差点(AD)(BC)のポイント、交差点のdiagonals(AC)及び(BD).プロジェクトとしてABCD、平行四辺形のセンターに申しある面を含むラインに平行(紫外線)によ点S.スでは、このような面で多くの矩形の予測をABCDのすべてが異なるw/h比となります。

これら二つのイメージでページを活3D.の場合ABCDは変わらず、灰色のZ=0plane)、青色を含む平面、矩形は変更されません。緑色の線の一部を隠し(UV)ラインの見えるグリーンラインに平行で含S.ス

alt text alt text

サイズありえないが、本当に必要な、ともない割合です。そして、どちら側アップしている知ることは、彼が書類の写真/スキャンを使用しています考慮種類の無関係です。私は、HESは、それらの裏面をスキャンしようと疑うます。

「コーナー交差点は」視点を補正する方法です。これは助けになるかもしれません。

どのように2Dでパースペクティブ補正グリッドを描画します

の結果がW / Hいうし、H / Wを与える理由の質問について: 上記数20の式が正しいかどうか、私は思ったんだけど。 掲載されます:

       whRatio = sqrt (
            (n2*A.transpose()^(-1) * A^(-1)*n2.transpose()) / 
            (n3*A.transpose()^(-1) * A^(-1)*n3.transpose())
           ) 

私はOpenCVので、私は例外を取得することを実行しようとします。私はより多くの式20のように見える私には、次の式を使用する場合でも、すべてが正常に動作します: しかし、式(20)に基づいて、それはそれがあるべきようになります。

        whRatio = sqrt (
            (n2.transpose()*A.transpose()^(-1) * A^(-1)*n2) /
            (n3.transpose()*A.transpose()^(-1) * A^(-1)*n3)
           )

あなたは、3D座標の矩形を計算この回答はによって幅/高さを決定することができますその影を調整しますか。あなたの矩形が交差対角点に回転していると、それは幅と高さを計算。あなたは、長方形の実際のシャドウ面に比例するという仮定のシャドウ面の間の距離を変更した場合でも、計算された幅/高さと同じである!

「カメラ」の距離を知らなくても、この矩形の幅を知ることは不可能である。

5センチメートル距離から見た小さな長方形は離れメートルから見た巨大な長方形と同じに見える

(長方形のように水平線の同じ側に、つまり)

これら二つの消失点と水平線下に第三の点が直角二等辺三角形を描きます。その第三の点は、私たちの原点になりますと、消失点への2行は、当社の軸となります。消失点PI / 2まで原点からの距離を呼び出します。今の軸に消失点から長方形の各辺を延長し、彼らは軸を交差するマーク。 、軸を選択原点に2つのマークからの距離を測定し、それらの距離変換:X->日焼け(x)が、その差は、その側面の「真」の長さであろう。他の軸について同じ操作を行います。これら2つの長さの比を取り、あなたが行われています。

あなたは、変換された数字は、任意の視点与えられた任意の平行四辺形から来ることができると、より多くの情報が必要。

だから私はあなたが最初のキャリブレーションのいくつかの種類を行う必要があると思います。

編集:私は間違っていたことを言った人のためのを、ここでは同じ投影に得長方形/カメラの無限の組み合わせがあることを数学的な証明は行きます:

問題を単純化するために(我々は唯一の辺の比を必要とするよう)私たちの矩形は以下の点で定義されていることを想定してみましょう。(この単純化はアフィンで同等のものにすべての問題を変換すると同じR=[(0,0),(1,0),(1,r),(0,r)]ですスペース)。

T=[(tx0,ty0),(tx1,ty1),(tx2,ty2),(tx3,ty3)]

形質転換された多角形は以下のように定義されます

M = [[m00,m01,m02],[m10,m11,m12],[m20,m21,m22]]を満足する変換行列(Rxi,Ryi,1)*M=wi(txi,tyi,1)'が存在する

私たちはポイントのために上式を展開すると、

R_0のために我々が得る:m02-tx0*w0 = m12-ty0*w0 = m22-w0 = 0

R_1のために我々が得る:m00-tx1*w1 = m10-ty1*w1 = m20+m22-w1 = 0

R_2のために我々が得る:m00+r*m01-tx2*w2 = m10+r*m11-ty2*w2 = m20+r*m21+m22-w2 = 0

R_3のために我々が得る:m00+r*m01-tx3*w3 = m10+r*m11-ty3*w3 = m20 + r*m21 + m22 -w3 = 0

これまでは12式、14個の未知の変数(行列から9,4 wiから、比率r 1)、残りが値(txityiが与えられている)が知られている持っています。

システムはunderspecifiedされなかった場合でも、

、未知数の一部は(rmi0製品)自分たちの中で乗算され、システムの非線形を作る(あなたは、各製品に新しい名前を割り当てる線形システムにそれを変換することができていますが、 「LL)13個の未知数でまだ終了し、そのうちの3は無限のソリューションに拡張されます。

あなたが推論または数学内の任意の欠陥を見つけることができる場合は、

、私に教えてくださいます。

Dropboxは第自tech blog場についての提言を付してどのように解決の問題をスキャナーアプリです。

https://blogs.dropbox.com/tech/2016/08/fast-document-rectification-and-enhancement/

整流用文書

この入力ドキュメント内は長方形の物理的な世界がない場合は正確に面した、カメラによるコーナーのイメージの一般的な凸quadrilateral.でご満足いただけるよう心がけをしなければな運動の幾何学的変換の適用による捕獲す。この変換に依存しての視点カメラのドキュメントからの相対す(これらはいわゆる外在的パラメータ、などの焦点距離をカメラには固有のパラメータこの図のキャプチャ動作をシナリオ:

のための運動の幾何学的変換のためには、まず決定のパラメータ。場合を想定していますカ対称カメラ(非点収差、スキュー、など)には、不思議な現象がいろいろあるこのモデルは:

  • 3次元位置をカメラのドキュメントからの相対(3自由度),
  • 3次元方位カメラのドキュメントからの相対(3自由度),
  • の寸法のための書類(2自由度)
  • の焦点距離をカメラ1自由度).

ッドのx座標とy座標を検出した文書の角く効果的につ。がありますが一見不思議な現象がいろいろあり(9)以上の制約(8)は、不思議な現象がいろいろあるように自由変数を—からのスケールの文書を物理的にでからさらにカメラを同一の写真です。この関連箇所には追加の制約しておりますので、完全に制約のあるシステムである。(実際のシステムの方程式を解くには複数の配慮;に関連するWikipedia記事となってい概要: https://en.wikipedia.org/wiki/Camera_resectioning)

一度にパラメータで回復した運動の幾何学的変換用のキャプチャのプロセスを得る素敵な長方形のイメージです。しかし、これは潜在的にも時間がかかるプロセス:一見上げて、それぞれの出力ピクセルの値に対応する入力ピクセルは、ソースイメージです。もちろん、Gpuに特別に設計されたような仕事をするようになったこ描画の質感を仮想空間です。が存在するビューに変えるが、逆にカメラを変換しただけで解決!—最もあてはまるものをつき描画の入力画像を得る整流ます。(簡単に見ることに注意のことばの入力画像の画面に電話できるチルト、翻訳、電話などの見を文書の画面で直線が表示されます。)

最後に、記憶が曖昧さに関して規模:いるのかを、文書の文字サイズの用紙(8.5×11")またはポスターボード(17"×22)を備えています。どうすれば、寸法の出力イメージ。を解決するこの曖昧さをカウント数のピクセルのquadrilateralの入力画像に設定出力解像度に合致させることにより、このピクセル数です。の考え方はしないupsampleはdownsampleの画像。

があるようですが一部の混乱がこの興味深い問題です。教えていてやりがいも感じるのは、わかりやすい説明をする際の問題と解決できるものではないのである.

制約条件の自由度

一般的にきて問題に直面しようこのについては、評価の不自由度(自由度Nの独立方程式をMとしての制約などには不自由度.ことはできな問題は解決された場合を超えたM(意味が少なくなった制約が未知数).また原則すべての問題がある場合とでは解決不可能に.場合にNを超えないものMで 解決はでき問題なかった独自のソリューションが保証されません(第二に、前項の規定のための一例)です。

プログラムを利用しましょう p1, p2, p3 p4ァの位置は4角の平面側の世界座標です。プログラムを利用しましょう Rt する3次元回転や翻訳のに変えるこれらのカメラ座標です。プログラムを利用しましょう K を主張するためには3×3カメラ固有で行います。また無視するレンズ歪みます。2次元の位置 ithコーナーでは、カメラの画像で与えられます qi=f(K(Rpi+t場所は、見通しに関数f(x,y,z)=(x/z,y/z)を表す.この方程式をしている各コーナーのお二方程式(二つの制約)が元:一からのx成分 q私はyの部品です。しておりますので、計8つの制約することが可能です。正式名称をこれらの制約についての 再投影の制約.

それでは当社の未知の自由度?確かに Rt 不明しますので、わからない、カメラのポーズの世界座標です。そこで、既に6未知の自由度:3 R (例:ヨーイング、ピッチとロールが3 t.そのためがある場合がありますの最大の 二つの においても未知の残りの条件(K, p1, p2, p3, p4). 

異なる問題

を構築する事を目的としてい異なる問題によって二つの条件(K, p1, p2, p3, p4)を行うことができることとしています。この点を書いてみように出 K 通常のフォーム: K=(fx,0,cx;0,fy,年;0,0,1)のfxとfyの焦点距離(fx/年度は、通常の画面の比率)、(cx,cy)の主点(センターのシミュレーションの画像)となっています。

また取得する問題によりfxとfyの二つの不思議な現象がいろいろあとることを想定していない(cx,cy, p1, p2, p3, p4)全て知られている。確かにこの問題を使用する内OpenCVのカメラ校正方法の採用により、画像を用いた、長文過ぎてスミマセン><平面の目標です。これを取得するために使用される初期推定のためのfxとfy、その主なポイントは、画像センター(はとってもリーズナブルな前提はほとんどのカメラ.

またこれを異なる問題を想定して為替=年度は、もった多くのカメラを、この焦点距離(字f)は、 のみ 不明 K.そのためまだ一元左手(回収できる最大の二つの事柄).で利用しましょうこによる仮定して知られる形状の平面:として矩形をしたと仮定さい。そのためになるもので隅々までとしており p1=(0,0,0), p2=(0,w0), p3=h,0,0)および p4=h,w,0)、hとw示の高さおよび幅の矩形を塗りつぶします。現在、いいの1未知の左図のように設定してい平面のアスペクト比:x=w/hとなります。そこで問題ができるし、同時に回復x,f Rt から8再制約をもたらすのかその答えが出があり!とソリューション問題解決をは張の論文引用の問題をもたらしていました。

の曖昧性

なのでしょうかこの場合の問題を解決することができ:場合に想定していま K で、2つの不思議な現象がいろいろあhとw.できることを明らかに再投影方程式の?答えはnoであるため、何か困ったことがあれば曖昧さのサイズの平面、平面の深みとさせていただきます。具体的にはがし角 pi s-規模 t s、s解除の再投影方程式そのための絶対規模の面内せんの減損の有無を検討しています。

ありその他の問題の異なる組み合わせのための自由度を有し、例えば R, t, 一点の部品の平面"s幅として不思議な現象がいろいろあ.しかし一つのニーズを考える場合には実用的ではない。しかしまだまだ見ている体系的なセリケーションをうまく設定して有用な組み合わせ!

より多くのポイント

様にぜひ手にしていただきたいことをした場合に追加点との対応関係機をイメージ活用の端面まで回復以上8未知の自由度.残念な答えはnoです。こんに追加者に独立。なぜなら、4つの角を記述す 完全に の変換を平面の画像です。これにより形成されhomographyマトリクスの四隅には、その他のすべてのポイントの平面をイメージです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top