当前位置: 首页 > 编程日记 > 正文

OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort

目录

0.极限约束,对极校正

1.摄像机成像原理简述

2.成像畸变

2.1. 畸变数学模型

2.2. 公式推导

3.畸变校正

3.1. 理论推导

4. 图像去畸变**

5. 图像尺度缩放与内参的关系**

5.1 undistortPoints()

5.2 initUndistortRectifyMap()

5.3 undistort()

6.UndistortPoints源码


0.极限约束,对极校正


1.摄像机成像原理简述

成像的过程实质上是几个坐标系的转换。首先空间中的一点由 世界坐标系 转换到 摄像机坐标系 ,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到图像平面 ( 图像像素坐标系 )

图像像素坐标系 (uOv坐标系) 下的无畸变坐标 (U, V),经过 经向畸变切向畸变 后落在了uOv坐标系(Ud, Vd) 上。即就是说,真实图像 imgR畸变图像 imgD 之间的关系为: imgR(U, V) = imgD(Ud, Vd)

img

2.成像畸变

2.1. 畸变数学模型

摄像头成像畸变的数学模型 (符合的对应关系有问题,可能会造成一些干扰,公式主要看后面推导的过程)

img

2.2. 公式推导

公式推导:

这里写图片描述

3.畸变校正

3.1. 理论推导

我们已知的是畸变后的图像,要得到没有畸变的图像就要通过畸变模型推导其映射关系。 真实图像 imgR畸变图像 imgD 之间的关系为: imgR(U, V) = imgD(Ud, Vd) 。通过这个关系,找出所有的 imgR(U, V)(U, V) 映射到 (Ud, Vd) 中的 (Ud, Vd) 往往不是整数 (U和V是整数,因为它是我们要组成图像的像素坐标位置,以这正常图像的坐标位置去求在畸变图像中的坐标位置,取出对应的像素值,这也是正常图像的像素值)。 但是畸变的像素往往不是整数,所以需要通过插值来进行求解,详细见我之前的博客 [图像]图像缩放算法-双线性内插法 。

这里写图片描述

4. 图像去畸变**

图像去畸变的思路是:对于目标图像(无畸变)上的每个像素点,转换到normalize平面,再进行畸变并投影到源图像(带畸变), 获取原图对应位置的像素值作为目标图像该点的像素值。

这里容易有一个误解,以为去畸变是对畸变图像进行畸变逆变换得到无畸变图像,实际不是的,畸变模型太复杂了,很难求逆变换,所以是将无畸变图像进行畸变变换到原图像去获得对应像素值

图像去畸变流程如下:

注意:源相机和目标相机使用的内参矩阵不一定是一样的。如果是调用opencv的undistort()函数,cameraMatrix是源相机的内参矩阵,newCameraMatrix是目标相机的内参矩阵,如果不设置newCameraMatrix,则默认与源相机内参一样,即去畸变后,相机的内参矩阵不变。

5. 图像尺度缩放与内参的关系**

结论:图像分辨率缩放比例k, 相机焦距光心等比例缩放k, 畸变系数不变。

证明:图像缩放k倍后,图像平面所有的像素点坐标变为:

而图像畸变是发生在normalize平面,不管图像分辨率如何改变,normalize平面(只取决于焦距光心)是不变的,所以畸变系数不变。

5.1 undistortPoints()

1.1功能: 从观测点坐标计算理想点坐标。

void cv::undistortPoints(InputArraysrc,
OutputArraydst,
InputArraycameraMatrix,
InputArraydistCoeffs,
InputArrayR = noArray(),
InputArrayP = noArray()
)

5.2 initUndistortRectifyMap()

2.1功能 Computes the undistortion and rectification transformation map. 计算去畸变和校正变换映射。

void cv::initUndistortRectifyMap(InputArraycameraMatrix,
InputArraydistCoeffs,
InputArrayR,
InputArraynewCameraMatrix,
Sizesize,
intm1type,
OutputArraymap1,
OutputArraymap2
)

模型见4去畸变

5.3 undistort()

void cv::undistort(InputArraysrc,
OutputArraydst,
InputArraycameraMatrix,
InputArraydistCoeffs,
InputArraynewCameraMatrix = noArray()
)

