一. 读取中文的路径的图像
使用Opencv错误的读法如下:
int main()
{
Mat img = imread("E:\示例图片/1.jpg");
namedWindow("实例");
imshow("实例",img);
waitKey();
}
将会产生如下错误
正确的读法如下:
在读取图像的时候加入两个头文件:
#include <QString>
#include <qdebug.h>
int main()
{
Mat img = imread(string(QString("E:\示例图 片/1.jpg").toLocal8Bit()));
namedWindow(string(QString("实例").toLocal8Bit()));
imshow(string(QString("实例").toLocal8Bit()),img);
waitKey();
}
可以得到结果图:
二. 申请一个全1或者全0矩阵
Mat mat=Mat::ones(2,4,CV_64FC1);
Mat mat=Mat::zeros(2,4,CV_64FC1);
三. 矩阵的点乘和叉乘
double a[] = {1, 2, 3, 4, 5, 6, 7, 8};
double b[] = {8, 7, 6, 5 ,4, 3, 2, 1};
Mat Ma = Mat(2, 4, CV_64FC1, a);
Mat Mb = Mat(2, 4, CV_64FC1, b);
Mat Mc = Ma.mul(Mb);
点乘
double a[] = {1, 2, 3, 4, 5, 6, 7, 8};
double b[] = {8, 7, 6, 5 ,4, 3, 2, 1};
Mat Ma = Mat(2, 4, CV_64FC1, a);
Mat Mb = Mat(2, 4, CV_64FC1, b);
Mat Mb_transpose = Ma.t(); // 对Mb取转置
Mat Mc = Ma * Mb_transpose ;
三. 求矩阵的行或列的最大值、最小值、平均值、和
cvReduce( const CvArr* src, CvArr* dst, int dim, int op=CV_REDUCE_SUM);
src
输入矩阵
dst
输出的通过处理输入矩阵的所有行/列而得到的单行/列向量
dim
矩阵被简化后的维数索引.0意味着矩阵被处理成一行,1意味着矩阵被处理成为一列
op
简化操作的方式,可以有以下几种取值:
CV_REDUCE_SUM-输出是矩阵的所有行/列的和.
CV_REDUCE_AVG-输出是矩阵的所有行/列的平均向量.
CV_REDUCE_MAX-输出是矩阵的所有行/列的最大值.
CV_REDUCE_MIN-输出是矩阵的所有行/列的最小值.
i.求每一列的总和
double a[] = {1, 5, 6, 3, 2, 6, 7, 2};
Mat dst;
Mat Ma = Mat(2, 4, CV_64FC1, a);
reduce(Ma,dst,0,CV_REDUCE_SUM);
ii.求每一列的总和
double a[] = {1, 5, 6, 3, 2, 6, 7, 2};
Mat dst;
Mat Ma = Mat(2, 4, CV_64FC1, a);
reduce(Ma,dst,0,CV_REDUCE_AVG);
iii.求每一列的总和
double a[] = {1, 5, 6, 3, 2, 6, 7, 2};
Mat dst;
Mat Ma = Mat(2, 4, CV_64FC1, a);
reduce(Ma,dst,0,CV_REDUCE_SUM);
iv.求每一列的总和
double a[] = {1, 5, 6, 3, 2, 6, 7, 2};
Mat dst;
Mat Ma = Mat(2, 4, CV_64FC1, a);
reduce(Ma,dst,0,CV_REDUCE_AVG);
四. 矩阵求逆
invert(const CvArr* src, CvArr *dst, CV_SVD);
//CV_LU : 高斯消去法 (LU 分解)
//CV_SVD : 奇异值分解(SVD)
//CV_SVD_SYM : 对称矩阵的SVD
double a[] = {2, 0, 0, 2};
Mat dst;
Mat Ma = Mat(2, 2, CV_64FC1, a);
invert(Ma, dst, CV_SVD);
五. 把原矩阵某行或者某列赋值给新矩阵
void copyTo( OutputArray m ) const;
double a[] = {2, 0, 0, 2};
Mat dst;
Mat Ma = Mat(2, 2, CV_64FC1, a);
Ma.row(1).copyTo(dst);
六. 点除
void divide(double scale, InputArray src2, OutputArray dst, int dtype=-1);
double a[] = {2, 0, 0, 2};
Mat dst;
Mat Ma = Mat(2, 2, CV_64FC1, a);
divide(Ma,Ma,dst,1);
七. 矩阵求行列式
void divide(double scale, InputArray src2, OutputArray dst, int dtype=-1);
double a[] = {2, 0, 0, 2};
Mat Ma = Mat(2, 2, CV_64FC1, a);
double dst = determinant(Ma);
八. 读取目录下连续的文件名
QDir dir("E:/Vtami/face/face/");
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList list = dir.entryInfoList();
cout<<list.size()<<endl;
QFileInfo fileInfo = list.at(1);
QString s;
s.append(fileInfo.filePath());
qDebug()<<s<<endl;
Mat img = imread(string(QString(s).toLocal8Bit()));
cout<<img<<endl;
内蒙大草原