精华内容
下载资源
问答
  • 我有个疑问就是摄像头图像在去畸变之后还是长方形么?图像矩阵怎么表示?还是说丢掉一些边缘的点? 。

    我有个疑问就是摄像头图像在去畸变之后还是长方形么?图像矩阵怎么表示?还是说丢掉一些边缘的点?

     

    特别好奇比如鱼眼镜头,去畸变后,丢失的图像多不?

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 本程序实现一个去畸变的功能,使用的是OpenCV的库函数实现...程序的主要功能是通过已知相机内参及畸变系数实现去畸变(从摄像头或从保存序列帧文件的目录)。 其中次要功能包括从目录中读取所有该目录的文件;创建目录。
  • 通过畸变图像的畸变系数和内参生成去畸变图像代码实现,其原理可以参考https://blog.csdn.net/w77AYU/article/details/79358751 ,注意这里的畸变模型和代码的不一样,代码的畸变模型是基于广角摄像头,畸变程度没 ...

    通过畸变图像的畸变系数和内参生成去畸变图像代码实现,其原理可以参考https://blog.csdn.net/w77AYU/article/details/79358751   ,注意这里的畸变模型和代码的不一样,代码的畸变模型是基于广角摄像头,畸变程度没 链接文章中鱼眼模型的那么大

    #include <opencv2/opencv.hpp>
    #include <string>
    using namespace std;
    string image_file = "./distorted.png"; // 请确 保路 径 正 确
    
    int main(int argc, char ∗∗argv)
    {
        // 本 程 序 实 现 去 畸 变 部 分 的 代 码。 尽 管 我 们 可 以 调 用OpenCV的 去畸 变, 但             
        自己实现一遍有助于理 解。
         // 畸 变 参 数
         double k1 = −0.28340811, k2 = 0.07395907, p1 = 0.00019359, p2 = 1.76187114e−05;
         // 内 参
        double fx = 458.654, fy = 457.296, cx = 367.215, cy = 248.375;
    
        cv::Mat image = cv::imread(image_file, 0); // 图像 是 灰 度 图,CV_8UC1
        int rows = image.rows, cols = image.cols;
        cv::Mat image_undistort = cv::Mat(rows, cols, CV_8UC1); // 去 畸变以后的图
    
         // 计 算 去 畸 变 后 图 像 的 内 容
         for (int v = 0; v < rows; v++) 
         {
            for (int u = 0; u < cols; u++) 
            {
                 // 按照 公 式, 计 算 点(u,v)对 应 到 畸 变 图 像 中 的 坐 标(u_distorted, v_distorted)
                 double x = (u − cx) / fx, y = (v − cy) / fy;
                 double r = sqrt(x ∗ x + y ∗ y);
                 double x_distorted = x ∗ (1 + k1 ∗ r ∗ r + k2 ∗ r ∗ r ∗ r ∗ r) + 2 ∗ p1 ∗ x ∗         
                 y + p2 ∗ (r ∗ r +2 ∗ x ∗ x);
                 double y_distorted = y ∗ (1 + k1 ∗ r ∗ r + k2 ∗ r ∗ r ∗ r ∗ r) + p1 ∗ (r ∗ r 
                 + 2 ∗ y ∗ y) + 2 ∗  p2 ∗ x ∗ y;
                 double u_distorted = fx ∗ x_distorted + cx;
                 double v_distorted = fy ∗ y_distorted + cy;
    
             // 赋值 (最近 邻 插 值)
                 if (u_distorted >= 0 && v_distorted >= 0 && u_distorted < cols && v_distorted < rows)
                 {
                     image_undistort.at<uchar>(v, u) = image.at<uchar>((int) v_distorted,     (int)         u_distorted);
                 } 
                 else
                 {
                     image_undistort.at<uchar>(v, u) = 0;
                 }
             }
         }
    
     // 画 图 去 畸 变 后 图 像
     cv::imshow("distorted", image);
     cv::imshow("undistorted", image_undistort);
     cv::waitKey();
     return 0;
     }

     

    展开全文
  • 单目摄像头标定与测距一、 标定 首先要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论、算法类的东西里面还是讲的很不错的,必要的时候可以看看...

    单目摄像头标定与测距

    一、 标定

    首先要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论、算法类的东西里面还是讲的很不错的,必要的时候可以去看看。

    1.单目摄像头标定

    标定的目的是为了消除畸变以及得到内外参数矩阵,内参数矩阵可以理解为焦距相关,它是一个从平面到像素的转换,焦距不变它就不变,所以确定以后就可以重复使用,而外参数矩阵反映的是摄像机坐标系与世界坐标系的转换,至于畸变参数,一般也包含在内参数矩阵中。从作用上来看,内参数矩阵是为了得到镜头的信息,并消除畸变,使得到的图像更为准确,外参数矩阵是为了得到相机相对于世界坐标的联系,是为了最终的测距。

    关于畸变,大家可以看到自己摄像头的拍摄的画面,在看矩形物体的时候,边角处会有明显的畸变现象,而矫正的目的就是修复这个。

    知道双目测距的时候两个相机需要平行放置,但事实上这个是很难做到的,所以就需要立体校正得到两个相机之间的旋转平移矩阵,也就是外参数矩阵。

    2.如何做摄像头的在线标定?

    bcd465f92fc11e3dd7c2a44b8293570e.png

    30e14492e95f7ed6935448ac573e4169.png

    二.单目测距原理

    将使用相似三角形来计算相机到一个已知的物体或者目标的距离。 相似三角形就是
    这么一回事:假设有一个宽度为 W 的目标或者物体。然后将这个目标放在距离
    的相机为 D 的位置。用相机对物体进行拍照并且测量物体的像素宽度 P 。这样就得
    出了相机焦距的公式:F = (P x D) / W

    举个例子,假设我在离相机距离 D = 24 英寸的地方放一张标准的 8.5 x 11 英寸 A4 纸
    (横着放;W = 11)并且拍下一张照片。我测量出照片中 A4 纸的像素宽度为 P = 249 像素。 因此我的焦距 F 是: F = (248px x 24in) / 11in = 543.45

    当我继续将我的相机移动靠近或者离远物体或者目标时,我可以用相似三角形来计算出物体离相机的距离:D’ = (W x F) / P 从以上的解释中,可以看到,要想得到距离,就要知道摄像头的焦距和目标物体的大小,这两个已知条件根据公式:D’ = (W x F) / P

    得出目标到摄像机的距离D,其中P是指像素距离,W是A4纸的宽度,F是摄像机焦距。

    展开全文
  • 1,摄像头 使用的是自己用FPGA做的双目,1280*720p@60hz,9轴IMU,以太网接口,硬件帧同步,优于1us,全局快门AR0134,输出彩色,灰度图像,可配640*480@80hz,1280*960@50hz,自动曝光触发,外部曝光触发。 2,...

    1,摄像头

    使用的是自己用FPGA做的双目,1280*720p@60hz,9轴IMU,以太网接口,硬件帧同步,优于1us,全局快门AR0134,输出彩色,灰度图像,可配640*480@80hz,1280*960@50hz,自动曝光触发,外部曝光触发

    2,matlab工具箱标定双目

    matlab工具箱的标定方法要比opencv精确,可以人工挑选匹配图片。

    拍摄100张左右标定板图片,两个摄像头对应的图片名要相同,分别放到两个文件夹。

    注意事项: 
    1. 采集棋盘图的时候要注意,尽量让棋盘占据尽可能多的画面,这样可以得到更多有关摄像头畸变方面的信息。 
    2. 要让棋盘左右旋转,计算两个相机之间的变换矩阵。 
    3. 两个摄像头的焦距应该保持一致,因为在后续的视差图转换为三维图时的Q矩阵只有一个f值。所以必须要求至少焦距相近。而且立体成像的三角测量(Learning OpenCV书中提到)的前提假设就是fl=fr。(调整两个摄像头的焦距相同的方法:离两个相机相同远处放置标定板,分别调节两个相机的焦距,使得两个画面的清晰度相似。)

     

    file:///home/teemos/%E4%B8%8B%E8%BD%BD/webwxgetmsgimg.jpeg

    其中,可能会出现很多误匹配的图片,把左面两两对应的图片检查一下,XY方向是否相同,角点是否检测完,(0,0)点是否一样。有误差的,右键移除。

     

    8,标定参数的使用

    一共有6个参数供opencv调用,摄像头1内参K,摄像头1畸变,摄像头2内参K,摄像头2畸变,摄像头2相对于摄像头1的旋转矩阵R,平移向量T,

    R,T如下:其中R需要转置一下才能给opencv用

    摄像头内参K,畸变如下,摄像头的内参也需要转置。 RadialDistortion为径向畸变K1,K2,K3,TangentialDistortion为切向畸变P1,P2,opencv调用时,写成K1,K2,P1,P2,K3的形式

    3,双目校正

    双目校正的作用就是要把消除畸变后的两幅图像严格地行对应,使得两幅图像的对极线恰好在同一水平线上,这样一幅图像上任意一点与其在另一幅图像上的对应点就必然具有相同的行号,只需在该行进行一维搜索即可匹配到对应点。

     

    1,使用matlab标定的参数

    2,调用stereoRectify

    stereoRectify(cameraMatrixL, distCoeffL,
    	cameraMatrixR, distCoeffR,
    	imageSize, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, imageSize, &validRoiL, &validRoiR);

    其中cameraMatrixL, distCoeffL,  cameraMatrixR, distCoeffR, R, T皆是输入的相机参数,通过stereoRectify得出校正旋转矩阵R、投影矩阵P、重投影矩阵Q,其中参数-1会输出完整的去畸变图像,输入0会自动裁剪图像。

    调用initUndistortRectifyMap得出校准映射参数

    initUndistortRectifyMap(cameraMatrixL, distCoeffL, R1, P1, imageSize, CV_32FC1, rmap[0][0], rmap[0][1]);

    调用remap校准输入的左右图像

    remap(Image1, rectifyImageL, rmap[0][0], rmap[0][1], INTER_LINEAR);

    双目矫正程序:

    #include <iostream>
    #include "opencv2/calib3d.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include <opencv2/opencv.hpp>
    #include"opencv2/imgproc.hpp"
    #include"opencv2/highgui.hpp"
    //#include"opencv2/core.hpp"
    using namespace cv;
    using namespace std;
    
    int main()
    {
    	const int imageWidth = 1280;                             //摄像头的分辨率
    	const int imageHeight = 720;
    	Size imageSize = Size(imageWidth, imageHeight);
    	Mat R1, R2, P1, P2, Q;
    	Mat rectifyImageL, rectifyImageR;
    	Rect validRoiL;
    	Rect validRoiR;
    	Mat cameraMatrixL = (Mat_<double>(3, 3) << 815.1796, -28.6083, 660.3101,
    		0, 821.6495, 413.9831,
    		0, 0, 1);
    	Mat distCoeffL = (Mat_<double>(5, 1) << -0.3827, 0.1749, -0.0105, -0.0122, -0.0854);
    
    	Mat cameraMatrixR = (Mat_<double>(3, 3) << 812.8009, -28.3190, 653.3446,
    		0, 820.1620, 386.9071,
    		0, 0, 1);
    	Mat distCoeffR = (Mat_<double>(5, 1) << -0.3823, 0.1593, -0.0618, -0.0113, -0.0158);
    
    	Mat T = (Mat_<double>(3, 1) << -125.1593, 1.0114, 1.7302);//T平移向量
    	Mat R = (Mat_<double>(3, 3) << 0.9993, -0.0014, 0.0373,
    		0.0012, 1.0000, 0.0056,
    		-0.0373, -0.0056, 0.9993);//rec旋转向量
    
    	stereoRectify(cameraMatrixL, distCoeffL,
    	cameraMatrixR, distCoeffR,
    	imageSize, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY,0 , imageSize, &validRoiL, &validRoiR);
    	Mat rmap[2][2];
    	initUndistortRectifyMap(cameraMatrixL, distCoeffL, R1, P1, imageSize, CV_32FC1, rmap[0][0], rmap[0][1]);
    	initUndistortRectifyMap(cameraMatrixR, distCoeffR, R2, P2, imageSize, CV_32FC1, rmap[1][0], rmap[1][1]);
    	Mat Image1 = imread("2.jpg", CV_LOAD_IMAGE_COLOR);
    	Mat Image2 = imread("3.jpg", CV_LOAD_IMAGE_COLOR);
    	//cvtColor(rgbImageL, grayImageL, CV_BGR2GRAY);
    	remap(Image1, rectifyImageL, rmap[0][0], rmap[0][1], INTER_LINEAR);
    	remap(Image2, rectifyImageR, rmap[1][0], rmap[1][1], INTER_LINEAR);
    	imshow("IMAGE1", rectifyImageL);
    	imshow("IMAGE2", rectifyImageR);
    	waitKey(0);
    
    }
    

    3.立体匹配

    由极线约束在两幅图片去找对应点,由对应点计算视差d,由视差d带入如下公式计算对应点的深度距离。由视差图-》深度图

    BM算法 :

    采用Block Matching算法进行立体匹配,Block Matching用的是SAD方法,速度比较快,但效果一般。 
    参数设置: 
    MinDisparity设置为0,因为两个摄像头是前向平行放置,相同的物体在左图中一定比在右图中偏右。如果为了追求更大的双目重合区域而将两个摄像头向内偏转的话,这个参数是需要考虑的。 
    UniquenessRatio主要可以防止误匹配,此参数对于最后的匹配结果是有很大的影响。立体匹配中,宁愿区域无法匹配,也不要误匹配。如果有误匹配的话,碰到障碍检测这种应用,就会很麻烦。该参数不能为负值,一般5-15左右的值比较合适,int型。 
    BlockSize:SAD窗口大小,容许范围是[5,255],一般应该在 5x5..21x21 之间,参数必须为奇数值, int型。 
    NumDisparities:视差窗口,即最大视差值与最小视差值之差,窗口大小必须是 16的整数倍,int型。 
    在BM算法的参数中,对视差生成效果影响较大的主要参数是BlockSize、NumDisparities和UniquenessRatio三个,一般只需对这三个参数进行调整,其余参数按默认设置即可。 

    BM算法计算出的视差disp是CV_16S格式,通过disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.))变换才能得到真实的视差值。 
    然后通过reprojectImageTo3D这个函数将视差矩阵转换成实际的物理坐标矩阵。在实际求距离时,reprojectImageTo3D出来的X / W, Y / W, Z / W都要乘以16(也就是W除以16),才能得到正确的三维坐标信息。 

    SGBM算法:

    SGBM参数设置:(在下面的程序中已经标明) MinDisparity设置为0,因为两个摄像头是前向平行放置,相同的物体在左图中一定比在右图中偏右。如果为了追求更大的双目重合区域而将两个摄像头向内偏转的话,这个参数是需要考虑的。 UniquenessRatio主要可以防止误匹配,此参数对于最后的匹配结果是有很大的影响。立体匹配中,宁愿区域无法匹配,也不要误匹配。如果有误匹配的话,碰到障碍检测这种应用,就会很麻烦。该参数不能为负值,一般5-15左右的值比较合适,int型。 BlockSize:SAD窗口大小,容许范围是[5,255],一般应该在 5x5..21x21 之间,参数必须为奇数值, int型。 NumDisparities:视差窗口,即最大视差值与最小视差值之差,窗口大小必须是 16的整数倍,int型。 在SGBM算法的参数中,对视差生成效果影响较大的主要参数是BlockSize、NumDisparities和UniquenessRatio三个,一般只需对这三个参数进行调整,其余参数按默认设置即可。 --------------------- 本文来自 小红ML 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weixin_39449570/article/details/79033314?utm_source=copy

    参考博客:

     

    https://blog.csdn.net/wangchao7281/article/details/52506691?locationNum=7

    https://blog.csdn.net/yanli33/article/details/60478023

    展开全文
  • 其中假设右边为一个激光发射器,左边为摄像头接受右方反射的光。 其中已知L=L1+L2L=L_1+L_2L=L1​+L2​,因此:L1=dtanα,L2=dtanβL_1 = {d \over tan \alpha }, L_2 = {d \over tan \beta }L1​=tanαd​,L2​=tan...
  • 文章目录ROS下单目摄像头的Calibration安装usb_cam包启动摄像头显示摄像头图像Calibration校正文件图像的去畸变双目摄像头的Calibration独立图像的双目摄像头合成图像的双目摄像头创建ROS package修改camera_split包...
  • 单目摄像头标定与测距一、 标定 首先要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论、算法类的东西里面还是讲的很不错的,必要的时候可以看看...
  • 首先要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论、算法类的东西里面还是讲的很不错的,必要的时候可以看看。 1.单目摄像头标定 标定的...
  • 传感器数据处理2:激光雷达运动畸变的去除 ...三角测距(A2,EAI,一般10m左右的都是),双目摄像头也是用的三角测距法,左右各一个摄像头 ​ 优点:中近距离精度较高、价格便宜 ​ 缺点:远距离精度较差、易受干扰...
  • 用普通摄像头的标定方式(cv2.calibrateCamera()或cv2.calibrateCameraExtended())获取摄像头内参(包括畸变参数)已不适用于广角或鱼眼摄像头了。 此文主要针对于大广角摄像头且边缘处畸变较大的摄像头进行标定与...
  • 摄像头标定的理解隐藏在注释里 init(对象点,图像点)--->对每一张图进行操作--->寻找角点--->寻找亚像素精度角点--->画出角点--->通过图像点和对象点找出摄像机的内部参数和畸变矩阵--->畸变矫正...
  • http://www.cnblogs.com/firege/p/5806121.html (驱动大神)http://blog.csdn.net/yanbixing123/article/details/52299519ov5640作为外接摄像头设备,通过i2c与...镜头校正 : 校正镜头导致的光强畸变 ;坏点校正 ...
  • 内容: 旨在对车载摄像头采集的车辆行驶视频中的车道线进行识别,实现过程为:首先对图像进行去畸变、透视变换等,随后进行梯度和颜色融合,利用曲线多项式拟合提取车道线信息,最后跟踪了一段 50 S左右的行车视频...
  • 单目摄像头的大致测距原理,是先通过图像匹配进行目标识别(各种车型、行人、物体等),再通过目标在图像中的大小估算目标距离。环视测距特点:鱼眼镜头畸变矫正较大,环视相机一般用于低速场景,主要用于检测地面...
  • 图像雨去雾算法

    2020-03-11 18:07:45
    (3)摄像头标定参数(中心位置(x,y)和5个畸变 系数(2径向,2切向,1棱向),浮点型float) (4)摄像头初始化参数(摄像头初始位置和三个坐标方向 的旋转角度,车辆宽度高度车速等等,浮点型float) Output: ...
  • 图像雨去雾算法输入输出接口Input:(1)摄像头采集的实时图像视频分辨率(整型int)(2)摄像头采集的实时图像视频格式 (RGB,YUV,MP4等)(3)摄像头标定参数(中心位置(x,y)和5个畸变系数(2径向,2切向,1...
  • 刚入手视觉这一块,老师给我的任务是实现单目相机的定位 1 关于摄像头标定,是只能在MATLAB和OPENCV...3 获得标定参数后,下一步该做什么呢,是用系数校正畸变的图像吗?那再下一步应该学习什么,希望大神给指明一下
  • 双目测距步骤三:彩色深度图获取

    千次阅读 2018-09-09 16:42:31
    在原来的视差图基础上改进的,去掉黑白色的和伪彩色的,不为...可以看到匹配效果有点粗糙,是因为没加上标定后摄像头畸变参数,加上效果会好很多。 #include &lt;highgui.h&gt; #include &lt;cv.h...
  • 相机标定的目的是:获取两个摄像头的相关内外参数, 内参数——焦距、镜头畸变参数等 外参数——对齐两个相机的旋转矩阵 R 和平移向量 T 标定是获取并处理10对以上的棋盘图案。 相机矫正 利用标定得到的参数,去除...
  • 单目相机测距

    2020-03-22 08:31:23
    单目相机测距 单目测距的小项目,大概需要就是用单目相机,对一个特定的目标...需要一个摄像头,我用的是一个畸变很大的鱼眼免驱动摄像头,大家用电脑上的那个自带摄像头也可以的,就是不方便。 · 需要MATLAB进行相...
  • 【RoboMaster】我是这样搞定第一次单目相机测距的

    千次阅读 热门讨论 2020-02-03 22:09:35
    之前在做一个单目测距的小项目,大概需要就是用单目相机...需要一个摄像头,我用的是一个畸变很大的鱼眼免驱动摄像头,大家用电脑上的那个自带摄像头也可以的,就是不方便。 需要MATLAB进行相机标定 需要一个编程环...
  • 首先是基本需求了· opencv自然要会的,这咱就不多说了,会一点就行· 需要一个摄像头,我用的是一个畸变很大的鱼眼免驱动摄像头,大家用电脑上的那个自带摄像头也可以的,就是不方便。· 需要MATLAB进行相机标定...
  • Over Scan

    2020-11-30 17:54:55
    为了避免在屏幕边沿出现图像的畸变部分,在电视中采用了过扫描技术,把图像扩大5%甚至10%,将畸变的图像延伸到屏幕范围之外,只显示中部线性好的部分,这就造成图像四周被裁一部分的现象,就是过扫描。 ...
  • 单目摄像头的大致测距原理,是先通过图像匹配进行目标识别(各种车型、行人、物体等),再通过目标在图像中的大小估算目标距离。 环视测距 特点:鱼眼镜头畸变矫正较大,环视相机一般用于低速场景,主要用于检测...
  •  首先我们要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论、算法类的东西里面还是讲的很不错的,必要的时候可以看看。  Q1:为什么要做...
  • 关于图像透射变换的一点总结

    千次阅读 2011-03-07 16:30:00
    前段时间为将机器人单目视觉图像从透视图转化为鸟瞰图做了一点研究,这两天为了一个利用图像偏振的野外积水检测,需要...无非就是利用事先标定好的摄像头内参数和畸变矩阵将图像去畸变,计算透射变换矩阵,然后将
  • 因此这里不过多的介绍数学原理,只是简要的叙述一下双目视觉的流程。 双目视觉主要包括相机标定、图片畸变矫正、摄像机校正、图片匹配、3D恢复五个部分。   下面我们从相机标定开始说起。相机标定的目的有两个...
  • 光电技术论文集103篇

    2010-09-17 18:50:43
    20. 一种数字化测量电视跟踪系统摄像头信噪比的方法 —————————————83 21. 小型化实时联合变换相关器的研制—————————————————————88 22. 二维 DCT 微光图像压缩编码研究 ——...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

去畸变摄像头