3.1 功能 Transforms an image to compensate for lens distortion. , 对图像进行变换以补偿镜头失真。

The function transforms an image to compensate radial and tangential lens distortion.

The function is simply a combination of cv::initUndistortRectifyMap (with unity R ) and cv::remap (with bilinear interpolation). See the former function for details of the transformation being performed.

6.UndistortPoints源码

void cvUndistortPointsInternal( const CvMat* _src, CvMat* _dst, const CvMat* _cameraMatrix,const CvMat* _distCoeffs,const CvMat* matR, const CvMat* matP, cv::TermCriteria criteria)
{// 判断迭代条件是否有效CV_Assert(criteria.isValid());// 定义中间变量--A相机内参数组,和matA共享内存;RR-矫正变换数组,和_RR共享内存// k-畸变系数数组double A[3][3], RR[3][3], k[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};CvMat matA=cvMat(3, 3, CV_64F, A), _Dk;CvMat _RR=cvMat(3, 3, CV_64F, RR);cv::Matx33d invMatTilt = cv::Matx33d::eye();cv::Matx33d matTilt = cv::Matx33d::eye();// 检查输入变量是否有效CV_Assert( CV_IS_MAT(_src) && CV_IS_MAT(_dst) &&(_src->rows == 1 || _src->cols == 1) &&(_dst->rows == 1 || _dst->cols == 1) &&_src->cols + _src->rows - 1 == _dst->rows + _dst->cols - 1 &&(CV_MAT_TYPE(_src->type) == CV_32FC2 || CV_MAT_TYPE(_src->type) == CV_64FC2) &&(CV_MAT_TYPE(_dst->type) == CV_32FC2 || CV_MAT_TYPE(_dst->type) == CV_64FC2));CV_Assert( CV_IS_MAT(_cameraMatrix) &&_cameraMatrix->rows == 3 && _cameraMatrix->cols == 3 );cvConvert( _cameraMatrix, &matA );// _cameraMatrix <--> matA / A// 判断输入的畸变系数是否有效if( _distCoeffs ){CV_Assert( CV_IS_MAT(_distCoeffs) &&(_distCoeffs->rows == 1 || _distCoeffs->cols == 1) &&(_distCoeffs->rows*_distCoeffs->cols == 4 ||_distCoeffs->rows*_distCoeffs->cols == 5 ||_distCoeffs->rows*_distCoeffs->cols == 8 ||_distCoeffs->rows*_distCoeffs->cols == 12 ||_distCoeffs->rows*_distCoeffs->cols == 14));_Dk = cvMat( _distCoeffs->rows, _distCoeffs->cols,CV_MAKETYPE(CV_64F,CV_MAT_CN(_distCoeffs->type)), k);// _Dk和数组k共享内存指针cvConvert( _distCoeffs, &_Dk );if (k[12] != 0 || k[13] != 0){cv::detail::computeTiltProjectionMatrix<double>(k[12], k[13], NULL, NULL, NULL, &invMatTilt);cv::detail::computeTiltProjectionMatrix<double>(k[12], k[13], &matTilt, NULL, NULL);}}if( matR ){CV_Assert( CV_IS_MAT(matR) && matR->rows == 3 && matR->cols == 3 );cvConvert( matR, &_RR );// matR和_RR共享内存指针}elsecvSetIdentity(&_RR);if( matP ){double PP[3][3];CvMat _P3x3, _PP=cvMat(3, 3, CV_64F, PP);CV_Assert( CV_IS_MAT(matP) && matP->rows == 3 && (matP->cols == 3 || matP->cols == 4));cvConvert( cvGetCols(matP, &_P3x3, 0, 3), &_PP );// _PP和数组PP共享内存指针cvMatMul( &_PP, &_RR, &_RR );// _RR=_PP*_RR 放在一起计算比较高效}const CvPoint2D32f* srcf = (const CvPoint2D32f*)_src->data.ptr;const CvPoint2D64f* srcd = (const CvPoint2D64f*)_src->data.ptr;CvPoint2D32f* dstf = (CvPoint2D32f*)_dst->data.ptr;CvPoint2D64f* dstd = (CvPoint2D64f*)_dst->data.ptr;int stype = CV_MAT_TYPE(_src->type);int dtype = CV_MAT_TYPE(_dst->type);int sstep = _src->rows == 1 ? 1 : _src->step/CV_ELEM_SIZE(stype);int dstep = _dst->rows == 1 ? 1 : _dst->step/CV_ELEM_SIZE(dtype);double fx = A[0][0];double fy = A[1][1];double ifx = 1./fx;double ify = 1./fy;double cx = A[0][2];double cy = A[1][2];int n = _src->rows + _src->cols - 1;// 开始对所有点开始遍历for( int i = 0; i < n; i++ ){double x, y, x0 = 0, y0 = 0, u, v;if( stype == CV_32FC2 ){x = srcf[i*sstep].x;y = srcf[i*sstep].y;}else{x = srcd[i*sstep].x;y = srcd[i*sstep].y;}u = x; v = y;x = (x - cx)*ifx;//转换到归一化图像坐标系(含有畸变)y = (y - cy)*ify;//进行畸变矫正if( _distCoeffs ) {// compensate tilt distortion--该部分系数用来弥补沙氏镜头畸变??// 如果不懂也没管,因为普通镜头中没有这些畸变系数cv::Vec3d vecUntilt = invMatTilt * cv::Vec3d(x, y, 1);double invProj = vecUntilt(2) ? 1./vecUntilt(2) : 1;x0 = x = invProj * vecUntilt(0);y0 = y = invProj * vecUntilt(1);double error = std::numeric_limits<double>::max();// error设定为系统最大值// compensate distortion iteratively// 迭代去除镜头畸变// 迭代公式    x′= (x−2p1 xy−p2 (r^2 + 2x^2))∕( 1 + k1*r^2 + k2*r^4 + k3*r^6)//             y′= (y−2p2 xy−p1 (r^2 + 2y^2))∕( 1 + k1*r^2 + k2*r^4 + k3*r^6)for( int j = 0; ; j++ ){if ((criteria.type & cv::TermCriteria::COUNT) && j >= criteria.maxCount)// 迭代最大次数为5次break;if ((criteria.type & cv::TermCriteria::EPS) && error < criteria.epsilon)// 迭代误差阈值为0.01break;double r2 = x*x + y*y;double icdist = (1 + ((k[7]*r2 + k[6])*r2 + k[5])*r2)/(1 + ((k[4]*r2 + k[1])*r2 + k[0])*r2);double deltaX = 2*k[2]*x*y + k[3]*(r2 + 2*x*x)+ k[8]*r2+k[9]*r2*r2;double deltaY = k[2]*(r2 + 2*y*y) + 2*k[3]*x*y+ k[10]*r2+k[11]*r2*r2;x = (x0 - deltaX)*icdist;y = (y0 - deltaY)*icdist;// 对当前迭代的坐标加畸变,计算误差error用于判断迭代条件if(criteria.type & cv::TermCriteria::EPS){double r4, r6, a1, a2, a3, cdist, icdist2;double xd, yd, xd0, yd0;cv::Vec3d vecTilt;r2 = x*x + y*y;r4 = r2*r2;r6 = r4*r2;a1 = 2*x*y;a2 = r2 + 2*x*x;a3 = r2 + 2*y*y;cdist = 1 + k[0]*r2 + k[1]*r4 + k[4]*r6;icdist2 = 1./(1 + k[5]*r2 + k[6]*r4 + k[7]*r6);xd0 = x*cdist*icdist2 + k[2]*a1 + k[3]*a2 + k[8]*r2+k[9]*r4;yd0 = y*cdist*icdist2 + k[2]*a3 + k[3]*a1 + k[10]*r2+k[11]*r4;vecTilt = matTilt*cv::Vec3d(xd0, yd0, 1);invProj = vecTilt(2) ? 1./vecTilt(2) : 1;xd = invProj * vecTilt(0);yd = invProj * vecTilt(1);double x_proj = xd*fx + cx;double y_proj = yd*fy + cy;error = sqrt( pow(x_proj - u, 2) + pow(y_proj - v, 2) );}}}// 将坐标从归一化图像坐标系转换到成像平面坐标系double xx = RR[0][0]*x + RR[0][1]*y + RR[0][2];double yy = RR[1][0]*x + RR[1][1]*y + RR[1][2];double ww = 1./(RR[2][0]*x + RR[2][1]*y + RR[2][2]);x = xx*ww;y = yy*ww;if( dtype == CV_32FC2 ){dstf[i*dstep].x = (float)x;dstf[i*dstep].y = (float)y;}else{dstd[i*dstep].x = x;dstd[i*dstep].y = y;}}
}

