我一直在努力使用带有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获得的输出。
这是预期的输出。我已经从matlab计算出此校准值。
我不尝试匹配结果!但想了解为什么Fy和Cx值均为0,以及为什么internal.at(0,1)非零?那我在做什么错了?
这是校准过程的最小代码:http://collabedit.com/3vay2 如果有人有兴趣。
答案 0 :(得分:1)
最后弄清楚了问题所在。感谢-@Micka
所以由于数据类型不匹配,我得到了垃圾值。当我为Mat参数使用float类型时,Opencv期望双精度。这也是产生非预期值的原因,例如internal.at(0,1)处的非零值。
这实际上使我怀疑我的实施。但是将其转换为双精度也可以解决该问题。 尽管我不确定将float的double值0强制转换为6.05179。可能与OpenCV的隐藏实现有关。