[opencv]常用阵列操作函数总结
/*=========================================================================*/ // 阵列操作 /*=========================================================================*/ 基本矩阵和图像运算符 ———————————————————————————————————————————————————————————————————————————— 功能 | 描述 ———————————————————————————————————————————————————————————————————————————— cv::abs() ; || 返回数组中所有元素的绝对值 |——用法: cv :: MatExpr cv :: abs(cv :: InputArray src); cv :: MatExpr cv :: abs(const cv :: MatExpr&src); //矩阵表达式 ———————————————————————————————————————————————————————————————————————————— cv::absdiff(); || 返回两个数组之间差异的绝对值 |——用法: void cv :: absdiff( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst //结果数组 ) ———————————————————————————————————————————————————————————————————————————— cv::add() ; | 执行两个数组的元素添加 |——用法: void cv :: add( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 int dtype = -1 //结果数组的输出类型 ); ———————————————————————————————————————————————————————————————————————————— cv::addWeighted(); | 执行两个数组的元素加权加法(alpha混合) |——用法: void cv :: addWeighted( cv :: InputArray src1,//第一个输入数组 double alpha,//第一个输入数组的权重 cv :: InputArray src2,//第二个输入数组 double beta,//第二个输入数组的权重 double gamma,//偏移加到加权和 cv :: OutputArray dst,//结果数组 int dtype = -1 //结果数组的输出类型 ); ———————————————————————————————————————————————————————————————————————————— cv::bitwise_and() ; | 计算两个数组的元素级位和 |——用法: void cv :: bitwise_and( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 ); ———————————————————————————————————————————————————————————————————————————— cv::bitwise_not() ; | 计算两个数组的元素位级NOT |——用法: void cv :: bitwise_not( cv :: InputArray src,//输入数组 cv :: OutputArray dst,//结果数组 cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 ); [注]如果你没有使用面膜,也一样 结果可以通过矩阵运算来实现: ———————————————————————————————————————————————————————————————————————————— cv::bitwise_or() ; | 计算两个数组的元素级OR |——用法: void cv :: bitwise_and( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 ); ———————————————————————————————————————————————————————————————————————————— cv::bitwise_xor() ; | 计算两个数组的元素级比特级XOR |——用法: void cv :: bitwise_and( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 ); ———————————————————————————————————————————————————————————————————————————— cv::calcCovarMatrix() ; | 计算一组n维向量的协方差 |——用法: void cv :: calcCovarMatrix( const cv :: Mat * samples,// n-by-1或1-by-n矩阵的C-数组 int nsamples,//'samples'指向的num个矩阵 cv :: Mat&covar,// ref为协方差返回数组 cv :: Mat&mean,// ref为平均值返回数组 int flags,//特殊变体, int ctype = cv :: F64 // covar的输出矩阵类型 ); 标志参数中的标志 含义 cv::COVAR_NORMAL 计算均值和协方差 cv::COVAR_SCRAMBLED 快速PCA“扰乱”协方差 cv::COVAR_USE_AVERAGE 使用mean作为输入而不是计算它 cv::COVAR_SCALE 重新缩放输出协方差矩阵 cv::COVAR_ROWS 使用samples 输入向量的行 cv::COVAR_COLS 使用samples 输入向量列 ———————————————————————————————————————————————————————————————————————————— cv::cartToPolar() ; | 从二维矢量场计算角度和幅度 |——用法: void cv :: cartToPolar( cv :: InputArray x, cv :: InputArray y, cv :: OutputArray幅度, cv :: OutputArray角度, bool angleInDegrees = false ); ———————————————————————————————————————————————————————————————————————————— cv::checkRange() ; | 检查数组是否有无效值 |——用法: bool cv :: checkRange( cv :: InputArray src, bool quiet = true, cv :: Point * pos = 0,//如果是非空的,则是第一个异常值的位置 double minVal = -DBL_MAX,//下限检查(包括) double maxVal = DBL_MAX //上限检查(不包括) ); ———————————————————————————————————————————————————————————————————————————— cv::compare() ; | 将所选比较运算符应用于两个数组中的所有元素 |——用法: bool cv :: compare( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 int cmpop //比较运算符, ); cmp_op的值 对照 cv::CMP_EQ (src1i == src2i) cv::CMP_GT (src1i > src2i) cv::CMP_GE (src1i >= src2i) cv::CMP_LT (src1i < src2i) cv::CMP_LE (src1i <= src2i) cv::CMP_NE (src1i != src2i) 使用矩阵运算可以实现这些相同的结果: dst = src1 == src2; dst = src1> src2; dst = src1> = src2; dst = src1 <src2; dst = src1 <= src2; dst = src1!= src2; ———————————————————————————————————————————————————————————————————————————— cv::completeSymm() | |——用法: bool cv :: completeSymm( cv :: InputArray mtx, bool lowerToUpper = false ); ———————————————————————————————————————————————————————————————————————————— cv::comvertScaleAbs(); | 缩放数组,取绝对值,然后转换为8位无符号 |——用法: void cv :: convertScaleAbs( cv :: InputArray src,//输入数组 cv :: OutputArray dst,//结果数组 double alpha = 1.0,//乘法比例因子 double beta = 0.0 //附加偏移因子 ); 通过以下循环可以实现类似的结果,具有更大的通用性: for(int i = 0; i <src.rows; i ++) for(int j = 0; j <src.cols * src.channels(); j ++) dst.at <dst_type>(i,j)= satuarate_cast <dst_type>( (double)src.at <src_type>(i,j)* alpha + beta ); ———————————————————————————————————————————————————————————————————————————— cv::countNonZero() ; | 计算数组中的非零元素 |——用法: int cv :: countNonZero(//返回mtx中非零元素的数量 cv :: InputArray mtx,//输入数组 ); ———————————————————————————————————————————————————————————————————————————— cv::cvarrToMat() ; | 将2.1版之前的数组类型转换为cv::Mat |——用法: cv :: Mat cv :: cvarrToMat( const CvArr * src,//输入数组:CvMat,IplImage或CvMatND bool copyData = false,//如果为false则只生成新标题,否则复制数据 bool allowND = true,//如果为true且可能,则将CvMatND转换为Mat int coiMode = 0 //如果0:如果COI设置则出错,如果1:忽略COI ); ———————————————————————————————————————————————————————————————————————————— cv::dct() ; | 计算数组的离散余弦变换 |——用法: void cv :: dct( cv :: InputArray src,//输入数组 cv :: OutputArray dst,//结果数组 int flags,//用于逆变换或逐行 ); 性能cv::dct() 很大程度上取决于传递给它的数组的确切大小,而这种关系不是单调的。 只有一些尺寸比其他尺寸更好。建议在将数组传递给时cv::dct() ,首先确定大于数组的最佳大小,然后将数组扩展到该大小。 OpenCV提供了一个方便的例程来为您计算这些值,称为cv::getOptimalDFTSize() 。 实现时, 通过计算长度为n的向量的离散余弦变换cv::dft() 长度为n / 2的向量上 的离散傅里叶变换() 。 这意味着要获得调用的最佳大小cv::dct() ,您应该像这样计算它: size_t opt_dft_size = 2 * cv :: getOptimalDFTSize((N + 1)/ 2); ———————————————————————————————————————————————————————————————————————————— cv::determinant() ; | 计算方阵的行列式 |——用法: double cv :: determinant( cv :: InputArray mat ); cv::determinant() 计算正方形数组的行列式。 该数组必须是其中一种浮点数据类型,并且必须是单通道。如果矩阵很小,则行列式由标准公式直接计算。 对于大矩阵, 这不是有效的,因此行列式是通过高斯消元法计算的 。 ———————————————————————————————————————————————————————————————————————————— cv::cvtColor() ; | 转换颜色空间(通道数) |——用法: void cv :: cvtColor( cv :: InputArray src,//输入数组 cv :: OutputArray dst,//结果数组 int code,//颜色映射代码, int dstCn = 0 //输出中的通道(0 ='自动') ); 【通过cv :: cvtColor()提供的转换】 ————————————————————————————————————————— 转换代码 含义 ————————————————————————————————————————— CV :: COLOR_BGR2RGB CV :: COLOR_RGB2BGR CV :: COLOR_RGBA2BGRA CV :: COLOR_BGRA2RGBA ————————————————————————————————————————— 在RGB和BGR颜色空间之间转换(带或不带alpha通道) CV :: COLOR_RGB2RGBA CV :: COLOR_BGR2BGRA ————————————————————————————————————————— 将Alpha通道添加到RGB或BGR图像 CV :: COLOR_RGBA2RGB CV :: COLOR_BGRA2BGR ————————————————————————————————————————— 从RGB或BGR图像中删除Alpha通道 在添加或删除Alpha通道时将RGB转换为BGR颜色空间 CV :: COLOR_RGB2GRAY CV :: COLOR_BGR2GRAY ————————————————————————————————————————— 将RGB或BGR颜色空间转换为灰度 CV :: COLOR_GRAY2RGB CV :: COLOR_GRAY2BGR CV :: COLOR_RGBA2GRAY CV :: COLOR_BGRA2GRAY ————————————————————————————————————————— 将灰度转换为RGB或BGR颜色空间(可选择删除过程中的Alpha通道) CV :: COLOR_GRAY2RGBA CV :: COLOR_GRAY2BGRA ————————————————————————————————————————— 将灰度转换为RGB或BGR颜色空间并添加Alpha通道 CV :: COLOR_RGB2BGR565 CV :: COLOR_BGR2BGR565 CV :: COLOR_BGR5652RGB CV :: COLOR_BGR5652BGR CV :: COLOR_RGBA2BGR565 CV :: COLOR_BGRA2BGR565 CV :: COLOR_BGR5652RGBA CV :: COLOR_BGR5652BGRA ————————————————————————————————————————— 通过可选添加或删除Alpha通道(16位图像)从RGB或BGR颜色空间转换为BGR565颜色表示 CV :: COLOR_GRAY2BGR565 CV :: COLOR_BGR5652GRAY ————————————————————————————————————————— 将灰度转换为BGR565颜色表示,反之亦然(16位图像) CV :: COLOR_GRAY2BGR565 CV :: COLOR_BGR5652GRAY ————————————————————————————————————————— 将灰度转换为BGR565颜色表示,反之亦然(16位图像) CV :: COLOR_RGB2BGR555 CV :: COLOR_BGR2BGR555 CV :: COLOR_BGR5552RGB CV :: COLOR_BGR5552BGR CV :: COLOR_RGBA2BGR555 CV :: COLOR_BGRA2BGR555 CV :: COLOR_BGR5552RGBA CV :: COLOR_BGR5552BGRA ————————————————————————————————————————— 从RGB或BGR颜色空间转换为BGR555颜色表示,可选择添加或删除Alpha通道(16位图像) CV :: COLOR_GRAY2BGR555 CV :: COLOR_BGR5552GRAY ————————————————————————————————————————— 将灰度转换为BGR555颜色表示,反之亦然(16位图像) CV :: COLOR_RGB2XYZ CV :: COLOR_BGR2XYZ CV :: COLOR_XYZ2RGB CV :: COLOR_XYZ2BGR ————————————————————————————————————————— 将RGB或BGR图像转换为CIE XYZ表示,反之亦然(Rec 709,D65白点) CV :: COLOR_RGB2YCrCb CV :: COLOR_BGR2YCrCb CV :: COLOR_YCrCb2RGB CV :: COLOR_YCrCb2BGR ————————————————————————————————————————— 将RGB或BGR图像转换为亮度 - 色度(也称为YCC)颜色表示,反之亦然 CV :: COLOR_BGR2YCrCb CV :: COLOR_YCrCb2RGB CV :: COLOR_YCrCb2BGR ————————————————————————————————————————— 将RGB或BGR图像转换为亮度 - 色度(也称为YCC)颜色表示,反之亦然 CV :: COLOR_RGB2HSV CV :: COLOR_BGR2HSV CV :: COLOR_HSV2RGB CV :: COLOR_HSV2BGR ————————————————————————————————————————— 将RGB或BGR图像转换为HSV(色调饱和度值)颜色表示,反之亦然 CV :: COLOR_RGB2HLS CV :: COLOR_BGR2HLS CV :: COLOR_HLS2RGB CV :: COLOR_HLS2BGR ————————————————————————————————————————— 将RGB或BGR图像转换为HLS(色调亮度饱和度)颜色表示,反之亦然 CV :: COLOR_RGB2Lab CV :: COLOR_BGR2Lab CV :: COLOR_Lab2RGB CV :: COLOR_Lab2BGR ————————————————————————————————————————— 将RGB或BGR图像转换为CIE Lab颜色表示,反之亦然 CV :: COLOR_RGB2Luv CV :: COLOR_BGR2Luv CV :: COLOR_Luv2RGB CV :: COLOR_Luv2BGR ————————————————————————————————————————— 将RGB或BGR图像转换为CIE Luv颜色表示,反之亦然 CV :: COLOR_BayerBG2RGB CV :: COLOR_BayerGB2RGB CV :: COLOR_BayerRG2RGB CV :: COLOR_BayerGR2RGB CV :: COLOR_BayerBG2BGR CV :: COLOR_BayerGB2BGR CV :: COLOR_BayerRG2BGR CV :: COLOR_BayerGR2BGR ————————————————————————————————————————— 从拜耳模式(单通道)转换为RGB或BGR图像 CV :: COLOR_BayerGB2BGR CV :: COLOR_BayerRG2BGR CV :: COLOR_BayerGR2BGR ———————————————————————————————————————————————————————————————————————————— cv::dft() ; | 计算阵列的离散傅里叶变换 |——用法: void cv :: dft( cv :: InputArray src,//输入数组 cv :: OutputArray dst,//结果数组 int flags = 0,//用于逆变换或逐行 int nonzeroRows = 0 //只有这么多条目非零 ); 性能cv::dft() 很大程度上取决于传递给它的数组的确切大小,而这种关系不是单调的。 只有一些尺寸比其他尺寸更好。建议在将数组传递给时cv::dft(), 首先确定大于数组的最佳大小,然后将数组扩展到该大小。 OpenCV提供了一个方便的例程来为您计算这些值,称为cv::getOptimalDFTSize() 。 ———————————————————————————————————————————————————————————————————————————— cv::divide() ; | 执行一个数组的元素划分 |——用法: void cv :: divide( cv :: InputArray src1,//第一个输入数组(分子) cv :: InputArray src2,//第二个输入数组(分母) cv :: OutputArray dst,//结果数组(scale * src1 / src2) double scale = 1.0,//乘法比例因子 int dtype = -1 // dst数据类型,-1从src2获取 ); void cv :: divide( double,//所有分区的分子 cv :: InputArray src2,//输入数组(分母) cv :: OutputArray dst,//结果数组(scale / src2) int dtype = -1 // dst数据类型,-1从src2获取 ); ———————————————————————————————————————————————————————————————————————————— cv::eigen() ; | 计算方阵的特征值和特征向量 |——用法: bool cv :: eigen( cv :: InputArray src, cv :: OutputArray特征值, int lowindex = -1, int highindex = -1 ); bool cv :: eigen( cv :: InputArray src, cv :: OutputArray特征值, cv :: OutputArray特征向量, int lowindex = -1, int highindex = -1 ); 给定对称 矩阵mat ,cv::eigen() 将计算 该 矩阵的特征向量 和特征值。 ———————————————————————————————————————————————————————————————————————————— cv::exp(); | 计算数组的逐元素取幂 |——用法: void cv :: exp( cv :: InputArray src, cv :: OutputArray dst ); cv::exp()对src中的所有元素进行指数化,并将结果放入dst。。 ———————————————————————————————————————————————————————————————————————————— cv::extractImageCOI(); | 从2.1版之前的阵列类型中提取单个通道 |——用法: bool cv::extractImageCOI( const CvArr* arr, cv::OutputArray dst, int coi = -1 ); ———————————————————————————————————————————————————————————————————————————— cv::flip() ; | 翻转所选轴的阵列 |——用法: void cv :: flip( cv :: InputArray src,//输入数组 cv :: OutputArray dst,//结果数组,'src'的大小和类型 int flipCode = 0 //> 0:y-flip,0:x-flip,<0:both ); 此功能翻转图像 围绕x 轴,y 轴或两者。默认情况下,flipCode 设置为0 ,在x 轴周围翻转。 如果flipCode 设置大于零(例如,+1 ),则图像将围绕y 轴翻转, 并且如果设置为负值(例如,–1 ),则图像将围绕两个轴翻转。 在Win32系统上进行视频处理时,您会发现自己经常使用此功能在图像格式之间切换,其原点位于图像的左上角和左下角。 ———————————————————————————————————————————————————————————————————————————— cv::gemm() ; | 执行广义矩阵乘法 |——用法: void cv :: gemm( cv::InputArray src1,//第一个输入数组 cv::InputArray src2,//第二个输入数组 double alpha,//'src1'*'src2'产品的重量 cv::InputArray src3,//第三个(偏移)输入数组 double beta,//'src3'数组的权重 cv::OutputArray dst,//结果数组 int flags = 0 //用于转置源数组 ); 其中src1、src2和src3是矩阵,α和β是数值系数,op()是所附矩阵的可选换位。 转置由可选的参数标志控制,这些标志可以是0,也可以是cv::gemm_1_t、cv::gemm_2_t 和cv::gemm_3_t的任意组合(通过布尔或),每个标志表示对应矩阵的转置。 ———————————————————————————————————————————————————————————————————————————— cv::getConvertElem() | 获得单像素类型转换功能 |——用法: cv :: convertData cv :: getConvertElem(//返回转换函数(如下) int fromType,//输入像素类型(例如,cv :: U8) int toType //输出像素类型(例如,CV_32F) ); ———————————————————————————————————————————————————————————————————————————— cv::getConvertScaleElem() | 获得单像素类型转换和缩放功能 |——用法: cv :: convertScaleData cv :: getConvertScaleElem(//返回转换函数 int fromType,//输入像素类型(例如,cv :: U8) int toType //输出像素类型(例如,CV_32F) ); //转换函数具有以下形式: // typedef void(* ConvertData)( const void * from,//指向输入像素位置的指针 void * to,//指向结果像素位置的指针 int cn //频道数量 ); typedef void(* ConvertScaleData)( const void * from,//指向输入像素位置的指针 void * to,//指向结果像素位置的指针 int cn,//通道数 double alpha,//比例因子 double beta //偏移因子 ); 该 函数cv::getConvertElem()和cv::getConvertScaleElem()返回函数 指向OpenCV中用于特定类型转换的函数。 返回的函数cv::getConvertElem() 被定义(via typedef )到类型cv::ConvertData, 该类型可以传递指向两个数据区域和多个“通道”的指针。 通道的数量由cn 转换函数的参数给出,这实际上是数字fromType 要转换的连续内存对象。 这意味着您可以通过简单地设置通道数等于数组中元素总数来转换整个(连续内存中)数组。 ———————————————————————————————————————————————————————————————————————————— cv::idct() ; | 计算阵列的逆离散余弦变换 |——用法: void cv :: idct( cv :: InputArray src,//输入数组 cv :: OutputArray dst,//结果数组 int flags,//用于逐行 ); cv::idct() 是 只是一个方便的速记 反离散余弦变换。 调用cv::idct() 完全等同于cv::dct() 使用参数调用: cv :: dct(src,dst,flags | cv :: DCT_INVERSE); ———————————————————————————————————————————————————————————————————————————— cv::idft() ; | 计算阵列的离散傅里叶逆变换 |——用法: cv::idft()只是一个方便的简写 逆离散傅立叶变换。 回调cv::idft() 是完全正确的 相当于cv::dft() 使用参数调用: ———————————————————————————————————————————————————————————————————————————— cv::inRange() ; | 测试数组的元素是否在两个其他数组之内 |——用法: void cv :: inRange( cv :: InputArray src,//输入数组 cv :: InputArray upperb,//上限数组(含) cv :: InputArray lowerb,//下界数组(含) cv :: OutputArray dst //结果数组,cv :: U8C1类型 ); CV :: insertImageCOI() ———————————————————————————————————————————————————————————————————————————— cv::insertImageCOI() ; | 从新型Mat对象获取数据并将该数据写入遗留阵列的一个特定通道。 |——用法: void cv::insertImageCOI( cv::InputArray img,//输入数组,单通道 CvArr * arr,// Legacy(pre v2.1)输出数组 int coi = -1 //目标通道 ); 旨在帮助我们使用类似IplImage 和的传统(pre-v2.1)数组CvMat 。 其目的是允许我们从新型C ++ cv::Mat 对象获取数据并将该数据写入遗留阵列的一个特定通道。 输入img 应该是单通道cv::Mat 对象,而输入arr 应该是多通道遗留对象。 两者的大小必须相同。数据img 将被复制到coi 通道上arr 。 ———————————————————————————————————————————————————————————————————————————— cv::invert() ; | 反转方阵 |——用法: double cv :: invert(//如果'src'是单数,则返回0 cv :: InputArray src,//输入数组,m-by-n cv :: OutputArray dst //结果数组,n-by-m int method = cv :: DECOMP_LU //(伪)逆的方法 ); cv::invert() 将矩阵反转src 并放置 结果dst 。输入数组必须是浮点类型,结果数组的类型相同。 因为cv::invert() 包括计算伪逆的可能性,输入数组不必是方形的。 如果输入数组是n × m ,则结果数组将是m × n 。 此函数支持几种计算逆矩阵的方法,但默认为高斯消元法。返回值取决于使用的方法。 【cv :: invert()的方法参数的可能值】 方法参数的值 含义 cv::DECOMP_LU 高斯消元(LU分解) cv::DECOMP_SVD 奇异值分解(SVD) cv::DECOMP_CHOLESKY 仅适用于对称正矩阵 ———————————————————————————————————————————————————————————————————————————— cv::log() ; | 计算元素的元素自然对数 |——用法: void cv :: log( cv :: InputArray src, cv :: OutputArray dst ); cv::log() 计算自然 记录元素src1并将结果放入dst。 小于或等于零的源像素标记为设置为较大负值的目标像素。 ———————————————————————————————————————————————————————————————————————————— cv::magnitude(); | 从二维矢量场计算大小 |——用法: void cv::magnitude( cv::InputArray x, cv::InputArray y, cv::OutputArray dst ); cv::marize()基本上计算二维向量场上笛卡尔到极坐标转换的径向部分。 在cv::Magnitude()的情况下,这个向量场应该是两个单独的单通道阵列的形式。 这两个输入数组的大小应该相同。(如果您有一个双通道数组,cv::split()将为您提供单独的通道) dst中的每个元素都是根据x和y的对应元素作为这两个元素的欧几里得范数(即对应值平方和的平方根)来计算的。 ———————————————————————————————————————————————————————————————————————————— cv::LUT() ; | 将数组转换为查找表的索引 |——用法: void cv::LUT( cv::InputArray src, cv::InputArray lut, cv::OutputArray dst ); 该功能cv::LUT() 执行 一个“查找表转换” 该 输入src 。 cv::LUT() 要求源数组src 为8位索引值。该lut 数组包含查找表。 该查找表数组应该具有恰好256个元素,并且可以具有单个通道, 或者在多通道src 阵列的情况下,具有与源阵列相同数量的通道。cv::LUT()。 然后,该函数 使用相应的值 作为该表的索引,使用dst 从查找表中获取的值填充目标数组。 ———————————————————————————————————————————————————————————————————————————— cv::Mahalanobis() ; | 计算两个向量之间的Mahalanobis距离 |——用法: cv :: Size cv :: mahalanobis( cv :: InputArray vec1, cv :: InputArray vec2, cv :: OutputArray icovar ); ———————————————————————————————————————————————————————————————————————————— cv::max(); | 计算两个数组之间的元素最大值 |——用法: cv :: MatExpr cv :: max( const cv :: Mat&src1,//第一个输入数组(第一个位置) const cv :: Mat&src2 //第二个输入数组 ); MatExpr cv :: max(//矩阵表达式,不是矩阵 const cv :: Mat&src1,//第一个输入数组(第一个位置) double value //第二个位置的标量 ); MatExpr cv :: max(//矩阵表达式,不是矩阵 double value,//第一个位置的标量 const cv :: Mat&src1 //输入数组(第二个位置) ); void cv :: max( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst //结果数组 ); void cv :: max( const Mat&src1,//第一个输入数组 const Mat&src2,//第二个输入数组 Mat&dst //结果数组 ); void cv :: max( const Mat&src1,//输入数组 double value,//标量输入 Mat&dst //结果数组 ); cv::max() 计算每个相应的一对阵列中的像素的最大值src1 和src2 。 它有两种基本形式:返回矩阵表达式的那些以及计算结果并将其放在您指示的位置的那些。 在三参数形式中,在其中一个操作数是a的情况下cv::Scalar, 与多通道阵列的比较是在每个通道的基础上用相应的组件完成的cv::Scalar。 ———————————————————————————————————————————————————————————————————————————— cv::mean() ; | 计算数组元素的平均值 |——用法: cv :: Scalar cv :: mean( cv :: InputArray src, cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 ); 该函数cv::mean()计算所有的平均值输入数组src 中未被屏蔽的像素数。 如果src 是多通道,则基于每个通道计算结果。 ———————————————————————————————————————————————————————————————————————————— cv::meadStdDev() ; | 计算数组元素的平均值和标准差 |——用法: void cv :: meanStdDev( cv :: InputArray src, cv :: OutputArray的意思是, cv :: OutputArray stddev, cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 ); 该函数cv::meanStdDev() 计算平均值 输入数组src中未被屏蔽的像素值,以及它们的标准偏差。 如果src 是多通道,则基于每个通道计算平均值和标准偏差。 ———————————————————————————————————————————————————————————————————————————— cv::merge() ; | 将多个通道阵列合并为一个多通道阵列 |——用法: void cv :: merge( const cv :: Mat * mv,// C风格的数组数组 size_t count,//'mv'指向的数组数 cv :: OutputArray dst //包含'mv'中的所有通道 ); void merge( const vector <cv :: Mat>&mv,// STL样式的数组数组 cv :: OutputArray dst //包含'mv'中的所有通道 ); ———————————————————————————————————————————————————————————————————————————— cv::min() ; | 计算两个数组之间元素最小值 |——用法: cv :: MatExpr cv :: min(//矩阵表达式,不是矩阵 const cv :: Mat&src1,//第一个输入数组 const cv :: Mat&src2 //第二个输入数组 ); MatExpr cv :: min(//矩阵表达式,不是矩阵 const cv :: Mat&src1,//第一个输入数组(第一个位置) double value //第二个位置的标量 ); MatExpr cv :: min(//矩阵表达式,不是矩阵 double value,//第一个位置的标量 const cv :: Mat&src1 //输入数组(第二个位置) ); void cv::min( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst //结果数组 ); void cv :: min( const Mat&src1,//第一个输入数组 const Mat&src2,//第二个输入数组 Mat&dst //结果数组 ); void cv :: min( const Mat&src1,//输入数组 double value,//标量输入 Mat&dst //结果数组 ); ———————————————————————————————————————————————————————————————————————————— cv::minMaxIdx() ; | |——用法: void cv :: minMaxIdx( cv :: InputArray src,//输入数组,仅限单通道 double * minVal,// min值到这里(非NULL) double * maxVal,// min值到这里(非NULL) int * minIdx,// loc的min在这里(如果不是NULL) int * maxIdx,//最大值的loc在这里(如果不是NULL) cv :: InputArray mask = cv :: noArray()//仅搜索非零值 ); void cv :: minMaxIdx( const cv :: SparseMat&src,//输入稀疏数组 double * minVal,// min值到这里(非NULL) double * maxVal,// min值到这里(非NULL) int * minIdx,// C样式数组,min locs的索引 int * maxIdx,// C样式数组,max locs的索引 ); cv::minMaxIdx() 也可以用一个被称为cv::SparseMat 对所述src 阵列。 在这种情况下,阵列可以具有任意数量的维度,并且将计算最小值和最大值并返回它们的位置。 在这种情况下,极值的位置将被返回,并放置在C语言风格的阵列minLoc 和maxLoc 。 这两个数组(如果提供)应该具有与src 数组中维数相同的元素数。 在这种情况下cv::SparseMat ,最小值和最大值仅针对源代码中通常称为非零元素的内容计算; 然而,这个术语有点误导,因为真正意味着存在的元素在内存中的稀疏矩阵表示中。 事实上,由于稀疏矩阵是如何形成的,以及过去对它做了什么,可能存在并且也是零的元素。 这些元素将包括在最小值和最大值的计算中。 【waring】 提供单维数组时,位置的数组仍必须为两个整数分配内存。 这是因为cv::minMaxLoc() 使用这样的惯例,即使是一维数组本质上也是N ×1矩阵。 在这种情况下,返回的第二个值对于每个位置始终为0。 ———————————————————————————————————————————————————————————————————————————— cv::minMaxLoc() ; | 查找数组中的最大值和最小值 |——用法: void cv :: minMaxLoc( cv :: InputArray src,//输入数组 double * minVal,// min值到这里(非NULL) double * maxVal,// min值到这里(非NULL) cv :: Point * minLoc,// loc的min在这里(如果不是NULL) cv :: Point * maxLoc,//最大值的loc在这里(如果不是NULL) cv :: InputArray mask = cv :: noArray()//仅搜索非零值 ); void cv :: minMaxLoc( const cv :: SparseMat&src,//输入稀疏数组 double * minVal,// min值到这里(非NULL) double * maxVal,// min值到这里(非NULL) cv :: Point * minLoc,// C风格的数组,最小值的索引 cv :: Point * maxLoc,// C风格的数组,最大值的索引 ); 这个例程找到了 数组中的最小值和最大值,src 并(可选)返回其位置。 计算出的最小值和最大值分别放在minVal 和中maxVal 。可选地,也可以返回那些极值的位置。 这些位置将写入由minLoc和给出的地址maxLoc(假设这些参数不是NULL )。 因为这些位置是类型的cv::Point,所以这种形式的函数应该仅用于二维数组(即矩阵或图像)。 ———————————————————————————————————————————————————————————————————————————— cv::mixChannels() ; | 从输入数组到输出数组的通道 |——用法: void cv :: mixChannels( const cv :: Mat * srcv,// C风格的矩阵数组 int nsrc,//'srcv'中的元素数 cv :: Mat * dstv,// C风格的目标矩阵数组 int ndst,//'dstv'中的元素数 const int * fromTo,// C风格的数组对,......从...到... size_t n_pairs //'fromTo'中的对数 ); void cv :: mixChannels( const vector <cv :: Mat>&srcv,// STL样式的矩阵向量 vector <cv :: Mat>&dstv,//目标矩阵的STL样式向量 const int * fromTo,// C风格的数组对,......从...到... size_t n_pairs //'fromTo'中的对数 ); OpenCV中有许多操作是从输入中的一个或多个图像重新排列通道的一般问题的特殊情况, 并将它们分类到输出中的一个或多个图像中的特定通道中。 像cv::split() ,cv::merge() 和(至少某些情况)cv::cvtColor()这样的函数都使用这样的功能。 这些方法通过调用更为通用的方式来完成他们需要做的事情cv::mixChannels() 。 ———————————————————————————————————————————————————————————————————————————— cv::mulSpectrums() ; | 计算两个傅里叶光谱的元素乘法 |——用法: doublevoid cv :: mulSpectrums( cv :: InputArray arr1,//第一个输入数组 cv :: InputArray arr2,//第二个输入数组,大小与'arr1'相同 cv :: OutputArray dst,//结果数组,大小与'arr1'相同 int flags,//用于表示独立的行 bool conj = false //如果为true,则先绑定arr2 ); 在许多业务中 涉及 光谱(即,cv::dft() 或的结果cv::idft()), 人们希望进行每元素乘法,其考虑光谱的包装(实数阵列),或者它们作为复变量的性质。 输入数组可以是一维或二维,第二个与第一个相同,大小和类型相同。 如果输入阵列是二维的,则它可以被认为是真正的二维光谱,或者是一维光谱的阵列(每行一个)。 在后一种情况下,flags 应设置为cv::DFT_ROWS ; 否则可以设置为0 。 当两个数组很复杂时,它们只是在逐个元素的基础上相乘, 但cv::mulSpectrums()提供了在乘法之前共轭第二个数组元素的选项。 例如,您可以使用此选项执行相关(使用傅里叶变换),但对于卷积,您可以使用conj=false 。 ———————————————————————————————————————————————————————————————————————————— cv::multiply() ; | 执行两个数组的逐元素乘法 |——用法: void cv :: multiply( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 double scale = 1.0,//整体比例因子 int dtype = -1 //结果数组的输出类型 ); cv::multiply() 是一个简单的乘法函数; 它将元素乘以src1 相应的元素src2 并将结果放入dst 。 ———————————————————————————————————————————————————————————————————————————— cv::mulTransposed() ; | 计算一个数组的矩阵乘积 |——用法: void cv :: mulTransposed( cv :: InputArray src1,//输入矩阵 cv :: OutputArray dst,//结果数组 bool aTa,//如果为真,则转置然后相乘 cv :: InputArray delta = cv :: noArray(),//在乘法之前减去'src1' double scale = 1.0,//整体比例因子 int dtype = -1 //结果数组的输出类型 ); cv::mulTransposed() 用于计算产品 矩阵及其自身的转置-例如,在计算协方差时很有用。 矩阵src 应该是二维和单通道的,但不像cv::GEMM(),它不限于浮点类型。 除非另有说明,否则结果矩阵将与源矩阵的类型相同dtype 。 如果dtype 不是否定的(默认),则应为CV_32F 或cv::F64 ; dst 然后输出数组将是指定的类型。 ———————————————————————————————————————————————————————————————————————————— cv::norm() ; | 计算两个数组之间的归一化相关性 |——用法: double cv :: norm(//以double精度返回norm cv :: InputArray src1,//输入矩阵 int normType = cv :: NORM_L2,//要计算的范数类型 cv :: InputArray mask = cv :: noArray()//为非零值(如果存在)执行 ); double cv :: norm(//返回计算的差异范数 cv :: InputArray src1,//输入矩阵 cv :: InputArray src2,//第二个输入矩阵 int normType = cv :: NORM_L2,//要计算的范数类型 cv :: InputArray mask = cv :: noArray()//为非零值(如果存在)执行 ); double cv :: norm( const cv :: SparseMat&src,//输入稀疏矩阵 int normType = cv :: NORM_L2,//要计算的范数类型 ); 该cv::norm()函数用于计算范数 如果提供了两个数组,则数组或两个数组之间的各种距离范数。 cv::SparseMat 也可以计算a的范数,在这种情况下,在规范的计算中忽略零条目。 ———————————————————————————————————————————————————————————————————————————— cv::normalize() ; | 将数组中的元素规范化为某个值 |——用法: void cv :: normalize( cv :: InputArray src1,//输入矩阵 cv :: OutputArray dst,//结果矩阵 double alpha = 1,//第一个参数 double beta = 0,//第二个参数 int normType = cv :: NORM_L2,//要计算的范数类型 int dtype = -1 //结果数组的输出类型 cv :: InputArray mask = cv :: noArray()//为非零值(如果存在)执行 ); void cv :: normalize( const cv :: SparseMat&src,//输入稀疏矩阵 cv :: SparseMat&dst,//结果稀疏矩阵 double alpha = 1,//第一个参数 int normType = cv :: NORM_L2,//要计算的范数类型 ); 与许多OpenCV功能一样,cv::normalize() 它比最初出现时更多。 根据值normType ,图像src 被标准化或以其他方式映射到特定范围内dst 。 除非使用 参数,否则该数组dst 的大小src与数据类型相同,并且具有相同的数据类型dtype。 可选地,dtype 可以设置为OpenCV基本类型之一(例如,CV_32F ), 并且输出数组将是该类型。此操作的确切含义取决于normType 参数。 ———————————————————————————————————————————————————————————————————————————— cv::normalize() ; | 将数组中的元素规范化为某个值 |——用法: void cv :: normalize( cv :: InputArray src1,//输入矩阵 cv :: OutputArray dst,//结果矩阵 double alpha = 1,//第一个参数(见下表) double beta = 0,//第二个参数 int normType = cv :: NORM_L2,//要计算的范数类型 int dtype = -1 //结果数组的输出类型 cv :: InputArray mask = cv :: noArray()//为非零值(如果存在)执行 ); void cv :: normalize( const cv :: SparseMat&src,//输入稀疏矩阵 cv :: SparseMat&dst,//结果稀疏矩阵 double alpha = 1,//第一个参数(见表) int normType = cv :: NORM_L2,//要计算的范数类型 ); ———————————————————————————————————————————————————————————————————————————— cv::perspectiveTransform() | 执行向量列表的透视矩阵变换 |——用法: void cv :: perspectiveTransform( cv :: InputArray src,//输入数组,2或3个通道 cv :: OutputArray dst,//结果数组,大小,类型,如src1 cv :: InputArray mtx // 3-by-3或4-by-4 transoform矩阵 ); 该cv::perspectiveTransform() 功能执行 点列表(不是像素)的平面投影变换。 输入阵列应为两通道或三通道阵列mtx ,在这两种情况下矩阵应分别为3×3或4×4。 cv::perspectiveTransform() 因此src,首先将每个元素转换为关于它的长度向量src.channels() + 1 , 其中附加维度(投影维度)最初设置为1.0 。这个是也称为齐次坐标 。 然后将每个扩展矢量乘以mtx并且通过(新)投影坐标7的值重新调整结果 (然后将其丢弃,因为它总是在该操作之后)。 请再次注意,此例程用于转换点列表,而不是图像转换。 如果要对图像应用透视变换,实际上是要求不变换单个像素, 而是将它们从图像中的一个位置移动到另一个位置。 如果你想解决逆问题,找到最可能的透视变换给定多对对应点, 使用cv::getPerspectiveTransform()或cv::findHomography() 。 ———————————————————————————————————————————————————————————————————————————— cv::phase() ; | 从二维矢量场计算方向 |——用法: void cv :: phase( cv :: InputArray x,//输入x-components数组 cv :: InputArray y,//输入y分量数组 cv :: OutputArray dst,//输出角度数组(弧度) bool angleInDegrees = false //度(如果为真),弧度(如果为假) ); ———————————————————————————————————————————————————————————————————————————— cv::polarToCart() ; | 从角度和大小计算二维矢量场 |——用法: void cv :: polarToCart( cv :: InputArray magnitude,//输入幅度数组 cv :: InputArray angle,//输入角度数组 cv :: OutputArray x,// x组件的输出数组 cv :: OutputArray y,// y组件的输出数组 bool angleInDegrees = false //度(如果为true)弧度(如果为false) ); ———————————————————————————————————————————————————————————————————————————— cv::pow() ; | 将数组的每个元素提升到给定的幂 |——用法: void cv :: pow( cv :: InputArray src,//输入数组 double p,//求幂的幂 cv :: OutputArray dst //结果数组 ); 该函数cv::pow() 计算 由给定功率对阵列的元素取幂p。 在p 整数的情况下,直接计算功率。对于非p 整数,首先计算源值的绝对值, 然后将其提高到幂p (因此仅返回实数值)。 对于某些特殊值p,例如整数值或±½,使用特殊算法,从而加快计算速度 。 ———————————————————————————————————————————————————————————————————————————— cv::randu() ; | 使用均匀分布的随机数填充到给定数组 |——用法: template <typename _Tp> _Tp randu(); //返回特定类型的随机数 void cv :: randu( cv :: InputOutArray mtx,//所有值都是随机的 cv :: InputArray low,// minimum,1-by-1(Nc = 1,4)或1-by-4(Nc = 1) cv :: InputArray high // maximum,1-by-1(Nc = 1,4)或1-by-4(Nc = 1) ); ———————————————————————————————————————————————————————————————————————————— cv::randn() ; | 使用正态分布的随机数填充到给定数组 |——用法: void cv :: randn( cv :: InputOutArray mtx,//所有值都是随机的 cv :: InputArray mean,// mean mean,array在channel space中 cv :: InputArray stddev //标准偏差,通道空间 ); ———————————————————————————————————————————————————————————————————————————— cv::randShuffle() ; | 随机洗牌数组元素 |——用法: void cv :: randShuffle( cv :: InputOutArray mtx,//所有值都将被洗牌 double iterFactor = 1,//重复随机播放的次数 cv :: RNG * rng = NULL //你自己的发电机,如果你愿意的话 ); cv::randShuffle() 试图随机化 通过选择随机元素对并交换它们的位置,在一维数组中输入条目。 此类交换的数量等于数组的mtx 大小乘以可选因子iterFactor 。 任选地,一个随机数生成器可以被提供。 如果未提供,theRNG() 则将自动使用默认随机数生成器。 ———————————————————————————————————————————————————————————————————————————— cv::reduce() ; | 通过给定操作将二维数组减少为向量 |——用法: void cv :: reduce( cv :: InputArray src,//输入,n-by-m,2维 cv :: OutputArray vec,//输出,1-by-m或n-by-1 int dim,//减少方向0 =行,1 = col int reduceOp = cv :: REDUCE_SUM,//减少操作 int dtype = -1 //结果数组的输出类型 ); reduceOp参数选择简化运算符 op的价值 结果 cv::REDUCE_SUM 跨矢量计算和 cv::REDUCE_AVG 计算向量的平均值 cv::REDUCE_MAX 跨矢量计算最大值 cv::REDUCE_MIN 计算矢量的最小值 cv :: reduce()中的dim参数控制缩减的方向 昏暗的价值 结果 0 折叠成一行 1 折叠到单个列 cv::reduce() 支持任何类型的多通道数组。使用dtype ,您可以为其指定替代类型dst 。 ———————————————————————————————————————————————————————————————————————————— cv::repeat() ; | 将一个数组的内容平铺到另一个数组中 |——用法: void cv :: repeat( cv :: InputArray src,//输入二维数组 int nx,//沿x方向复制 int ny,//在y方向复制 cv :: OutputArray dst //结果数组 ); cv :: Mat cv :: repeat(//返回结果数组 cv :: InputArray src,//输入二维数组 int nx,//沿x方向复制 int ny //在y方向复制 ); ———————————————————————————————————————————————————————————————————————————— cv::saturate-cast<>(); | 转换为基元类型(模板函数) |——用法: ———————————————————————————————————————————————————————————————————————————— cv::ScaleAdd() ; | 计算两个数组的元素总和,并可选择缩放第一个数组 |——用法: void cv :: scaleAdd( cv :: InputArray src1,//第一个输入数组 double scale,//应用于第一个数组的比例因子 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 ); cv::scaleAdd() 习惯了 计算两个数组的总和, src1并在总和完成之前将src2比例因子scale应用于第一个数组。结果放在数组中dst。 [注意]使用矩阵代数运算可以获得相同的结果: dst = scale * src1 + src2; ———————————————————————————————————————————————————————————————————————————— cv::setIdentity() ; | 将数组的所有元素的对角线设置为1,否则设置为0。 |——用法: void cv :: setIdentity( cv :: InputOutputArray dst,//用于重置值的数组 const cv :: Scalar&value = cv :: Scalar(1.0)//应用于对角线元素 ); cv::setIdentity() 设置所有元素0 除了行和列相等的元素之外的数组; 这些元素设置为1(或value 提供)。cv::setIdentity()支持所有数据类型,并且不要求数组为正方形。 ———————————————————————————————————————————————————————————————————————————— cv::solve() ; | 求解线性方程组 |——用法: int cv :: solve( cv :: InputArray lhs,//系统的左侧,n-by-n cv :: InputArray rhs,//系统的右侧,n-by-1 cv :: OutputArray dst,// Results数组,将是n-by-1 int method = cv :: DECOMP_LU //求解器的方法 ); 该功能cv::solve()提供了快速解决线性系统的方法cv::invert() 。 ———————————————————————————————————————————————————————————————————————————— cv::solveCubic() ; | 找到(唯一的)三次方程的实根 |——用法: int cv :: solveCubic( cv :: InputArray coeffs, cv :: OutputArray根 ); ———————————————————————————————————————————————————————————————————————————— cv::solvePoly() ; | 找到多项式方程的复根 |——用法: int cv :: solvePoly( cv :: InputArray coeffs, cv :: OutputArray roots //复杂根(2通道) int maxIters = 300 //解算器的最大迭代次数 ); ———————————————————————————————————————————————————————————————————————————— cv::sort() ; | 对数组中的行或列中的元素进行排序 |——用法: void cv :: sort( cv :: InputArray src, cv :: OutputArray dst, int flags ); OpenCV排序函数用于二维数组。仅支持单通道源阵列。 您不应该将此视为在电子表格中对行或列进行排序;cv::sort() 排序每行或列分开 。 排序操作的结果将是一个新数组dst ,其大小和类型与源数组相同。 ———————————————————————————————————————————————————————————————————————————— cv::sortIdx() ; | 具有相同的目的cv::sort(),除了数组未修改并返回索引 |——用法: void cv :: sortIdx( cv :: InputArray src, cv :: OutputArray dst, int flag ); 类似于cv::sort() ,cv::sortIdx() 使用 仅适用于单通道二维阵列。 cv::sortIdx() 排序每行或列分开。 排序操作的结果是一个新数组,dst其大小与源数组相同,但包含已排序元素的整数索引。 ———————————————————————————————————————————————————————————————————————————— cv::split() ; | 将多通道阵列拆分为多个单通道阵列 |——用法: void cv :: split( const cv :: Mat&mtx, cv :: Mat * mv ); void cv :: split( const cv :: Mat&mtx, vector <Mat>&mv // n个1通道cv :: Mat的STL样式矢量 ); ———————————————————————————————————————————————————————————————————————————— cv::sqrt() ; | 计算数组的元素方形根 |——用法: void cv :: sqrt( cv :: InputArray src, cv :: OutputArray dst ); 作为一个特例cv::pow(),cv::sqrt() 将会 计算数组的逐元素平方根。多个通道单独处理。 ————————————————————————————————————————————————————————————————————��——————— cv::subtract() ; | 从另一个阵列执行逐个元素的减法 |——用法: void cv :: subtract( cv :: InputArray src1,//第一个输入数组 cv :: InputArray src2,//第二个输入数组 cv :: OutputArray dst,//结果数组 cv :: InputArray mask = cv :: noArray(),//可选,仅在非零值的情况下执行 int dtype = -1 //结果数组的输出类型 ); ———————————————————————————————————————————————————————————————————————————— cv::sum() ; | 求和数组的所有数组 |——用法: cv :: Scalar cv :: sum( cv :: InputArray arr ); ———————————————————————————————————————————————————————————————————————————— cv::theRNG() ; | 返回一个随机数生成器 ———————————————————————————————————————————————————————————————————————————— cv::trace() ; | 计算数组的跟踪 |——用法: cv :: Scalar cv :: trace( cv :: InputArray mat ); 该矩阵的轨迹是所有对角元素的总和。 OpenCV中的跟踪是在顶部实现的cv::diag(), 因此它不需要传入的数组是方形的。支持多通道阵列,但跟踪计算为标量, 因此标量的每个分量将是最多四个通道的每个相应通道的总和。 ———————————————————————————————————————————————————————————————————————————— cv::transform() ; | 对数组的每个元素应用矩阵变换 |——用法: void cv :: transform( cv :: InputArray src, cv :: OutputArray dst, cv :: InputArray mtx ); 该函数cv::transform() 可用于计算 任意线性图像变换。 它将多通道输入数组src 视为矢量集合,您可以将其视为“通道空间”。 然后,这些矢量再乘以“小”矩阵,mtx 以影响此通道空间中的变换。 在mtx 因为有通道矩阵必须有尽可能多的行src ,或数字加一。 在第二种情况下,信道空间矢量insrc自动扩展1,并将值1.0分配给扩展元素 ———————————————————————————————————————————————————————————————————————————— cv::transpose() ; | 在对角线上转置数组的所有元素 |——用法: void cv :: transpose( cv :: InputArray src,//输入数组,2维,n-by-m cv :: OutputArray dst,//结果数组,2维,m-by-n ); cv::transpose() 将每个元素复制src到dst通过反转行和列索引指示 的位置。 该功能支持多通道阵列; 但是,如果您使用多个通道来表示复数, 请记住这cv::transpose()不会执行复杂的共轭。 ———————————————————————————————————————————————————————————————————————————— 【说明】: 在这些功能中,遵循一些一般规则。如果存在任何异常,则在功能描述中注明。由于这些规则中的一个或多个适用于本章所述的几乎所有功能,因此为方便起见,此处列出了这些规则: [饱和]Saturation 计算输出是饱和铸造的 到了 输出数组的类型。 [输出]Output 如果输出数组cv::Mat::create() 的类型和大小与所需的类型或大小不匹配,则将创建输出数组。通常,所需的输出类型和大小与输入相同,但是对于某些功能,大小可能不同(例如cv::transpose )或类型可能不同(例如cv::split )。 [标量]Scalars 许多函数,例如cv::add() 允许添加两个数组或一个数组和一个标量。在原型使选项清晰的情况下,提供标量参数的结果与在每个元素中为第二个数组提供相同标量值的结果相同。 [掩模]Masks 每当函数存在掩码参数时,将仅为那些与输出数组中该元素对应的掩码值非零的元素计算输出。 [dtype] 许多算术和类似函数不要求输入数组的类型相同,即使它们相同,输出数组也可以是与输入不同的类型。在这些情况下,输出数组必须明确指定其深度。这是通过dtype 参数完成的。当存在时,dtype 可以设置为任何基本类型(例如,CV_32F ),结果数组将是该类型。如果输入数组具有相同的类型,则dtype 可以将其设置为其默认值-1 ,并且结果类型将与输入数组的类型相同。 [就地操作]In-place operation 除非另有说明,否则任何具有相同大小和类型的数组输入和数组输出的操作都可以对两者使用相同的数组(即,允许在输入的顶部写入输出)。 [多通道]Multichannel 对于那些不自然地使用多个通道的操作,如果给定多通道参数,则每个通道单独处理。 [例]从src2中的(0,0)开始将ROI与从src1中的(x,y)开始的ROI进行alpha混合的完整程序 // alphablend <imageA> <image B> <x> <y> <width> <height> <alpha> <beta> // #include <cv.h> #include <highgui.h> int main(int argc,char ** argv){ cv :: Mat src1 = cv :: imread(argv [1],1); cv :: Mat src2 = cv :: imread(argv [2],1); if(argc == 9 &&!src1.empty()&&!src2.empty()){ int x = atoi(argv [3]); int y = atoi(argv [4]); int w = atoi(argv [5]); int h = atoi(argv [6]); double alpha =(double)atof(argv [7]); double beta =(double)atof(argv [8]); cv :: Mat roi1(src1,cv :: Rect(x,y,w,h)); cv :: Mat roi2(src2,cv :: Rect(0,0,w,h)); cv :: addWeighted(roi1,alpha,roi2,beta,0.0,roi1); cv :: namedWindow(“Alpha Blend”,1); cv :: imshow(“Alpha Blend”,src2); cv :: waitKey(0); } return 0 ; }
Talk is cheap. Show me the code