1.Opencv中的两种去畸变函数
2.Opencv常用api
3.opencv重映射:remap( )
4.相机径向和切向畸变及去畸变
5.OpenCV 之 Remap
6.opencv去畸变的方法图像去畸变vs点畸变
Opencv中的两种去畸变函数
在探讨 OpenCV 中的两种去畸变函数前,我们首先需要了解畸变校正和损失有效像素原理。在相机标定后,OpenCV 提供了两种主要方法来处理图像畸变:直接使用 cv::undistort() 函数得到去畸变图像,或通过 cv::getOptimalNewCameraMatrix() 获取新的矩阵,再利用 cv::initUndistortRectifyMap() 和 cv::remap() 函数映射原图至新图。vb扫雷源码
在比较两种方法的差异之前,让我们先对 getOptimalNewCameraMatrix() 函数进行简要介绍。函数参数 alpha 对结果影响重大。当 alpha 为 0 时,生成的矩阵为内矩阵,即不包含任何黑色边框的图像大小,以此重新计算内参。如果 alpha 为 1,则生成的矩阵为外矩阵,等同于原图大小。当 alpha 在 0 到 1 之间时,将按照比例重新计算内参。内矩阵等同于不含任何黑色边框的图幅大小,而外矩阵等同于原图大小。
深入探究 getOptimalNewCameraMatrix() 的实现过程,我们发现其 inner 和 outer 矩阵的生成与原始内参和畸变系数之间存在密切联系。通过在 icvGetRectangles() 函数中生成 9x9 个点,并对这些点进行去畸变转换,我们得到外围矩阵 oX0, oY0, oX1, oY1 及内围矩阵。这些矩阵的生成有助于理解原始图像的畸变情况。
在实际应用中,如处理 Ladybug 相机时,可以自动获得去畸变图像,但通常包含黑色边框。为了去除这些边框,同城约 源码尝试将 alpha 设为 0 来得到去黑边图像。然而,当只提供相机内参而无畸变系数时,使用空畸变系数会导致内参不变。通过深入研究源码,我们发现,在畸变系数为空时,inner 与 outer 矩阵大小相同,导致 fx, fy, cx, cy 参数保持不变。因此,为了获得理想的去黑边图像,需要手动截取可视范围,并基于新左上角重新计算 cx, cy,从而得到新的去黑边图像和对应的新相机内参。
综上所述,理解 OpenCV 中的两种去畸变方法有助于在实际项目中灵活选择合适的处理策略。通过分析内参、畸变系数和生成的矩阵,可以更有效地处理和优化图像,满足不同应用需求。
Opencv常用api
本文主要介绍OpenCV常用API的使用方法,包括图像色彩空间转换、像素矩阵访问、色彩值限制、图像滤波、图像创建、像素值读取与写入、图像元素操作、形态学操作、图像操作、红警c 源码卷积与模糊、边缘检测、霍夫变换、圆检测、像素映射、直方图操作与比较、模板匹配等。
在图像色彩空间转换中,使用cvtColor函数可以实现从一个色彩空间转换至另一个色彩空间,参数包括源图像、目标图像和转换方法,如COLOR_BGR2GRAY等。
通过Mat.ptr方法可以获取像素矩阵的指针,通过行索引可访问特定行的像素数据。例如,myImage.ptr(row)即可获取第row行的指针。
saturate_cast函数确保了RGB值在0~之间,以防止溢出。
定义掩膜时,使用Mat类的create方法创建Mat,例如M.create(4, 3, CV_8UC2)创建一个4x3的8位无符号字符型矩阵。
使用.at读取图像像素值,at(y, x)可以获取指定坐标的像素值。
使用addWeighted函数实现图像混合,参数包括输入图像、alpha值、输入图像、beta值、gamma值和输出图像。
使用zeros函数创建与源图像大小和类型一致的linux fprintf 源码空白图像,像素值初始化为0。
通过Mat.at(y, x)[index]=value给每个像素点的每个通道赋值。
putText、line、ellipse、rectangle和circle等函数用于图像元素绘制,例如putText可以添加文本,line、ellipse、rectangle和circle用于绘制线、椭圆、矩形和圆。
模糊操作包括均值模糊、高斯模糊、中值模糊和双边模糊,均值模糊在边缘信息丢失,高斯模糊在一定程度上克服了这一问题,中值模糊可以更好地保留边缘信息,双边模糊则在边缘信息保留的同时,保持图像轮廓不变。
结构元素使用getStructuringElement函数定义,用于形态学操作。
使用morphologyEx函数进行形态学操作,包括膨胀、腐蚀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算。
bitwise_not函数用于图像反相。流星flash源码
pyrUp与pyrDown函数分别用于图像的上采样和降采样。
filter2D函数可以自定义卷积核,实现各种图像处理效果。
在图像处理之前,可以使用copyMakeBorder函数增加边缘像素,确保图像边缘被处理。
Sobel与Scharr函数实现图像梯度计算,用于边缘检测。
GaussianBlur函数实现高斯模糊效果。
Laplacian函数实现拉普拉斯算子,用于图像边缘检测。
Canny边缘检测函数利用高斯模糊与双阈值,实现边缘检测。
标准霍夫变换与霍夫直线概率函数实现直线检测。
HoughLines函数实现从平面坐标到霍夫空间的直线检测。
HoughLinesP函数实现从平面坐标到霍夫空间的直线检测,输出直线的两个端点。
HoughCircles函数实现圆检测。
Remap函数实现像素重映射操作。
直方图均衡化函数equalizeHist实现直方图均衡化处理。
使用split函数可以将多通道图像分割成单通道图像。
通过calcHist函数计算直方图,用于图像分析。
compareHist函数比较两个直方图,用于图像匹配或分类。
模板匹配函数matchTemplate实现模板匹配操作。
opencv重映射:remap( )
在OpenCV中,remap( )函数是图像重映射的核心工具,它实现了将源图像中特定位置的像素精确地映射到目标图像的指定位置。此过程涉及两种坐标映射:一是将源图像像素映射到目标图像的非整数坐标,二是通过插值处理映射后图像的像素在源图像中的反向映射。 remap()函数接收五个关键参数:源图像src、目标图像dst,以及两个映射数组map1(x坐标)和map2(y坐标)。这两个映射数组的值都是浮点数,允许目标图像对原图像进行非整数像素的精细控制。插值方法由interpolation参数决定,如线性插值、最近邻插值等,通过它处理在映射过程中可能出现的非整数像素点。边界插值由borderMode参数指定,如常数边界或重复边界,borderValue则是指定边界插值时的填充值。 要深入理解remap( )的使用,可以参考以下链接:原文链接1:[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点
原文链接2:OpenCV学习笔记(十四):重映射:remap( )
通过实践和理解这些概念,您可以有效地在图像处理中利用remap( )进行坐标变换,以实现各种复杂的图像操作。
相机径向和切向畸变及去畸变
径向畸变原理:非近轴光线即越远离光轴的光线对更加向内弯曲,导致正方形成像后变成桶形,这也称桶形畸变。如果远离光轴的光线更加向外弯曲则为枕形畸变。
切向畸变的原理:切向畸变是透镜与成像平面不完全平行的制造缺陷造成的。
相机径向和切向畸变模型:对于归一化平面上的点,畸变影响最终为,公式如下:其中,对于廉价的网络摄像头,一般使用前两个径向畸变参数 k1,k2 就足够了。对于高度畸变的相机如鱼眼镜头,可以使用第三个径向畸变参数项 k1,k2,k3。畸变后的点,经过相机内参矩阵就得到该畸变点在图像上的像素坐标。
使用畸变参数对图像去畸变:为了得到高质量的去畸变图像,需要得到畸变矫正后的图像上的每个像素对应到去畸变前的图像(原始图像)上的像素位置,然后用双线性插值计算得到该像素的像素值。这个过程需要由去畸变后的图像坐标映射到原始图像的像素位置。
OpenCV 去畸变函数:其原理是通过initUndistortRectifyMap()函数计算得到矫正后图像上每个像素对应到带畸变图像上的坐标位置,再将其传入 remap() 函数用于畸变图像的矫正。OpenCV 还提供了undistort函数将上述两个步骤整合到一起进行图像的畸变矫正。
由畸变图像上的坐标映射到去畸变的归一化坐标点:相机畸变模型构建了畸变前的归一化坐标到畸变后的坐标的一个函数,这个函数可以用来去除图像的畸变。而由畸变图像上的坐标计算回去畸变后的归一化坐标,相当于是计算这个函数的一个反函数。OpenCV 使用了一种迭代近似算法来得到一个近似解,基本上 3 次左右的迭代就能得到重投影误差小于 0. 像素的理想点坐标,非常高效。
参考文献
OpenCV 之 Remap
在OpenCV中,图像坐标变换是一项关键操作,通过定义源图像与目标图像之间的映射关系来调整像素的位置。坐标映射分为正映射和反映射,前者是将源图像像素根据某种规则移动到目标图像,后者则是反向操作,将目标图像像素映射回源图像。 OpenCV提供了remap函数来实现这种变换,其函数原型如下:src参数是原始图像,其数据类型和目标图像dst相同,大小应与map1匹配。
dst是目标图像,与src的数据类型和大小一致,用于存储变换后的像素。
map1和map2是关键参数,map1存储了(x, y)坐标或仅x坐标,类型可以是CV_SC2、CV_FC1或CV_FC2,而map2对应y坐标,当map1包含(x, y)时,map2可以省略。
Interpolation参数是插值算法,OpenCV支持多种插值方法,但不包括INTER_AREA;常见的插值算法包括线性插值、最近邻插值等。
borderMode和borderValue则用于定义边缘处理方式,它们控制了在边界像素处的插值行为。
以下是一个简单的代码示例,展示了remap函数的使用: cppMat src, dst, map1, map2; // 初始化图像和映射矩阵
//... (图像准备和映射矩阵计算)
remap(src, dst, map1, map2, Interpolation::LINEAR, borderMode, borderValue); // 应用remap函数
//... (结果展示)
通过这个函数,可以灵活地对图像进行各种复杂的坐标变换,满足不同的图像处理需求。
opencv去畸变的方法图像去畸变vs点畸变
相机分为窄角相机和广角相机,相机模型主要分为针孔相机模型和鱼眼相机模型。
图像畸变主要分为径向切向畸变模型和鱼眼相机的Kannala-Brandt畸变模型。
在OpenCV中,进行图像去畸变的方法主要有两种:undistort函数和remap函数。
undistort函数用于处理鱼眼相机畸变,使用方法如下:cv::undistort(temp, view, cameraMatrix, distCoeffs);或cv::fisheye::undistortImage(temp, view, cameraMatrix, distCoeffs)。
remap函数则用于计算无畸变图像,步骤包括估计新的相机内参矩阵newCamMat,并通过initUndistortRectifyMap初始化畸变矫正矩阵,然后使用remap函数计算无畸变图像:Mat newCamMat;fisheye::estimateNewCameraMatrixForUndistortRectify(cameraMatrix, distCoeffs, imageSize, Matxd::eye(), newCamMat, 1);fisheye::initUndistortRectifyMap(cameraMatrix, distCoeffs, Matxd::eye(), newCamMat, imageSize, CV_SC2, map1, map2);initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(), getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0), imageSize, CV_SC2, map1, map2);remap(view, rview, map1, map2, INTER_LINEAR)。
此外,OpenCV还提供了针对点畸变的distortPoints函数,它分为鱼眼和窄角两种调用原型。
为了直观展示去畸变的过程,我们可以通过编写示例程序来实现undistort、remap和remap-undistort功能。具体实现方法和步骤可以参考OpenCV官方文档或相关教程。
鱼眼相机图像如何矫正?
相机分为窄角相机和广角相机,相机模型主要分为针孔相机模型和鱼眼相机模型。图像畸变根据模型可以分为径向切向畸变模型和鱼眼相机的Kannala-Brandt畸变模型。OpenCV提供了针对鱼眼相机图像去畸变的函数。
在OpenCV中,涉及图像去畸变的函数为undistort和remap。undistort函数有两版,分别对应普通相机和鱼眼相机。remap函数用于计算无畸变图像。
去畸变过程中,需要引入新的相机内参矩阵newCamMat,用于调节去畸变后的视野大小。通过Estimates new camera matrix for undistortion or rectification函数来估计此矩阵。之后,利用initUndistortRectifyMap函数初始化畸变矫正矩阵,并转换为map1和map2。通过remap函数,利用map1和map2计算无畸变图像。
在使用remap函数进行图像矫正时,需要调用remap函数,并将view图像、新的内参矩阵newCamMat、map1和map2作为参数输入。INTER_LINEAR插值方式用于图像矫正。
在OpenCV中,还提供了针对点的去畸变函数distortPoints,分别适用于鱼眼相机和窄角相机。
为了更好地理解和实现图像去畸变的过程,可以参考示例程序。这些程序展示了如何使用上述函数,完成图像的去畸变操作。
请注意,为了提高算法运行速度,OpenCV将undistort函数扩展为initUndistortRectifyMap函数。通过输出两个查找表map1和map2,可以更高效地进行图像矫正。
以上内容详细介绍了OpenCV中针对鱼眼相机图像去畸变的函数和过程,包括undistort和remap函数的使用方法,以及点去畸变的distortPoints函数。通过这些函数,可以有效地处理和矫正鱼眼相机拍摄的图像。为了更深入地学习和实践这些技术,可以查阅OpenCV文档或相关教程。关注我,获取更多关于计算机视觉的资源和信息。