相机畸变主要是由于透镜成像原理导致的,其畸变的原理可以参考相机模型,它的畸变按照原理可以分解为切向畸变和径向畸变。

畸变校正

opencv提供了可以直接使用的矫正算法,即通过calibrate Camera()得到的畸变系数,生成矫正后的图像。我们可以通过undistort()函数一次性完成;也可以通过initUndistortRectifyMap()和remap()的组合来处理。

1、initUndistortRectifyMap()和remap()

void initUndistortRectifyMap( InputArray cameraMatrix,

InputArray distCoeffs,

InputArray R,

InputArray newCameraMatrix,

Size size,

int m1type,

OutputArray map1,

OutputArray map2 );

函数功能:计算无畸变和修正转换映射。

参数说明:

函数说明:

这个函数用于计算无畸变和修正转换关系,为了重映射,将结果以映射的形式表达。无畸变的图像看起来就像原始的图像,就像这个图像是用内参为newCameraMatrix的且无畸变的相机采集得到的。

在单目相机例子中,newCameraMatrix一般和cameraMatrix相等,或者可以用cv::getOptimalNewCameraMatrix来计算,获得一个更好的有尺度的控制结果。

在双目相机例子中,newCameraMatrix一般是用cv::stereoRectify计算而来的,设置为P1或P2。 此外,根据R,新的相机在坐标空间中的取向是不同的。例如,它帮助配准双目相机的两个相机方向,从而使得两个图像的极线是水平的,且y坐标相同(在双目相机的两个相机谁水平放置的情况下)。 该函数实际上为反向映射算法构建映射,供反向映射使用。也就是,对于在已经修正畸变的图像中的每个像素(u,v),该函数计算原来图像(从相机中获得的原始图像)中对应的坐标系。

介绍下getOptimalNewCameraMatrix()函数。

getOptimalNewCameraMatrix(cv::InputArray cameraMatrix,

cv::InputArray distCoeffs,

cv::Size imgSize,

double alpha,

cv::Size newImgSize,

cv::Rect* validPixROI,

bool centerPrincipalPoint)

alpha之后的参数都可以视为默认。在getOptimalNewCameraMatrix()函数中,有上述一段代码,意思是从内参/畸变系数中得到两个inner和outer矩阵,当alpha为0时,取inner即内矩阵,用内矩阵大小作为新的图像大小,重新得到fx,fy,cx,cy,因此新的内参矩阵诞生了. 当alpha为1时,取outer即外矩阵。当alpha介于0~1时,则按照比例重新计算fx,fy,cx,cy。

函数输出得到map1和map2,然后使用remap()函数:

void remap( InputArray src,

OutputArray dst,

InputArray map1,

InputArray map2,

int interpolation,

int borderMode=BORDER_CONSTANT,

const Scalar& borderValue=Scalar());

第一个参数:输入图像,即原图像,需要单通道8位或者浮点类型的图像

第二个参数:输出图像,即目标图像,需和原图形一样的尺寸和类型

第三个参数:它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等

第四个参数:它有两种可能表示的对象:(1)若map1表示点(x,y)时,这个参数不代表任何值;(2)表示                                     CV_16UC1,CV_32FC1类型的Y值

第五个参数:插值方式,有四种插值方式:

(1)INTER_NEAREST——最近邻插值

(2)INTER_LINEAR——双线性插值(默认)

(3)INTER_CUBIC——双三样条插值(默认)

(4)INTER_LANCZOS4——lanczos插值(默认)

第六个参数:边界模式,默认BORDER_CONSTANT

第七个参数:边界颜色,默认Scalar()黑色

2、undistort()函数

void undistort( InputArray src, //输入原图

OutputArray dst,//输出矫正后的图像

InputArray cameraMatrix,//内参矩阵

InputArray distCoeffs,//畸变系数

InputArray newCameraMatrix=noArray() );

有时不需要矫正整个图像,而仅仅计算图像中特定点的位置,这是可以使用undistortPoints函数:

void undistortPoints( InputArray src,

OutputArray dst,

InputArray cameraMatrix,

InputArray distCoeffs,

InputArray R=noArray(),

InputArray P=noArray());

undistortPoints函数与undistort()的区别在于:参数src,dst是二维点的向量,std::vector<:point2f> ,P对应cameraMatrix。该参数与立体校正方面的使用有关。调用方式:

void undistortPoints(inputDistortedPoints,

outputUndistortedPoints,

cameraMatrix,

distCoeffs,

cv::noArray(),

cameraMatrix);

