首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV :如果我知道Gimp中的镜头校正因子,如何为‘不失真’提供矩阵?

OpenCV :如果我知道Gimp中的镜头校正因子,如何为‘不失真’提供矩阵?
EN

Stack Overflow用户
提问于 2016-11-11 10:28:02
回答 2查看 1.7K关注 0票数 0

我从IP摄像头上得到的图像有很强的鱼眼效果。我发现,在Gimp中,我可以通过应用“主”值为-30的透镜失真滤波器(所有其他参数都保持为零)来获得直线。

现在,我需要使用OpenCV临时完成这个任务。我认为,不失真函数在imgproc中调用是正确的。但是如何生成正确的摄像机和失真矩阵呢?我看到有一个calibrateCamera函数,但是似乎你需要一个计算机视觉上的PhD来使用它。毫无线索。因为我知道一个参数,所以必须有一种简单的方法将它转化为“不失真”所期望的矩阵?

注:我只需要径向畸变系数,我对切向畸变不感兴趣。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-11 18:03:20

opencv为定标提供了一个示例。为此,您所需要的只是棋盘图像列表(大约20张应该是好的)。用你想要的相机拍的。它将给你所有需要的参数(失真系数,内在参数等)。然后,您可以使用opencv的“不失真”功能来纠正您的形象。您需要在default.xml中更改(或者您可以创建自己的.xml)包含图像地址、内部方块计数及其在现实世界中的维度的xml文件的名称。

你有你需要的参数:-)

票数 1
EN

Stack Overflow用户

发布于 2016-11-11 18:16:39

对于那些想知道校准工具来自哪里的人来说。似乎得从源头上建造它。这就是我在Linux上所做的:

代码语言:javascript
复制
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout -b 3.1.0 3.1.0  # make sure we build that version
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_EXAMPLES=ON ..
make -j4

然后校准:

代码语言:javascript
复制
./bin/cpp-example-calibration -w=8 -h=6 -o=camera.yml -op -oe -su image_list.xml

-su允许您验证图像是如何处理非失真的.-w-h参数采用“内角”,这不是棋盘图案中的平方数,而是(num-black-squares - 1) * 2

以下是最后如何使用Scala和JavaCV应用透视图转换:

代码语言:javascript
复制
import org.bytedeco.javacpp.indexer.FloatRawIndexer
import org.bytedeco.javacpp.opencv_core.Mat
import org.bytedeco.javacpp.{opencv_core, opencv_imgcodecs, opencv_imgproc}
import java.io.File

// from the camera_matrix > data part of the yml:
val cameraFocal = 1.4656877976320607e+03
val cameraCX    = 1920.0/2
val cameraCY    = 1080.0/2

val cameraMatrixData = Array[Double](
  cameraFocal, 0.0        , cameraCX,
  0.0        , cameraFocal, cameraCY,
  0.0        , 0.0        , 1.0
)

// from the distortion_coefficients of the yml:
val distMatrixData = Array[Double](
  -4.016824381742e-01, 4.368842493074e-02, 0.0, 0.0, 1.096412142704e-01
)

def run(in: File, out: File): Unit = {
  val matOut  = new Mat
  val camMat  = new Mat(3, 3, opencv_core.CV_32FC1)
  val camIdx  = camMat.createIndexer[FloatRawIndexer]
  for (row <- 0 until 3) {
    for (col <- 0 until 3) {
      camIdx.put(row, col, cameraMatrixData(row * 3 + col).toFloat)
    }
  }
  val distVec = new Mat(1, 5, opencv_core.CV_32FC1)
  val distIdx = distVec.createIndexer[FloatRawIndexer]
  for (col <- 0 until 5) {
    distIdx.put(0, col, distMatrixData(col).toFloat)
  }

  val matIn   = opencv_imgcodecs.imread(in.getPath)
  opencv_imgproc.undistort(matIn, matOut, camMat, distVec)
  opencv_imgcodecs.imwrite(out.getPath, matOut)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40545992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档