opencv undistort函数里面需要用的畸变系数矩阵的单位应该是什么呢?

我有用halcon标定的相机参数,畸变系数K1,K2,K3,P1,P2,然后用opencv处理同一张照片去畸变的时候,输入进halcon标定得到的参数,无法去除畸变,请问有人遇到过类似情况么,应该如何解决,我看halcon得到的畸变系数都是带单位的,是因为这个的问题么?

1个回答

我用的是opencv2.4.13.2,然后是c++的。
我已经成功获取了摄像机的内参矩阵,以及畸变矩阵。也已经成功畸变矫正。但是我还希望获取原图中心点undistort之后的对应点。

前置代码

这部分代码的作用是畸变矫正。实际上和题目关系不大,而且你们也很容易在网上找到(当然是有不少错误的版本)。不过我还是放上来:

Mat cameraMatrix = Mat::eye(3, 3, CV_64F);
//内参矩阵, 就算复制代码,也不要用我的参数。摄像头都不一样...
cameraMatrix.at<double>(0, 0) = 2.075319928848340e+03;
cameraMatrix.at<double>(0, 1) = 0;
cameraMatrix.at<double>(0, 2) = 1.273350420020438e+03;
cameraMatrix.at<double>(1, 1) = 2.073416138777327e+03;
cameraMatrix.at<double>(1, 2) = 6.898818022397845e+02;
//畸变参数,不要用我的参数~
Mat distCoeffs = Mat::zeros(5, 1, CV_64F);
distCoeffs.at<double>(0, 0) = 0.005961692158170;
distCoeffs.at<double>(1, 0) = 0.014892085926656;
distCoeffs.at<double>(2, 0) = -0.007714274148788;
distCoeffs.at<double>(3, 0) = -0.010548832296675;
distCoeffs.at<double>(4, 0) = 0;
Mat view, rview, map1, map2;
Size imageSize;
imageSize = image.size();
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),

getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),
imageSize, CV_16SC2, map1, map2);
remap(image, image, map1, map2, INTER_LINEAR);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
那么,在remap函数之后,image就是我们畸变矫正的结果了。

Attempt1:undistortPoints

首先,我在网上一搜,这个函数就冒了出来。undistortPoints, 矫正后的点,emmmmmmm,看起来很美。从结果来说,实际上是坑爹的。

std::vector obj_corners(1);
obj_corners[0] = Point2d((double)input_center_point.x,(double)input_center_point.y);
std::vector scene_corners(1);
//obj_corners:输入
//scene_corners:输出
undistortPoints(obj_corners,scene_corners,cameraMatrix,distCoeffs);
1
2
3
4
5
6
结果怎么这么小?

11-24 23:03:38.971 9133-9410/? I/MyCV: scene_corners width is 0.034107
11-24 23:03:38.971 9133-9410/? I/MyCV: scene_corners height is 0.031944
1
2
实际上,在得到结果之后,还要有一步:

//Focus_length: 焦距,分fx和fy的。看不懂的同学请从头学习内参矩阵或者考虑换个导师或者科研题目
//Principle_Point.x:主点坐标,也是内参矩阵的一部分,同上
//scene_corners[0]: 上面undistortPoints函数的输出
result_point.x = scene_corners[0].x*Focus_length.x+Principle_Point.x;
result_point.y = scene_corners[0].y*Focus_length.y+Principle_Point.y;
1
2
3
4
5
这样,就能够算出结果。
我自己的输入是:(1344,756),而我的输出是:

11-24 23:03:38.971 9133-9410/? I/MyCV: result width is 1344.132696
11-24 23:03:38.971 9133-9410/? I/MyCV: result height is 756.114362
1
2
根本没多大变化啊?!
所以,就如我在开头说的,这个是坑爹的…它应该有其他作用,但是并不能解决我现在的问题。

attempt2:initUndistortRectifyMap()的map

然后我又查查找找,最终找到下面两个:
https://stackoverflow.com/questions/34265650/can-i-get-the-point-position-using-remap-in-opencv
https://stackoverflow.com/questions/22323410/opencvremap-how-to-remap-an-image-to-another-image-with-different-size
它们都说的是什么呢?两个说了一件事:那就是通过initUndistortRectifyMap函数:

initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),
getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),
imageSize, CV_16SC2, map1, map2);
1
2
3
返回的map1,map2来直接获得undistort之后的对应点。
于是我就试试试,这个怎么样?

map1.at(row,col)
map2.at(row,col)
1
2
这个又怎么样?