简化版ubdistortpoint

//for (size_t u = 0; u < ir_image_height; u++)//{//    for (size_t v = 0; v < ir_image_width; v++)//    {//(u,v) undistort//        float x = (u - cx) * fx_inv;//        float y = (v - cy) * fy_inv;
​//        float r2 = (x*x + y*y);//        float r = std::sqrt(r2);//        float r4 = r2 * r2;//        float x_distort = x*(1 + k1*r2 + k2 * r4) + 2 * p1*x*y + p2*(r2 + 2 * x*x);//        float y_distort = y*(1 + k1*r2 + k2 * r4) + p1*(r2 + 2 * y*y) + 2 * p2*x*y;
​//        float X = ir_depth_rx.at<float>(0, 0) * x_distort + ir_depth_rx.at<float>(0, 1)*y_distort +ir_depth_rx.at<float>(0, 2) * 1;//        float Y = ir_depth_rx.at<float>(1, 0) * x_distort + ir_depth_rx.at<float>(1, 1)*y_distort +ir_depth_rx.at<float>(1, 2) * 1;//        float W = ir_depth_rx.at<float>(2, 0) * x_distort + ir_depth_rx.at<float>(2, 1)*y_distort +ir_depth_rx.at<float>(2, 2) * 1;//        //        float x_camera = X / W;//        float y_camera = Y / W;//        //        float u_distort = fx*x_camera + cx;//        float v_distort = fy*y_camera + cy;
​//        calib_params->updated_ir_depth_forward_map_x->operator()(v, u) = u_distort;//        calib_params->updated_ir_depth_forward_map_y->operator()(v, u) = v_distort;
​//    }//}

