摄像机标定和图像径向畸变校正

news/2024/9/22 20:30:36/

这段时间断断续续在弄这个摄像头的标定和图像畸形矫正的问题,基本差不多了,乘休息时间,发点成果和大家分享吧!

一、标定

 关于摄像头的标定,说实话网上的资料太多了,方法也很多的。个人觉得想要研究这个的话,可以先了解基本原理,然后看opencv的例子calibration。如果你还了解的更深入的话,建议下载一些论文看看。

当然我推荐一个网址:http://www.ti-times.com/dfiles.asp?fl=download(深圳科创时代)我也是在查找资料的过程中发现的,觉得它上面为我们总结了很多有用的资料。

 

在这里说明一点。opencv的calibration是基于张正友标定法的,我们在标定的过程中要避免两次标定板的角度倾斜相差过小,这样会产生很大的误差(当然我们可以结合一些论文上的方法的来改进算法)。

 

上一张截图 : http://hi.csdn.net/space-9784-do-album-picid-497526-goto-down.html(CSDN的blog上传图片功能被和谐了)

 

二、畸形矫正

其实在opencv的calibration这个例子中完成了畸形矫正。但是我在我的工程中,由于一些条件的限制,在没有做矫正的情况下,2.8的镜头刚好照满整个触摸区域,但是经过矫正后,由于主要是径向畸变,可是opencv是校正前后图像一样大小的做法,必然导致有一部分校正后的图像被裁剪了。没办法,我只好自己去按原理写最基本的校正算法了。现在贴一些基本算法原理出来。

 

图片 : http://hi.csdn.net/space-9784-do-album-picid-497527-goto-down.html

 

具体代码如下:(TMD,插代码的也被和谐了,么烂CSDN,准备转移blog了)

//#pragma parallel omp for
   for (int i = 0; i < realWidth; i ++)
   {
    //#pragma parallel omp for
    for (int j = 0; j < realHeight; j ++)
    {
     // 图像物理坐标系中点在图像像素坐标系中的对应点u、v
     double u = i - 65;
     double v = j - 25;

     // 根据图像在图像物理和图像像素坐标系中点的关系来计算图像物理坐标系中的点
     // 
     // u = x / dx + u0  fx = 1 / dx
     // v = y / dy + v0  fy = 1 / dy
     double x = (u - u0) / fx;
     double y = (v - v0) / fy;

     double r2 = pow(x, 2) + pow(y, 2);
     double r4 = pow(r2, 2);

     double fr = 1 + k1 * r2 + k2 * r4 + k3 * r2 * r4;

     double ud = (u - u0) * fr + u0;
     double vd = (v - v0) * fr + v0;

     int u0 = int(ud);
     int v0 = int(vd);
     int u1 = int(1 + ud);
     int v1 = int(1 + vd);

     if (ud > 0 && ud < 640 && vd > 0 && vd < 480)
     {
      fcImagePlus->image.pData[i + j * realWidth] = pixelInterpolation(tmpImage[0].image.pData, 
                                                              ud, vd, u0, v0, u1, v1);
     }
    }
   }

结果贴图:

http://hi.csdn.net/space-9784-do-album-picid-497528-goto-down.html

http://hi.csdn.net/space-9784-do-album-picid-497525-goto-down.html


转自:http://blog.csdn.net/li_007/article/details/5384937


http://www.ppmy.cn/news/735261.html

相关文章

ESP8266类库的使用——总体概述

在文章《ArduinoESP8266连接WiFi》与文章《ESP8266联网测试》中&#xff0c;我们通过查询ESP8266的AT指令&#xff0c;编写相应的函数实现ESP8266连接WiFi的功能。但是连接WiFi只是芯片的功能之一&#xff0c;为了实现物联网的目的&#xff0c;我们还有更远的路要走。 君子善假…

未检测到扫描仪Win10解决 WIA服务1061

之前正常使用的扫描仪&#xff0c;突然不能用了&#xff0c;出现未检测到扫描仪错误 Windows画图板的文件菜单里从扫描仪或相机获取而已是灰色的。 网上搜索解决方案&#xff0c;一堆垃圾文章&#xff0c;毫无帮助。在设备管理器里查看图像设备是在的&#xff0c;确定驱动没有…

keil4与proteus的联调

联调 顾名思义即是联合调试的意思&#xff0c;是指keil4与proteus联合调试&#xff0c;在进行联调是需要做好以下配置的。 1.第一步是将.DLL文复制到安装keil路径的BIN目录&#xff0c;所以一定要记住自己把keil装在哪儿了,博文下面有需要的.DLL文件。 2.万一忘记了自己装在哪…

ActiveX控件v7.2.0.1,Viscom Scanner ActiveX控件

ActiveX控件能够使用带有进纸器的扫描仪扫描多页&#xff0c;在最后一页扫描时自动保存为多页PDF或TIFF。 ActiveX控件有能力检测卡纸事件。q2315702359 ActiveX控件从所有TWAIN兼容扫描仪和网络摄像头设备捕获图像。 支持将扫描的图像保存到 Microsoft Word(docx)。 ActiveX控…

正点原子IMX6UL IIC RTC驱动DS3231

1 前言 觉得Imx6内部的RTC时钟不是很准,于是外置RTC芯片ds3231 在源码里一查, 发现在driver/rtc/rtc-ds1307.c中 2 修改设备树 ds3231地址可以查询数据表: 0xd0 , 但是linux 设备树要右移一位, 于是就成了0x68 也可以通过i2ctest来检测地址 &i2c1 {clock-frequency <…

《ESP32-Arduino开发》GUI设计 LVGL 开发环境搭建教程(从工程目录到模拟器)

前言&#xff1a;最近闲着无聊&#xff0c;看到手头正好有一块tft彩屏&#xff0c;想着拿来玩玩。既然用到了显示屏&#xff0c;自然是离不开ui设计&#xff0c;lvgl是嵌入式一个开源图形库&#xff0c;具备“Light”(轻量)和"Versatile"(可用性强)等特点。对于我而言…

安装单片机开发工具Keil5和仿真开发板proteus

项目场景&#xff1a; 安装单片机开发工具Keil5和仿真开发板proteus 为啥不买开发板? 这里不使用开发板的原因是单独买个开发板其实还行&#xff0c;但是很多外设&#xff0c;而且加上本来自己是自学的&#xff0c;啥也不懂&#xff0c;坏的几率很大。 网上说买开发板实际开…

LeViT: aVision Transformer in ConvNet‘s Clothing for Fast in

摘要 我们设计了一系列图像分类架构&#xff0c;可以在高速模式下优化精度和效率之间的平衡。我们的工作利用了基于注意力的体系结构的最新发现&#xff0c;这种体系结构在高度并行处理硬件上具有竞争力。我们重温了大量文献中关于卷积神经网络的原理&#xff0c;并将其用于tr…