校准相机以确定固有参数

时间:2020-04-09 10:43:24

标签: c++ opencv camera-calibration

我一直在努力使用带有c ++的openCV进行正确的校准。 下面,我包括了用于计算的代码段,如果您能指出我做错了什么或如何改进它,将不胜感激。

import shapeless.ops.hlist
import shapeless.ops.hlist.{Comapped, Reify}
import shapeless.{Generic, HList, HNil}

object ShapelessTest2 {

  case class Definition[T](id: String) {
    type V = Value[this.type]

    def createValue(value: Option[T]) =
      new Value[this.type] {
        type NT = T
        override val valueT: Option[T] = value
        override val attrDef: Definition.this.type = Definition.this
      }
  }

  trait Value[D] {
    type NT
    val attrDef: D
    val valueT: Option[NT]
  }

  object DefA extends Definition[Int]("defA")
  object DefB extends Definition[Int]("defB")
  object DefC extends Definition[String]("defC")

  case class Instance(valA: DefA.V,
                      valB: DefB.V,
                      valC: DefC.V)

  // Compile safe
  val Inst1: Instance = Instance(
    DefA.createValue(Some(1)),
    DefB.createValue(Some(2)),
    DefC.createValue(Some("2"))
  )

  def main(args: Array[String]): Unit = {
    def empty[A <: Product] = new PartiallyApplied[A]

    class PartiallyApplied[A <: Product] {
      def apply[
          V <: HList,
          DL <: HList,
          RDL <: HList,
          H <: Definition[_],
          T <: HList
      ]()(
          implicit
          gen: Generic.Aux[A, V],
          comapped: Comapped.Aux[V, Value, DL],
          reify: Reify.Aux[DL, RDL],
          isHCons: hlist.IsHCons.Aux[RDL, H, T],
      ): A = {
        def getEmpties[L](list: RDL): V = {
          val hlist = list match {
            case HNil => HNil
            case _ => list.head.createValue(None) :: getEmpties(list.tail.asInstanceOf[RDL])
          }
          hlist.asInstanceOf[V]
        }

        val empties = getEmpties(reify.apply())
        gen.from(empties)
      }
    }

    val emptyInstance = empty[Instance]()
    println(s"Empty valA: ${emptyInstance.valA.attrDef} - ${emptyInstance.valA.valueT}")
    println(s"Empty valB: ${emptyInstance.valB.attrDef} - ${emptyInstance.valB.valueT}")
    println(s"Empty valC: ${emptyInstance.valC.attrDef} - ${emptyInstance.valC.valueT}")
  }
}

以下是我通过openCV获得的输出。

output

这是预期的输出。我已经从matlab计算出此校准值。

expected_output

我不尝试匹配结果!但想了解为什么Fy和Cx值均为0,以及为什么internal.at(0,1)非零?那我在做什么错了?

这是校准过程的最小代码:http://collabedit.com/3vay2 如果有人有兴趣。

1 个答案:

答案 0 :(得分:1)

最后弄清楚了问题所在。感谢-@Micka

所以由于数据类型不匹配,我得到了垃圾值。当我为Mat参数使用float类型时,Opencv期望双精度。这也是产生非预期值的原因,例如internal.at(0,1)处的非零值。

这实际上使我怀疑我的实施。但是将其转换为双精度也可以解决该问题。 尽管我不确定将float的double值0强制转换为6.05179。可能与OpenCV的隐藏实现有关。