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

来源:互联网 发布:变脸软件有哪些 编辑:程序博客网 时间:2024/06/05 18:35

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

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

点乘

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;

这里写图片描述
内蒙大草原

0 0