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;

内蒙大草原

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

时间: 2024-08-08 21:55:29

Opencv常见用法和常见错误(一)的相关文章

A query was run and no Result Maps were found for...原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误

今天遇到一个问题,原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误 报错的结果是这样的: A query was run and no Result Maps were found for the Mapped Statement 'cn.zrgk.dao.RoleMapper.getRoleList'. It's likely that neither a Result Type nor a Result Map was specified. org.apache.

Java 中最常见的 5 个错误

在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 1.Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 NullPointerException.下面代码片段会从另一个方法获得一个集合: List<String> accountIds = person

常见反编译产生错误 k__BackingField 解决办法

常见反编译产生错误 k__BackingField 解决办法     无聊反编译小蚂蚁出现上千的错同样的错 private bool <EnableRuntimeHandler>k__BackingField;        [CompilerGenerated]        private bool <EnableSDE>k__BackingField;        [CompilerGenerated]        private bool <EnableStopw

常见的Android开发错误及解决办法

9个常见的Android开发错误及解决办法: 1. 如果你的项目的R文件不见的话,可以试下改版本号在保存,R文件不见一般都是布局文本出错导致. 2. 布局文件不可以有大写字母 3. 抛出如下错误WARNING: Application does not specify an API level requirement!, 是由于没有指定users sdk的缘故,修改AndroidManifest.xml文件. 加入:<uses-sdkandroid:minSdkVersion="8″>

oracle rac 常见安装、管理错误

1. 安装CRS失败,或执行root.sh报错,可能原因: (1) 节点间的时间不同步,解决方法:使用ntp服务 (2) Linux下启用了默认的防火墙,导致执行root.sh报错: Failure at final check of Oracle CRS stack. 10 解决方法:禁用iptables ,注释/etc/pam.d/other ; # service iptables stop; # chkconfig iptables off. (3) 裸设备的权限问题,可能因为操作系统重

mysql 常见的几个错误问题

Mysql常见的几个错误问题及解决方法: 1.问题: mysql DNS反解:skip-name-resolve 错误日志有类似警告: 点击(此处)折叠或打开 120119 16:26:04 [Warning] IP address '192.168.1.10' could not be resolved: Name or service not known 120119 16:26:04 [Warning] IP address '192.168.1.14' could not be reso

java远程调用(rmi)常见的两个错误

java的 rmi远程调用给分布式编程带来极大的方便,在使用rmi过程中若遇到以下两个问题,可以尝试如下的解决方法 错误 1 : java.rmi.server.ExportException : remote object implements illegal remote interface; nested exception is : java.lang.IllegalArgumentException : illegal remote method encountered : , 解决方

SEO中最常见的几个错误

Git Community Book 中文版书上,摘录如下: 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交,如图 现在我们在这个分支做一些修改,然后生成两个提交(commit). $ vi file.txt $ git commit $ vi

网页设计,常见的6个错误!

对于网页设计的SEO优化,应该是一个老生常谈的话题,为什么总是每隔一段时间,就会再次强调网页设计对搜索优化的重要性,主要的原因就是,总是有一些SEO新手持续的犯一些没有必要的错误,为此,我会再次强调这个问题. 那么,SEO网页设计,常见的6个错误有哪些? 1.瀑布流的无限加载 瀑布流技术算是一个热门的技术,主要用于改善用户体验,但在某些方面却严重影响了SEO效果,如果你曾经认真的分析瀑布流网站,你会发现它并不能抓取AJAX加载的相关内容. 那么目前解决这个问题的最好的办法,应该是增加侧栏,保留最