map1.at(row,col)
map2.at(row,col)
1
2
具体结果我忘了,但是都明显不对。原因是map1,和map2的格式早就由initUndistortRectifyMap函数决定了。仔细看看其中的参数,CV_16SC2定义了map1的格式。map2的type我打出来是:

11-24 23:03:37.687 9133-9426/? I/MyCV: map2 16UC1
1
于是我根据这里的type和mat格式的对应关系又试了这个:

map1.at(row,col)
map2.at(row,col)
1
2

结果还是不对。

作者:夜风皓月改
来源:CSDN
原文:https://blog.csdn.net/qq_20289205/article/details/78632542
版权声明:本文为博主原创文章,转载请附上博文链接!

qq_37675107
qq_37675107 方便看一下 你畸变系数那四个量K1K2P1P1的单位是什么么?
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
透镜畸变和畸变校准(OpenCV)
透镜畸变和畸变校准(OpenCV)透镜畸变理想的相机模型应该是小孔成像模型,但由于透镜制造和相机镜头安装等因素,必然会导致畸变的存在。畸变主要分为径向畸变、切向畸变和薄棱镜畸变。1.径向畸变径向畸变主要由透镜本身导致的,远离透镜中心的光线比靠近中心的光线弯曲的更严重。图1显示矩形网格因镜像畸变而产生的位移。从前面看,光心越向外,矩形网格上的点的位移越大。图1 透镜的径向畸变图,箭头显示径向畸变图像上
Opencv中的两种去畸变函数
Opencv中的两种去畸变函数前言两者的不同inner和outer的来源结束语 前言 参考 https://www.cnblogs.com/riddick/p/6711263.html 我们知道目前opencv在标定完后得到相机内参及畸变系数,要么通过cv::undistort()直接得到去畸变的图像,要么通过cv::getOptimalNewCameraMatrix()得到新的矩阵,再通过cv:...
【OpenCV】摄像机标定+畸变校正
通过MATLAB和OpenCV对摄像机进行标定,附程序!
摄像机畸变模型(opencv)
摄像机畸变模型(opencv)
图像畸变校正opencv
使用USB摄像头,采集一副图像,然后对图像畸变校正。摄像头事先标定好
关于opencv通过initUndistortRectifyMap函数获取undistort后的对应点的方法
关于opencv通过initUndistortRectifyMap函数获取undistort后的对应点的方法
opencv 透视变换矫正图像畸变
简述 在图像处理中,因为镜头角度等原因,容易导致图像出现倾斜、变形等情况,为了方便后续处理我们常常需要进行图像矫正,其中主要技术原理是两种变换类型--仿射变换(Affine Transformation)和透视变换(Perspective Transformation)。 详解 仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括“平直性”以及“平行性”,常用于图像翻...
opencv标定和畸变校正
使用opencv试下camera标定和畸变校正
OpenCV 标定和畸变校正
1.摄像机成像原理 成像的过程实质上是4个坐标系的转换。首先空间中的一点由 世界坐标系 转换到 摄像机坐标系 ,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到图像平面 ( 图像像素坐标系 ) 。   下文对4个坐标系的 变换做了详细的解释: http://blog.csdn.net/humanking7/article/details
opencv鱼眼镜头畸变矫正
使用opencv3.2.0+vs2013 ,采用opencv原版鱼眼镜头畸变矫正,自动拍图,自动计算保存结果,可显示并查看结果。
opencv 反透视变换矫正畸变
###对该程序做如下说明: * 采用的是opencv3.X版本 * 针对不同的图片,需要自己手动修改阈值`g_threshVal, g_threshMax` * 程序是根据[`这一篇博客`](https://blog.csdn.net/rrrfff/article/details/77340641#commentBox)写的,只是自己调通了以后,给大家也分享下 * 因为是自动找点,所以在设置的不太合理的情况下,会出现很奇怪的现象,后果不堪设想。
图像畸变校正OPENCV 程序
图像畸变校正OPENCV 程序,用做参考。
MATLAB相机标定及OpenCV畸变校准
https://blog.csdn.net/u013498583/article/details/71404323 畸变参数,总共有五个,径向畸变3个(k1,k2,k3)和切向畸变2个(p1,p2)。 以及在OpenCV中的畸变系数的排列(这点一定要注意k1,k2,p1,p2,k3),千万不要以为k是连着的。 并且通过实验表明,三个参数的时候由于k3所对应的非线性较为剧烈。估计的不好,容易产生极...
opengl里面参数的单位是什么?不太懂
glFrustum(-1.0,1.0,-1.0,1.0,3.5,6.0);rn这样的,不是象素,好象也不是窗口大小,是什么啊rn
opencv initundistortrectifymap()函数,为什么是在相机坐标系下去畸变
[size=24px]最近在看张正友标定和畸变校正的的Opencv源代码, 求出畸变系数后利用initundistortrectifymap()函数和remap()函数进行畸变校正。但是有一点不明白的就是,在initundistortrectifymap()函数中,是先将图像坐标(u, v)转换摄像机坐标系,再到世界坐标(X, Y, Z),然后在转换到摄像机坐标系(x', y', 1),在摄像机坐标系中利用畸变校正模型得到去畸变后的坐标(x'', y'', 1),然后再转换到图像坐标系(u', v'),这是什么原理呢?求大神指导,如果能够详细的解释整个过程,更是感激不尽!![img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/5.gif][/img][/size]
mouse_event的中键滚动的值是什么单位呢?
如题,函数原型:rn  VOID mouse_event(rn  DWORD dwFlags, // motion and click optionsrn  DWORD dx, // horizontal position or changern  DWORD dy, // vertical position or changern  DWORD dwData, // wheel movementrn  ULONG_PTR dwExtraInfo // application-defined informationrn  );rndwData:如果dwFlags为MOUSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。rnrnrn请问各位大侠,这个数值,是什么单位呢?如何和其他单位换算呢?
鼠标消息的坐标是什么单位的呢?
鼠标消息的lParam 发送过来的是什么单位的坐标呢?rn看上去数值很大应该不是象素吧
请问这应该是什么函数?
请问高手,我现在要编写的程序为A程序,要实现的是获得另一个程序B的文本输入框,并在其能够自动输入指令,(B程序并没有A的输入接口,B程序的运行是依靠人工手动输入指令的),请问,A怎样编写,具体用什么函数!rn多谢!rn
这个函数的反函数应该是什么?
htmlspecialchars( stripslashes($var))
XML里面需要用替代的符号
XML里面一些特殊符号要用特别的表示:  特殊字符   替代符号      &            &amp;           >            &gt;      "             &quot;      '              &apos; 但是我们可以用CDATA来写我们不想被编译的符号: 格式为 比如:=1]]>效果与 &gt;
相机成像所说的径向畸变和切向畸变是什么区别?
请问rn1、对一张普通(广角)镜头拍的数码相机照片来说,主要存在径向畸变和切向畸变这两种变形,对吗?rn2、径向畸变是不是指的离照片中心点越远则变形越大?rn3、切向畸变是什么?rn 谢谢!
单位阶跃和单位冲击函数
单位阶跃和单位冲击函数的资料,助于自学。
OpenCV摄像头畸变标定生成xml文件
https://blog.csdn.net/Li_haiyu/article/details/82782400
靠谱的opencv摄像头畸变标定
我们用opencv的例程来进行标定,在你的opencv目录下 sources\samples\cpp\tutorial_code\calib3d\camera_calibration 有3个文件 : camera_calibration.cpp VID5.xml in_VID5.xml 第一个是标定程序的源代码。 第二个是配置文件,你可以更改标定图片获取的方式以及标定板的
基于opencv的图像梯形畸变(透视)校正
#include<cv.h> #include<highgui.h>//#pragma comment(lib, "cv.lib") //#pragma comment(lib, "cxcore.lib") //#pragma comment(lib, "highgui.lib")int main() { CvPoint2D32f srcTri[4], dstTri[4]; CvMa
鱼眼摄像头标定与畸变校正(双OPENCV版本)
最近在整理自己以前做过的一些东西,这是基于opencv的鱼眼摄像头畸变校正程序的github地址(https://github.com/WordZzzz/fisheye_calibration)(不知道怎么设置免积分下载,所以只能贴上github了)。 其中: normal_calibrate:基于OPENCV2与OPENCV3通用的函数实现,可实现USB摄像头实时畸变校正; fishey_calibrate:基于OPENCV3独有的fishyey结构体实现,可实现USB摄像头实时畸变校正; fishey_calibrate_img:基于OPENCV3独有的fishyey结构体实现,可实现单张图片畸变校正;
基于opencv的张正友畸变矫正
基于opencv的张正友畸变矫正,里面有28张棋盘图,程序可行。
OpenCV 标定和畸变校正(2)
海尔冰箱的标定和畸变校正。上篇文章中直接使用OpenCV的例程进行畸变校正的效果不太理想。使用以下方法(张正友)效果更好。 标定代码: /************************************************************************ 运行环境:VS2013+OpenCV 2.4.13 运行结果:检测拍摄的棋盘畸变图像,获取摄像头的畸变信
张氏相机标定法和畸变矫正opencv代码
原理部分可见上一篇博客,这一部分主要是关于opencv实现: 这部分代码参考网上教程张氏标定法,但我觉得部分地方可能存在问题,后续会继续看一下官方代码 完整代码和棋盘图片下载可从这里下载 基本思路为: 检测代标定图像的内角点findChessboardCorners 利用find4QuadCornerSubpix寻找更精细的像素级坐标 根据测量的标定板的格子尺寸得到真实世界坐标系中内角点坐标 利...
基于opencv的二维码畸变矫正(QT程序)
本代码,基于opencv寻找二维码的四个顶点,并通过仿射变换对二维码进行畸变矫正。不须标定,简单易用。
opencv鱼眼镜头畸变矫正2
自动获取路径下所有图片,结合所拍到的大量图片重新精确计算鱼眼镜头内参,配合opencv鱼眼镜头畸变矫正程序使用。
opencv 普通相机畸变标定校正
opencv 普通相机畸变标定校正http://blog.csdn.net/qq_15947787/article/details/51471535
OpenCV编程->单目相机内参及畸变求解
/*------------------------------------------------------------------------------------------*\ This file contains material supporting chapter 9 of the cookbook: Computer Vision Programming usi
【opencv】鱼眼图像畸变校正——透视变换
提出一种新的360度鱼眼镜头畸变多个视图校正方法,在球面透视投影基础上,进行透视变换,校正各个视角的图像畸变。 球面透视投影可以很好的解决正视图下畸变,但是对于周围其他角度视图则会引入透视效果,当然可以通过一点透视模型校正,在这里我利用opencv透视变换也可以更好的解决。另外还存在的问题是,球面透视投影会使得图像边缘拉伸很严重。 原图 球面透视投影(以空间左手坐标系,x轴为水平,y为竖直
OpenCV图像稀疏点去畸变undistortPoints()
OpenCV图像稀疏点去畸变undistortPoints 函数undistortPoints()
bps是什么单位?是什么意思
1M带宽的意思是1Mbps注意是bps而不是Bps! 换算吧,1Bps=8bps; 所以1Mbps=128KBps; 所以下载速度最高为128KBps 1Mbps=1024KBps/8=128KBps 随便说说什么是bps bps是bits per second的缩写,表示比特/秒。那么客户下载一首5兆的MP3歌曲, 需要多长时间?这与下载速率有直接的关系。 以普通的ADSL为例(基
opencv迭代去畸变算法(含源码分析)
函数简介 opencv中函数undistortPoints()用于对图像点坐标进行去畸变,以下为该函数解释: void undistortPoints(InputArray src, OutputArray dst, InputArray cameraMatrix, InputArray distCoeffs, InputArray R=noArray(), InputArray P=n...
利用OPENCV为android开发畸变校正的JNI库
需要为项目提供一套畸变校正的算法,由于需要大量的矩阵运算,考虑到效率和适时性,使用JNI开发,希望把有关数组短阵的处理的变换全部放入C语言中处理。主要用于android移动端,大致的数据来源一是从camera直接读取YUV数据,一种是从第三方接读取RGB数据,另一种是直接对BITMAP进行处理。1.考虑到硬件设备接口,第三方软件接口,图像接口,OPENCV接口,希望能够开发出通用的算法库,一劳永逸
sql server里面类似于orcl里DECODE的函数是什么呢?
sql server里面类似于orcl里DECODE的函数是什么呢?
请问在jsp里面这些个函数分别是什么呢?
1、格式化日期型字段的函数,类似asp里面的formatdatetime()rnrn2、取出字符串里面左边多少个字符子串的函数,类似asp里面的left()rnrn3、替换字符串里面特定字符子串的函数,类似asp里面的replace()rnrn4、我不知道是jsp的原因还是oracle的原因,我在asp里面的用的很好的"select top 5 * from mytable order by iid desc"语句,居然会因为我加了"top 5"而报错说:未找到预期的from关键字,我的iid就是关键字的呀!rnrn以上4个问题每个20分,希望各位帮帮忙!谢谢!rnrn
相关热词 c# 线程结束时执行 c# kb mb 图片 c# 替换第几位字符 c#项目决定成败 c# 与matlab c# xml缩进 c#传感器基础 c#操作wps c# md5使用方法 c# 引用父窗口的组件