OpenCV学习笔记

查看opencv的版本:pkg-config --modversion opencv
opencv官方使用手册

1、 cv::findFundamentalMat()

根据配对点的像素坐标(齐次坐标)求基础矩阵F,若配对点是归一化坐标,则求得是本质矩阵E

Mat findFundamentalMat(InputArray points1, InputArray points2, int method=FM_RANSAC, double param1=3., double 
param2=0.99, OutputArray mask=noArray() )
  • 参数:
    points1, 第一幅图像点的数组
    points2, 第二幅图像点的数组
    method = FM_RANSAC, RANSAC 算法
    param1 = 3., 点到对极线的最大距离,超过这个值的点将被舍弃
    param2 = 0.99, 矩阵正确的可信度
    mask = noArray() 内点向量索引

2、cv::solvePnPRansac()

使用RANSAC算法根据2d-3d点对,计算出物体位姿,返回 T w c T^c_w Twc(使坐标点从世界坐标系旋转到相机坐标系)

void solvePnPRansac(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray 
distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int iterationsCount=100, float 
reprojectionError=8.0, int minInliersCount=100, OutputArray inliers=noArray(), int flags=ITERATIVE )
  • 参数:
    objectPoints – 3d坐标
    imagePoints – 2d像素坐标
    cameraMatrix – 相机内参
    distCoeffs – 相机畸变参数
    rvec – 输出外参旋转向量
    tvec – 输出外参平移向量
    useExtrinsicGuess – 是否使用外参初始值估计
    reprojectionError – 点到对极线的最大距离,超过这个值的点将被舍弃
    minInliersCount – 内点个数阈值,超过则ransac停止迭代
    inliers – 内点向量索引
    flags – 求解PnP的算法标志位

3、cv::Mat的深、浅复制问题

  • 浅拷贝是 b = a;和 b(a);
  • 深拷贝是 b = a.clone(); 和 a.copyTo(b);

clone 是完全的深拷贝,在内存中申请新的空间;copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则只深拷贝并覆盖掉原数据,并不申请新的空间,否则先申请空间后再进行拷贝.

4、cv::FAST()

使用fast算法检测角点

void cv::FAST	(	InputArray 	image,	std::vector< KeyPoint > & 	keypoints,	int 	threshold,	bool 	nonmaxSuppression = true )	 
  • 参数:
    image:关键点所在的灰度图像
    keypoints:输出在图像上检测到的关键点
    threshold:中心像素的强度与该像素周围圆的像素之间的差异的阈值
    nonmaxSuppression:是否对检测到的角点进行非最大值抑制

5、cv::goodFeaturesToTrack()

角点检测

void cv::goodFeaturesToTrack(cv::InputArray image,	cv::OutputArray corners, int maxCorners, double qualityLevel, 
		double minDistance, cv::InputArray mask = noArray(), 	int blockSize = 3, bool useHarrisDetector = false,double k = 0.04 );
  • 参数:
    image:输入图像(CV_8UC1 CV_32FC1)
    corners:输出角点vector
    maxCorners:用于限定检测到的点数的最大值
    qualityLevel:表示检测到的角点的质量水平(通常是0.10到0.01之间的数值,不能大于1.0)
    minDistance:于区分相邻两个角点的最小距离(小于这个距离得点将进行合并)
    mask:mask=0的点忽略
    blockSize:使用的邻域数
    useHarrisDetector:指定角点检测的方法,如果是true则使用Harris角点检测,false则使用Shi Tomasi算法
    k:Harris角点检测时使用

convertTo

src.convertTo(dst, type, scale, shift)
  • 转换到另外一种数据类型:
    dst:目的矩阵;
    type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同;
    scale:比例因子;
    shift:将输入数组元素按比例缩放后添加的值;
    dst(i)=src(i)xscale+(shift,shift,…)

常见初始化mat矩阵

Mat::eye (int rows, int cols, int type)
  • 返回一个单位矩阵,指定大小和类型

Range类

  • Range表示范围从start到end,包含start,但不包含end;
//提取第1到3列(不包括3)
Mat B = A(Range::all(),Range(1,3));

三角化测量

void triangulatePoints(InputArray projMatr1, InputArray projMatr2, InputArray projPoints1, InputArray projPoints2, OutputArray points4D)
  • 函数接受的参数是两个相机位姿和特征点在两个相机坐标系下的坐标,输出三角化后的特征点的3D坐标。但需要注意的是,输出的3D坐标是齐次坐标,共四个维度,因此需要将前三个维度除以第四个维度以得到非齐次坐标xyz。这个坐标是在世界坐标系下的坐标,以输入的两个相机位姿所在的世界坐标系为准。

你可能感兴趣的:(OpenCV学习笔记)