文章目录
- 棋盘格角点检测findChessboardCorners()
- 亚像素角点检测cornerSubPix()
- 棋盘格角点的绘制drawChessboardCorners()
- 计算外参solvePnPRansac()
- 旋转向量转旋转矩阵Rodrigues()
- 鱼眼畸变矫正initUndistortRectifyMap()
- 检测轮廓findContours()
- 轮廓显示drawContours()
- 改变图片大小resize
- 图片颜色空间转换
- 图像二值化threshold()
- 计算轮廓周长
- 多边拟合函数
- 图像的矩moments()
- 关键点KeyPoints
- 多边形绘制polylines()
- 绘制填充多边形fillPoly()
棋盘格角点检测findChessboardCorners()
findChessboardCorners(image,patternSize,corners,flags = None),此函数试图确定输入图片是否有棋盘图案,并定位棋盘板上的内角点。如果所有的角点被找到且以一定的顺序排列(一行接一行,从一行的左边到右边),该函数会返回一个非零值。另外,如果该函数没有找到所有的角点或者重新排列他们,则返回0。
亚像素角点检测cornerSubPix()
cv::goodFeaturesToTrack()提取到的角点只能达到像素级别,在很多情况下并不能满足实际的需求,这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。
void cv::cornerSubPix( cv::InputArray image, // 输入图像
cv::InputOutputArray corners, // 角点(既作为输入也作为输出)
cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)
cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略
cv::TermCriteria criteria // 停止优化的标准
);
第五个参数用于表示计算亚像素时停止迭代的标准,可选的值有cv::TermCriteria::MAX_ITER 、cv::TermCriteria::EPS(可以是两者其一,或两者均选),前者表示迭代次数达到了最大次数时停止,后者表示角点位置变化的最小值已经达到最小时停止迭代。二者均使用cv::TermCriteria()构造函数进行指定。
棋盘格角点的绘制drawChessboardCorners()
void cv::drawChessboardCorners( cv::InputOutputArray image, // 棋盘格图像(8UC3)即是输入也是输出
cv::Size patternSize, // 棋盘格内部角点的行、列数
cv::InputArray corners, // findChessboardCorners()输出的角点
bool patternWasFound // findChessboardCorners()的返回值
);
计算外参solvePnPRansac()
bool cv::solvePnPRansac ( InputArray objectPoints, //参考点在世界坐标系
InputArray imagePoints, //参考点在相机平面的坐标
InputArray cameraMatrix, //相机内参
InputArray distCoeffs, //相机畸变系数
OutputArray rvec, // 旋转矩阵
OutputArray tvec, // 平移向量
bool useExtrinsicGuess = false,
int iterationsCount = 100,
float reprojectionError = 8.0,
double confidence = 0.99,
OutputArray inliers = noArray(),
int flags = SOLVEPNP_ITERATIVE
)
旋转向量转旋转矩阵Rodrigues()
Rodrigues(src[, dst[, jacobian]]) -> dst, jacobian
输入src:旋转向量((3,1)或者(1,3))或者旋转矩阵(3,3);
输出dst:旋转矩阵(3,3)或者旋转向量((3,1)或者(1,3));
输出jacobin:可选项,输出雅克比矩阵(3x9或者9x3),输入数组对输出数组的偏导数。
鱼眼畸变矫正initUndistortRectifyMap()
的作用是根据无畸变图的像素位置(i, j),推出它对应的畸变图中的像素位置(u, v),然后把畸变图中的(u, v)复制到新图中的(i, j),就得到了矫正图像。
void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs,InputArray R, InputArray newCameraMatrix, Size size, int m1type, OutputArray map1, OutputArray map2 );
参数说明:
cameraMatrix——输入的摄像头内参数矩阵(3X3矩阵)
distCoeffs——输入的摄像头畸变系数矩阵(5X1矩阵)
R——矫正单目鱼眼相机时,R默认为单位矩阵
newCameraMatrix——输入的校正后的3X3摄像机矩阵
size——摄像头采集的无失真图像尺寸
m1type——map1的数据类型,可以是CV_32FC1或CV_16SC2
map1——输出的X坐标重映射参数
map2——输出的Y坐标重映射参数
检测轮廓findContours()
findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point());
image是单通道图像矩阵,可以是灰度图,更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像。
contours的定义是vector<vector< point >> contours;向量内每个元素保存了一组由连续的点构成的点的集合向量,每一组point点集就是一个轮廓。
hierarchy,定义为“vector< Vec4i > hierarchy”,向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1。
int型的mode,定义轮廓的检索模式,int型的method,定义轮廓的近似方法,第六个参数:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值。
// 用于保存轮廓点的坐标
vector<vector<Point>> contours;
vector<Point> point;
// 存放点集间的关系
vector<Vec4i> hireachy;
// 利用二值图寻找轮廓
cv::findContours(binary, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
轮廓显示drawContours()
cv2.drawContours()
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
第一个参数是指明在哪幅图像上绘制轮廓;image为三通道才能显示轮廓
第二个参数是轮廓本身,在Python中是一个list;
第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。后面的参数很简单。其中thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。
改变图片大小resize
void cv::resize (InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR
)
src - 输入图像。
dst - 输出图像;它的大小为 dsize(当它非零时)或从 src.size()、fx 和 fy 计算的大小;dst 的类型与 src 的类型相同。
dsize - 输出图像大小;如果它等于零,则计算为:dsize = Size(round(fxsrc.cols), round(fysrc.rows))。dsize 或 fx 和 fy 必须为非零。
fx - 沿水平轴的比例因子;当它等于 0 时,它被计算为(double)dsize.width/src.cols
fy - 沿垂直轴的比例因子;当它等于 0 时,它被计算为(double)dsize.height/src.rows
插值 - 插值方法,请参阅 InterpolationFlags
resize(img, img, Size(642, 362));
图片颜色空间转换
cv::cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。具体调用形式如下:
void cv::cvtColor(
cv::InputArray src, // 输入序列
cv::OutputArray dst, // 输出序列
int code, // 颜色映射码
int dstCn = 0 // 输出的通道数 (0='automatic')
);
//具体例子:
cvtColor(image, image, COLOR_RGB2GRAY);
图像二值化threshold()
图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。OpenCV中提供了函数cv::threshold();
double cv::threshold(InputArray src, OutputArray dst, double thres, double maxval, int type)
src:源图像,可以为8位的灰度图,也可以为32位的彩色图像;
dst:输出图像;
thresh:阈值;
maxval:二值图像中灰度最大值;
type:阈值操作类型,具体的阈值操作实现如下图所示:
计算轮廓周长
double arcLength( InputArray curve, bool closed );
参数说明
InputArray类型的curve,输入的向量,二维点(轮廓顶点),可以为std::vector或Mat类型。
bool类型的closed,用于指示曲线是否封闭的标识符,一般设置为true。
多边拟合函数
approxPolyDP 主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
参数详解;
InputArray curve:一般是由图像的轮廓点组成的点集
OutputArray approxCurve:表示输出的多边形点集
double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数,5,6,7,,8,,,,
bool closed:表示输出的多边形是否封闭
图像的矩moments()
从图像中计算出来的矩通常描述了图像不同种类的几何特征如:大小、灰度、方向、形状等,图像矩广泛应用于模式识别、目标分类、目标识别与防伪估计、图像编码与重构等领域。moments()函数计算多边形或栅格化形状(一个矢量形状或光栅形状)的最高达三阶所有矩。
Moments cv::moments(
InputArray array, // 光栅图像(单通道、8位或浮点二维数组)或二维点(点或点2f)的数组(1×N或N×1)
bool binaryImage = false // binaryImage用来指示输出图像是否为一幅二值图像,如果是二值图像,则图像中所有非0像素看作为1进行计算。
)
结构Moments成员数据:
cv::Moments::Moments
(
// 空间矩(10个)
double m00,double m10,double m01,double m20,double m11,double m02,double m30,double m21,double m12,double m03
// 中心矩(7个)
double mu20, double mu11, double mu02, double mu30, double mu21 , double mu12,double mu03
// 中心归一化矩()
double nu20, double nu11, double nu02, double nu30, double nu21, double nu12,double nu03;
)
关键点KeyPoints
corners:包含大量本地信息的像素块,并能够在另一张图中被快速识别
**keypoints:**作为 corners 的扩展,它将像素块的信息进行编码从而使得更易辨识,至少在原则上唯一
descriptors:它是对 keypoints 进一步处理的结果。通常它具有更低的维度,从而使得图像块能够在另一幅不同的图像中被更快地识别。
class cv::KeyPoint {
public:
cv::Point2f pt; // coordinates of the keypoint
float size; // diameter of the meaningful keypoint neighborhood
float angle; // computed orientation of the keypoint (-1 if none)
float response; // response for which the keypoints was selected
int octave; // octave (pyramid layer) keypoint was extracted from
int class_id; // object id, can be used to cluster keypoints by object 标示关键点来自哪一个目标
cv::KeyPoint(
cv::Point2f _pt,
float _size,
float _angle = -1,
float _response = 0,
int _octave = 0,
int _class_id = -1
);
cv::KeyPoint(
float x,
float y,
float _size,
float _angle = -1,
float _response = 0,
int _octave = 0,
int _class_id = -1
);
...
};
多边形绘制polylines()
void cv::polylines(
InputOutputArray img,
InputArrayOfArrays pts,
bool isClosed,
const Scalar & color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
)
img表示绘制画布,图像
pts表示多边形的点
isClosed表示是否闭合,默认闭合
color表示颜色
thickness表示线宽,必须是正数
lineType表示线渲染类型
shift表示相对位移
绘制填充多边形fillPoly()
void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType=8, int shift=0,
Point offset=Point() );
img:在img表示的图像上绘制
pts:是指向多边形数组的指针,必须是const修饰的
npts:是多边形顶点个数的数组名
ncontours:是绘制多边形的个数
color:是填充的颜色