码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-30 21:22:05      阅读:373      评论:0      收藏:0      [点我收藏+]

标签:opencv

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

使用Opencv错误的读法如下:

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

将会产生如下错误

![这里写图片描述](http://img.blog.csdn.net/20150729162641428) 正确的读法如下: 在读取图像的时候加入两个头文件:
#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;

技术分享
内蒙大草原

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:opencv

原文地址:http://blog.csdn.net/hlx371240/article/details/47129851

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!