3、Python程序

### 函数引用方法

def getUndistortRectifyMap(self, imgWidth, imgHeight):

if self.mapx is not None and self.mapx.shape == (imgHeight, imgWidth):

return self.mapx, self.mapy

mtx = self.coeffs['cameraMatrix']

dist = self.coeffs['distortionCoeffs']

(newCameraMatrix, self.roi) = cv2.getOptimalNewCameraMatrix(mtx,

dist, (imgWidth,

imgHeight), 1,

(imgWidth, imgHeight))

self.mapx, self.mapy = cv2.initUndistortRectifyMap(mtx,

dist, None, newCameraMatrix,

(imgWidth, imgHeight), cv2.CV_32FC1)

return self.mapx, self.mapy

import numpy as np

import cv2

import matplotlib.pyplot as plt

image = cv2.imread('/home/zhy/Documents/Perception/Lanelinedetection/DNN/LaneNet/lanenet-lane-detection'

'/data/tusimple_test_image/chessbord690.JPG', cv2.IMREAD_COLOR)

gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

h, w = image.shape[:2] # a (1 to see the whole picture)

dist = np.array([-0.13615181, 0.53005398, 0, 0, 0]) # no translation

mtx = np.array([(1079.2921262026000022, 0.0000000000000000, 918.6822518287709727), (0.0000000000000000,

1082.8921320173517415,

555.5723432905268737),

(0.0000000000000000, 0.0000000000000000, 1.0000000000000000)])

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))

if np.size(roi) == 4 and np.mean(roi) != 0:

# undistort

mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, newcameramtx, (w, h), 5)

x, y, w, h = roi

n = 0

f = open('remp_x.txt', 'w+')

for i in range(877):

for j in range(1606):

if n % 4 != 0:

strNum = mapx[i][j] # 每行

f.write(str(strNum))

f.write(',')

else:

f.write('\n')

f.write(' ')

strNum = mapx[i][j] # 每行

f.write(str(strNum))

f.write(',')

n += 1

f.write('\n')

f.close()

#crop the image

dst = cv2.remap(image, mapx, mapy, cv2.INTER_LINEAR)

#dst = cv2.cvtColor(dst, cv2.COLOR_RGB2BGR)

plt.figure('dst')

plt.imshow(dst)

cv2.imwrite('result.jpg', dst)

4、C++程序

#include

#include

#include

using namespace std;

using namespace cv;

int main()

{ image=cv::imread("/home/zhy/Documents/Perception/camera_data/lane_image/0000.JPG");

cv::cvtColor(image,image, CV_BGR2GRAY);

cv::Mat cameraMatrix = Mat::eye(3, 3, CV_64F);

//内参矩阵, 就算复制代码,也不要用我的参数。摄像头都不一样...

cameraMatrix.at(0, 0) =1079.2921262026000022;

cameraMatrix.at(0, 1) = 0;

cameraMatrix.at(0, 2) = 918.6822518287709727;

cameraMatrix.at(1, 1) = 1082.8921320173517415;

cameraMatrix.at(1, 2) = 555.5723432905268737;

//畸变参数,不要用我的参数~

Mat distCoeffs = Mat::zeros(5, 1, CV_64F);

distCoeffs.at(0, 0) = -0.1318412926647311;

distCoeffs.at(1, 0) = -0.0036319330386551;

distCoeffs.at(2, 0) = -0.0036319330386551;

distCoeffs.at(3, 0) = -0.0037894134236598;

distCoeffs.at(4, 0) = -0.000074821933;

Mat view, rview, map1, map2;

Size imageSize;

imageSize = image.size();

initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0), imageSize, CV_32FC1, map1, map2);

//remap(image, image, map1, map2, INTER_LINEAR);

std::string fileName = "rmp_x.txt" ;

int n=0;

std::ofstream outfile( fileName.c_str() ) ; // file name and the operation type.

for(int i=0; i

for(int j=0; j

if (n%4!=0)

outfile<(i,j)<

else

outfile<(i,j)<

n=n+1;

}

outfile << std::endl ; // a newline after storing all the values of a line of the img

}

outfile.close();

return 0;

}

原文链接:https://blog.csdn.net/zhngyue123/article/details/105900938