相关文章:

Ubuntu14.04 Mininet中将Openvswitch升级步骤

2019独角兽企业重金招聘Python工程师标准>>> 首先下载Mininet apt-get install mininetservice openvswitch-controller stopupdate-rc.d openvswitch-controller disablemn --test pingall 这里可能会出现以下错误sudo mn --mac --controllerremote,port6653 --top…

(转)软件测试的分类软件测试生命周期

软件测试的分类&软件测试生命周期 软件测试的分类&#xff1a; 按测试执行阶段&#xff1a;单元测试、集成测试、系统测试、验收测试、&#xff08;正式验收测试&#xff0c;Alpha 测试-内侧&#xff0c;Beta 测试-公测&#xff09; 按测试技术分类&#xff1a;黑盒测试、白…

OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时

目录 OpenCV如何扫描图像、利用查找表和计时 1.函数计算时间测试case 2. Mat图像的存储机理 3. 像素遍历的3--4种方式 4. 实例 OpenCV如何扫描图像、利用查找表和计时 如何计算函数运行时间&#xff1f; Mat图像如何存储&#xff1f; 如何高效遍历图像像素&#xff1f; …

Java String.split()用法小结

2019独角兽企业重金招聘Python工程师标准>>> 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用Strin…

217. 验证码 demo

2019独角兽企业重金招聘Python工程师标准>>> 1.效果 2.准备&#xff1a; 下载相关的jar 这里我使用的是ValidateCode 这个jar https://my.oschina.net/springMVCAndspring/blog/1815719 &#xff08;1&#xff09;相关jar下载路径 链接&#xff1a;https://pan.…

OpenCV 【十三】矩阵的掩码操作

目录 1 Mask掩膜/滤波核 1.1 原理 1.2 实例 1.3 结果对比 2. filter2D函数 2.1 原理 2.2 实例 2.3 结果 1 Mask掩膜/滤波核 1.1 原理 矩阵的掩码操作很简单。其思想是&#xff1a;根据掩码矩阵&#xff08;也称作核&#xff09;重新计算图像中每个像素的值。掩码矩阵中…

【ArrayList】为什么java.util.concurrent 包里没有并发的ArrayList实现?

