Opencv常见用法和常见错误(一)

时间:2022-12-03 04:38:47

一. 读取中文的路径的图像

使用Opencv错误的读法如下:

 int main()
{
Mat img = imread("E:\示例图片/1.jpg");
namedWindow("实例");
imshow("实例",img);
waitKey();
}

将会产生如下错误

Opencv常见用法和常见错误(一)

正确的读法如下:
在读取图像的时候加入两个头文件:

#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();
}

可以得到结果图:

Opencv常见用法和常见错误(一)

二. 申请一个全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);

点乘

Ma=[15263748] Mb=[84736251] Mc=[82014181814208] 叉乘
    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 ;

Ma=[15263748] Mb _ transpose=43218765 Mc=[307070174]

三. 求矩阵的行或列的最大值、最小值、平均值、和

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);

Ma=[12566732] dst=[311135]

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);

Ma=[12566732] dst=[1.55.56.52.5]

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);

Ma=[12566732] dst=[1517]

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);

Ma=[12566732] dst=[3.754.25]

四. 矩阵求逆


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);

Ma=[2002] dst=[0.5000.5]

五. 把原矩阵某行或者某列赋值给新矩阵

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);

Ma=[2002] dst=[02]

六. 点除
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);

Ma=[2002] dst=[1001]

七. 矩阵求行列式

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);

Ma=[2002] dst=4

八. 读取目录下连续的文件名

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;

Opencv常见用法和常见错误(一)
内蒙大草原