照片畸变校正 python_去畸变 opencv相关推荐

  1. 读取摄像机的内参和畸变系数并对畸变图像进行去畸变

    这个程序的目标是读取摄像机的参数(内参和畸变系数),并对畸变图像进行去畸变操作,然后进行一些特征点和矩形框的绘制. #include 语句引入所需的库. using namespace std; 和 ...

  2. 相机畸变原因与去畸变原理与代码

    相机畸变原因与去畸变原理与代码 相机主要有两种畸变:径向畸变和切向畸变 径向畸变由透镜形状引起的畸变: 切向畸变由相机组装过程中透镜与成像面不严格平行导致的. 一个畸变效果图: 我们能够看到位于图像边 ...

  3. matlab畸变校正代码_关于OpenCV中的去畸变

    在opencv中,有关图像或像素点(角点)去畸变的函数有cv::undistort(),cv::getOptimalNewCameraMatrix(),cv::initUndistortRectify ...

  4. 立体视觉 -- 相机畸变矫正(去畸变)

    相机畸变矫正 在双目立体视觉中,常常会使用张正友的相机标定方法,得到相机的参数(相机内参和畸变),进而矫正由于相机透镜制造工艺等因素造成的图像畸变.在Opencv 和 Matlab 中都有封装好的函数 ...

  5. 相机畸变模型及去畸变计算

    透镜 实际成像时,如果小孔过小,则入射光的强度会受到影响,进一步会影响到成像. 另一方面,由于光的波动性,在小孔的边缘上,光将发生衍射,因此,这些光将在像平面上"散播".当小孔变的 ...

  6. 鱼眼图像畸变校正matlab,鱼眼镜头畸变校正算法的设计

    王赛男 刘涛 左震宇 摘   要:鱼眼镜头的拍摄角度大,成像角度宽,但是在进行图像采集和成像的过程中存在大量畸变,直接使用采集而来的图像很难满足实际需求,因此需要对图像进行后续处理.本文根据摄像机参数 ...

  7. 鱼眼摄像头标定与畸变校正(OPENCV版)

    转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com/WordZzzz/fisheye_calibration 软件版本 ...

  8. 鱼眼摄像头标定与畸变校正(双OPENCV版本)

    转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com/WordZzzz/fisheye_calibration 软件版本 ...

  9. 我的Qt作品(17)OpenCV畸变标定,针对单张圆点图片实现畸变校正

    1.详情见我在论坛发的帖子:单张圆点图片实现畸变校正 http://www.ihalcon.com/read-17421.html 2.畸变校正和九点标定的实验结果,带来的精度提升: 视野范围400m ...

最新文章

  1. 【SpringCloud】Hystrix:熔断
  2. 印象大使_基本服务-使用大使网关
  3. 【渝粤题库】国家开放大学2021春1050金融理论前沿课题题目
  4. Discuz! Database Error(2003) notconnect 问题解決
  5. seo日常工作表_5 個日常要做的 SEO 維護工作
  6. SQL Server 2016的新功能–动态数据屏蔽
  7. Labview子VI的创建与调用
  8. WPFのclipToBounds与maskToBounds的区别
  9. form表单序列化后的数据转json对象
  10. java打印菱形的简单方法
  11. 开源办公套件LibreOffice
  12. 代码整洁之道-读书笔记
  13. 第十一章:项目风险管理 - (11.1 规划风险管理)
  14. 防盗报警器c语言程序,基于AT89C2051设计的无线防盗报警器 附程序
  15. 最全面的PS快捷键使用指南(图文演示)
  16. 解决IE当前脚本发生错误异常
  17. 计算机网络教程第五版|微课版 - 第一章 概述 - 习题
  18. 给你一个Pull Request的机会
  19. 3D游戏编程与设计-井字棋
  20. Mac 编译安装zlib

热门文章

  1. Intellj IDEA添加MySQL数据库以及项目连接Mysql数据库
  2. 牛逼!这家 AI 公司用面具破解了中国的人脸识别系统!微信、支付宝、火车站无一幸免...
  3. OCR识别技术在行业中的应用
  4. Linux--huan
  5. 公众号文章、底部菜单栏添加关键词自动回复跳转到往期文章或者外部网站等页面?
  6. codeforces 144D Missile Silos(最短路)
  7. 四川传媒学院计算机科学与技术,四川传媒学院实力怎么样 设有哪些专业
  8. 单分散Eu3+-PS荧光微球/吸附荧光素生物素化聚苯乙烯微球/包覆TiO2粉体的制备方式
  9. 如何按指定名称快速导出Excel中的图片?
  10. Waiting (TTFB) 简介