2019独角兽企业重金招聘Python工程师标准>>> 为什么java.util.concurrent 包里没有并发的ArrayList实现&#xff1f; 问&#xff1a;JDK 5在java.util.concurrent里引入了ConcurrentHashMap&#xff0c;在需要支持高并发的场景&#xff0c;我们可以使用它代替HashMa…

Android实现买卖商品小游戏

之前为了学习GreenDao&#xff0c;写的练手项目&#xff0c;欢迎指点 仿手游《混》《买房记》&#xff0c;单机游戏&#xff0c;无需联网 1、主界面 2、游戏界面 可以选择地区出发随机事件&#xff0c;进行贷款/还款&#xff0c;治疗&#xff0c;还债&#xff0c;买卖商品&…

OpenCV 【十四】改变图像的对比度和亮度高度关联章节:OpenCV 【十】——Gamma校正 ——图像灰度变化

目录 0 提问 1.1 原理 trick: 1.2 代码 1.3 结果 0 提问 访问像素值 用0初始化矩阵 saturate_cast 是做什么用的&#xff0c;以及它为什么有用 1.1 原理 图像处理 一般来说&#xff0c;图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像的函数。 图像变换可分…

getRotationMatrix2D 函数

cv::Mat cv::getRotationMatrix2D( Point2f center, double angle, double scale ) {// 角度转换angle * CV_PI/180;// 计算旋转矩阵角度double alpha cos(angle)*scale;double beta sin(angle)*scale;Mat M(2, 3, CV_64F);double* m (double*)M.data;// 构建旋转矩阵m[0] …

java学习笔记-java中运算符号的优先顺序

java中各种运算符具有优先级顺序&#xff0c;一般会先计算优先级高的&#xff0c;再计算优先级低的。可以使用()使得优先级变为最高。在算术运算中&#xff0c;优先级为 --* &#xff0f; -在在逻辑运算中的优先级是 ! 取反&& || & |在位运算中的优先级 &#xff…

红帽发布第四季度和2019财年报告,多项指标维持两位数增速

近日&#xff0c;红帽公司发布了其第四季度和2019财年报告。这是在被 IBM以340亿美元的价格收购 后&#xff0c;红帽公布的第一份财报&#xff0c;数据颇为亮眼。 报告显示&#xff0c;红帽公司第四季度总收入8.79亿美元&#xff0c;同比增长14%&#xff1b;整个财年营收34亿美…

OpenCV 【十五】绘直线/椭圆/矩形/圆及其填充

目录 1. 概况 2. 原理 2.1 Point 2.2 Scalar 3. 代码 4.结果 1. 概况 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用OpenCV的函数 rectangle 绘 矩形 用OpenCV的函数 circle 绘 圆 用Op…

spring-boot Junit4单元测试

2019独角兽企业重金招聘Python工程师标准>>> 如果是使用spring-boot 1.4以下的版本 RunWith(SpringJUnit4ClassRunner.class) SpringApplicationConfiguration(classes 启动类.class) public class ApplicationTest {//代码省略 } 使用SpringApplicationConfigurat…

VideoCapture 读取视频文件,显示视频(帧)信息

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() {// 定义相关VideoCapture对象VideoCapture capture;…

Go 1.12发布:改进了运行时性能以及模块支持

Go最新版本1.12于近日发布&#xff0c;该版本并没有改动语法规范&#xff0c;它主要对运行时性能、编译工具链以及模块系统等进行了优化。另外&#xff0c;它还为TLS 1.3提供了opt-in支持&#xff0c;同时改进了对MacOS和iOS等系统的支持。 Go 1.12最大的更新亮点是改进了Go运行…

OpenCV 【十六】RNG随机数发生器putText绘制文字

1 目的 使用 随机数发生器类 (RNG) 并得到均匀分布的随机数。 通过使用函数 putText 显示文字。 第一步是实例化一个 Random Number Generator&#xff08;随机数发生器对象&#xff09; (RNG): RNG rng( 0xFFFFFFFF ); 初始化一个 0 矩阵(代表一个全黑的图像), 并且指定它…

分享一段Java搞笑的代码注释

原文&#xff1a;http://www.cnblogs.com/xdp-gacl/p/4198935.html // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // …

视频写操作,通道分离与合并

#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 视频读入与输出路径设置 string sourceVideoPath "..\\images\\test.avi"; st…

JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore

2019独角兽企业重金招聘Python工程师标准>>> CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。 CountDownLatch的构造函数接受一个int类型的参数作为计数器&#xff0c;如果你想等待N个点完成&#xff0c;这里就传入N。 当我们调用CountDownL…

OpenCV 【十七】离散傅立叶变换

目录 1 key 2 原理 3 实例 3代码 4运行结果 5应用举例 1 key 什么是傅立叶变换及其应用? 如何使用OpenCV提供的傅立叶变换? 相关函数的使用&#xff0c;如&#xff1a; copyMakeBorder(), merge(), dft(), getOptimalDFTSize(), log() 和 normalize() . 简单点说就是…

ubuntu下nginx+php5的部署

ubuntu下nginxphp5环境的部署和centos系统下的部署稍有不同&#xff0c;废话不多说&#xff0c;以下为操作记录&#xff1a;1&#xff09;nginx安装rootubuntutest01-KVM:~# sudo apt-get update && sudo apt-get upgraderootubuntutest01-KVM:~# sudo apt-get install…

图像质量评价,图片放大和缩小

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;// PSNR 峰值信噪比计算 返回数值为30-50dB 值越大越好double PSNR(con…

软件开发--深入理解程序的结构

程序由不同的段构成(代码段&#xff0c;数据段)1.程序的静态特征就是指令和数据2.程序的动态特征就是执行指令处理数据 A.段传统上&#xff0c;一个程序一般会有这几个段:.text 、.data、.bss段a.如果处理器由内存管理单元&#xff0c;那么可执行程序被加载到内存以后&#xff…

OpenCV 【十八】图像平滑处理/腐蚀与膨胀(Eroding and Dilating)/开闭运算,形态梯度,顶帽,黑帽运算

图像滤波总结&#xff08;面试经验总结&#xff09;https://blog.csdn.net/Darlingqiang/article/details/79507468 目录 part one 图像平滑处理 1原理 2代码 3效果 part two 腐蚀与膨胀(Eroding and Dilating) 1原理 2代码 3运行结果 part three更多形态学变换 1 原…

第九章 大网高级 ASA 高级设置

url 过滤实验要求&#xff1a;1、 创建class-map 类映射&#xff0c;识别传输流量。2、 创建policy-map策略映射&#xff0c;关联class-map。3、 应用到policy-map到接口上。一、 配置接口地址二、 配置路由&#xff0c;网络互通三、 创建特权和vty 密码四、 验证网络互通五、 …

linux基础知识-链接列表

linux基础知识-链接列表 1. 安装centos 7 1.1 Linux的初识1.2 centOS 7安装教程1.3 centOS 7配置ip和网络问题排查1.4 PuTTY和Xshell远程连接与密钥认证登录1.5 单用户和救援模式2. 文件与目录管理 1.6 系统目录结构、文件类型及相关命令1.7 文件目录管理及相关的命令使用方法…

OpenCV 【十九】图像金字塔/基本的阈值操作/实现自己的线性滤波器

目录 1.part one 图像金字塔 1.1原理 1.1.1图像金字塔 1.1.2高斯金字塔 1.2代码 1.3运行结果 2.part two 基本的阈值操作 2.1原理 2.1.1阈值化的类型&#xff1a; 2.1.2阈值类型1&#xff1a;二进制阈值化 2.1.3阈值类型2&#xff1a;反二进制阈值化 2.1.4阈值类型…

Get started with ros -- 1

原创博文&#xff1a;转载请标明出处&#xff08;周学伟&#xff09;&#xff1a;http://www.cnblogs.com/zxouxuewei/tag/ 一.Introduction&#xff1a; 机器人操作系统&#xff08;ROS&#xff09;是使机器人系统的不同部分能够发现&#xff0c;发送和接收数据的通信接口。MA…

利用 createTrackbar 进行二值化

#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> //createTrackbar的回调响应函数 void onChangeTrackBar (int pos,void* data) {// 强制类型转换cv::Mat srcImage *(cv::Mat*)(data); cv:…