一个网站里面只放一个图片怎么做的,wordpress插件买免费,wordpress优秀案例,专业性行业网站有哪些OpenCV的基本矩阵操作与示例OpenCV中的矩阵操作非常重要#xff0c;本文总结了矩阵的创建、初始化以及基本矩阵操作#xff0c;给出了示例代码#xff0c;主要内容包括#xff1a;创建与初始化矩阵加减法矩阵乘法矩阵转置矩阵求逆矩阵非零元素个数矩阵均值与标准差矩阵全局…OpenCV的基本矩阵操作与示例OpenCV中的矩阵操作非常重要本文总结了矩阵的创建、初始化以及基本矩阵操作给出了示例代码主要内容包括创建与初始化矩阵加减法矩阵乘法矩阵转置矩阵求逆矩阵非零元素个数矩阵均值与标准差矩阵全局极值及位置其他矩阵运算函数列表1. 创建与初始化矩阵1.1 数据类型建立矩阵必须要指定矩阵存储的数据类型图像处理中常用的几种数据类型如下[cpp] view plain copyCV_8UC1// 8位无符号单通道 CV_8UC3// 8位无符号3通道 CV_8UC4 CV_32FC1// 32位浮点型单通道 CV_32FC3// 32位浮点型3通道 CV_32FC4 包括数据位深度8位、32位数据类型U:uchar、F:float型以及通道数C1单通道、C3三通道、C4四通道。1.2 基本方法我们可以通过载入图像来创建Mat类型矩阵当然也可以直接手动创建矩阵基本方法是指定矩阵尺寸和数据类型[cpp] view plain copy// 基本方法 cv::Mat a(cv::Size(5,5),CV_8UC1); // 单通道 cv::Mat b cv::Mat(cv::Size(5,5),CV_8UC3); //3通道每个矩阵元素包含3个uchar值 couta endlaendlendl; coutb endlbendlendl; system(pause); 运行结果3通道矩阵中一个矩阵元素包含3个变量。1.3 初始化方法上述方法不初始化矩阵数据因此将出现随机值。如果想避免这种情况可使用Mat类的几种初始化创建矩阵的方法[cpp] view plain copy// 初始化方法 cv::Mat mz cv::Mat::zeros(cv::Size(5,5),CV_8UC1); // 全零矩阵 cv::Mat mo cv::Mat::ones(cv::Size(5,5),CV_8UC1); // 全1矩阵 cv::Mat me cv::Mat::eye(cv::Size(5,5),CV_32FC1); // 对角线为1的对角矩阵 coutmz endlmzendlendl; coutmo endlmoendlendl; coutme endlmeendlendl; 运行结果2. 矩阵运算2.1 基本概念 OpenCV的Mat类允许所有的矩阵运算。2.2 矩阵加减法我们可以使用和-符号进行矩阵加减运算。[cpp] view plain copycv::Mat a Mat::eye(Size(3,2), CV_32F); cv::Mat b Mat::ones(Size(3,2), CV_32F); cv::Mat c ab; cv::Mat d a-b; 2.3 矩阵乘法使用*号计算矩阵与标量相乘矩阵与矩阵相乘必须满足矩阵相乘的行列数对应规则[cpp] view plain copyMat m1 Mat::eye(2,3, CV_32F); //使用cv命名空间可省略cv::前缀下同 Mat m2 Mat::ones(3,2, CV_32F); coutm1 endlm1endlendl; coutm2 endlm2endlendl; // Scalar by matrix cout \nm1.*2 \n m1*2 endl; // matrix per element multiplication cout \n(m12).*(m13) \n (m11).mul(m13) endl; // Matrix multiplication cout \nm1*m2 \n m1*m2 endl; 2.4 矩阵转置矩阵转置是将矩阵的行与列顺序对调第i行转变为第i列形成一个新的矩阵。OpenCV通过Mat类的t()函数实现。[cpp] view plain copy// 转置 Mat m1 Mat::eye(2,3, CV_32F); Mat m1t m1.t(); coutm1 endlm1endlendl; coutm1t endlm1tendlendl; system(pause); 运行结果2.5 求逆矩阵逆矩阵在某些算法中经常出现在OpenCV中通过Mat类的inv()方法实现[cpp] view plain copy// 求逆 Mat meinv me.inv(); coutme endlmeendlendl; coutmeinv endlmeinvendlendl; system(pause); 运行结果单位矩阵的逆就是其本身。2.6 计算矩阵非零元素个数计算物体的像素或面积常需要用到计算矩阵中的非零元素个数OpenCV中使用countNonZero()函数实现。[cpp] view plain copy// 非零元素个数 int nonZerosNum countNonZero(me); // me为输入矩阵或图像 coutme endlmeendl; coutme中非零元素个数 nonZerosNumendlendl; system(pause); 运行结果2.7 均值和标准差OpenCV提供了矩阵均值和标准差计算功能可以使用meanStdDev(src,mean,stddev)函数实现。参数src – 输入矩阵或图像mean – 均值OutputArraystddev – 标准差OutputArray[cpp] view plain copy// 均值方差 Mat mean; Mat stddev; meanStdDev(me, mean, stddev); //me为前文定义的5×5对角阵 coutmean meanendl; coutstddev stddevendl; system(pause); 运行结果需要说明的是如果src是多通道图像或多维矩阵则函数分别计算不同通道的均值与标准差因此返回值mean和stddev为对应维度的向量。[cpp] view plain copyMat mean3; Mat stddev3; Mat m3(cv::Size(5,5),CV_8UC3,Scalar(255,200,100)); coutm3 endlm3endlendl; meanStdDev(m3, mean3, stddev3); coutmean3 mean3endl; coutstddev3 stddev3endl; system(pause); 多通道矩阵运算结果2.8 求最大最小值求输入矩阵的全局最大最小值及其位置可使用函数[cpp] view plain copyvoid minMaxLoc(InputArray src, CV_OUT double* minVal, CV_OUT double* maxVal0, CV_OUT Point* minLoc0, CV_OUT Point* maxLoc0, InputArray masknoArray()); 参数src – 输入单通道矩阵图像.minVal – 指向最小值的指针 如果未指定则使用NULLmaxVal – 指向最大值的指针 如果未指定则使用NULLminLoc – 指向最小值位置2维情况的指针 如果未指定则使用NULLmaxLoc – 指向最大值位置2维情况的指针 如果未指定则使用NULLmask – 可选的蒙版用于选择待处理子区域[cpp] view plain copy// 求极值 最大、最小值及其位置 Mat img imread(Lena.jpg,0); imshow(original image,img); double minVal0,maxVal0; cv::Point minPt, maxPt; minMaxLoc(img,minVal,maxVal,minPt,maxPt); coutmin value minValendl; coutmax value maxValendl; coutminPt (minPt.x,minPt.y)endl; coutmaxPt (maxPt.x,maxPt.y)endl; coutendl; cv::Rect rectMin(minPt.x-10,minPt.y-10,20,20); cv::Rect rectMax(maxPt.x-10,maxPt.y-10,20,20); cv::rectangle(img,rectMin,cv::Scalar(200),2); cv::rectangle(img,rectMax,cv::Scalar(255),2); imshow(image with min max location,img); cv::waitKey(); 运行结果输入图像及其最大最小值位置3. 其他矩阵运算其他矩阵运算函数见下表Function (函数名)Use (函数用处)add矩阵加法AB的更高级形式支持maskscaleAdd矩阵加法一个带有缩放因子dst(I) scale * src1(I) src2(I)addWeighted矩阵加法两个带有缩放因子dst(I) saturate(src1(I) * alpha src2(I) * beta gamma)subtract矩阵减法A-B的更高级形式支持maskmultiply矩阵逐元素乘法同Mat::mul()函数与A*B区别支持maskgemm一个广义的矩阵乘法操作divide矩阵逐元素除法与A/B区别支持maskabs对每个元素求绝对值absdiff两个矩阵的差的绝对值exp求每个矩阵元素 src(I) 的自然数 e 的 src(I) 次幂 dst[I] esrc(I)pow求每个矩阵元素 src(I) 的 p 次幂 dst[I] src(I)plog求每个矩阵元素的自然数底 dst[I] log|src(I)| (if src ! 0)sqrt求每个矩阵元素的平方根min, max求每个元素的最小值或最大值返回这个矩阵 dst(I) min(src1(I), src2(I)), max同minMaxLoc定位矩阵中最小值、最大值的位置compare返回逐个元素比较结果的矩阵bitwise_and, bitwise_not, bitwise_or, bitwise_xor每个元素进行位运算分别是和、非、或、异或cvarrToMat旧版数据CvMat,IplImage,CvMatND转换到新版数据MatextractImageCOI从旧版数据中提取指定的通道矩阵给新版数据Matrandu以Uniform分布产生随机数填充矩阵同 RNG::fill(mat, RNG::UNIFORM)randn以Normal分布产生随机数填充矩阵同 RNG::fill(mat, RNG::NORMAL)randShuffle随机打乱一个一维向量的元素顺序theRNG()返回一个默认构造的RNG类的对象 theRNG()::fill(...)reduce矩阵缩成向量repeat矩阵拷贝的时候指定按x/y方向重复split多通道矩阵分解成多个单通道矩阵merge多个单通道矩阵合成一个多通道矩阵mixChannels矩阵间通道拷贝如Rgba[]到Rgb[]和Alpha[]sort, sortIdx为矩阵的每行或每列元素排序setIdentity设置单元矩阵completeSymm矩阵上下三角拷贝inRange检查元素的取值范围是否在另两个矩阵的元素取值之间返回验证矩阵checkRange检查矩阵的每个元素的取值是否在最小值与最大值之间返回验证结果boolsum求矩阵的元素和mean求均值meanStdDev均值和标准差countNonZero统计非零值个数cartToPolar, polarToCart笛卡尔坐标与极坐标之间的转换flip矩阵翻转transpose矩阵转置比较 Mat::t() ATtrace矩阵的迹determinant行列式 |A|, det(A)eigen矩阵的特征值和特征向量invert矩阵的逆或者伪逆比较 Mat::inv()magnitude向量长度计算 dst(I) sqrt(x(I)2 y(I)2)MahalanobisMahalanobis距离计算phase相位计算即两个向量之间的夹角norm求范数1-范数、2-范数、无穷范数normalize标准化mulTransposed矩阵和它自己的转置相乘 AT * A, dst scale(src - delta)T(src - delta)convertScaleAbs先缩放元素再取绝对值最后转换格式为8bit型calcCovarMatrix计算协方差阵solve求解1个或多个线性系统或者求解最小平方问题(least-squares problem)solveCubic求解三次方程的根solvePoly求解多项式的实根和重根dct, idct正、逆离散余弦变换idct同dct(src, dst, flags | DCT_INVERSE)dft, idft正、逆离散傅立叶变换, idft同dft(src, dst, flags | DTF_INVERSE)LUT查表变换getOptimalDFTSize返回一个优化过的DFT大小mulSpecturms两个傅立叶频谱间逐元素的乘法上表引自http://blog.sina.com.cn/s/blog_7908e1290101i97z.html// 转载https://blog.csdn.net/iracer/article/details/51296631