OpenCV2:Mat

1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的。OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。矩阵头主要包含,矩阵尺寸、存储方法、存储地址和引用次数等。矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针。例如: cv::Mat a ;//创建矩阵头a = cv::imread("f:\\psb.jpg");//读入图像cv::Mat b = a ;//复制  上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。 上图是Mat对象a,b共用一个矩阵,故其引用计数refcount为2.但是有些时候仍然会需要复制矩阵数据本身(不只是矩阵头和矩阵指针),这时候可以使用clone 和copyTo方法。 cv::Mat c = a.clone();cv::Mat d…

四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法

四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法  原创文章,欢迎转载,转载请注明出处      最近时间花在最多的地方就是STM32的I2C上了。之前就知道STM32的I2C并不好用,因为之前用过模拟的I2C,也写过AVR的I2C也就是TWI的硬件驱动,所以想试试写STM32的硬件I2C。。。为了避免库带来的麻烦,之前和特意将STM32F4的标准库升级到了1.3.0,但是貌似问题依旧。于是在网上找到了ST转为I2C写的CPAL的库,拿着它的英文手册和例子看了下,觉得很不错,功能相当的齐全,按照手册配置用起来应该不错,于是开始加载到自己的项目中。它需要一个定时器,用来管理超时,当通讯出现问题的时候,通过这个超时机制可以见得到,从而可以做一些简单的处理,它默认用的是systick中断,这个好办啊,用RTT的一个线程来替代systick或者用另外一个定时器就可以了,它还有一个要求,需要用到I2C相关的两个中断设置为最高优先级,虽然觉得优点不舒服哈,但是只能这样设置了,其实STM32中I2C的硬件缺陷就在这,需要第一时间响应I2C中断,否则就可能出现问题,就算自己写STM32的I2C,这两个中断优先级也需要设定的很高,可是之后发现了一个我认为可能接受不了的东西,就是在中断里面有一个宏,__CPAL_I2C_TIMEOUT ,定义如下 #define __CPAL_I2C_TIMEOUT_DETECT ((pDevInitStruct->wCPAL_Timeout == CPAL_I2C_TIMEOUT_MIN) ||\ (pDevInitStruct->wCPAL_Timeout == CPAL_I2C_TIMEOUT_DEFAULT)) #define __CPAL_I2C_TIMEOUT(cmd,…

MXNet设计和实现简介

原文:https://github.com/dmlc/mxnet/issues/797 神经网络本质上是一种语言,我们通过它来表达对应用问题的理解。例如我们用卷积层来表达空间相关性,RNN来表达时间连续性。根据问题的复杂性和信息如何从输入到输出一步步提取,我们将不同大小的层按一定原则连接起来。近年来随着数据的激增和计算能力的大幅提升,神经网络也变得越来越深和大。例如最近几次imagnet竞赛的冠军都使用有数十至百层的网络。对于这一类神经网络我们通常称之为深度学习。从应用的角度而言,对深度学习最重要的是如何方便的表述神经网络,以及如何快速训练得到模型。 对于一个优秀的深度学习系统,或者更广来说优秀的科学计算系统,最重要的编程接口的设计。他们都采用将一个领域特定语言(domain specific language)嵌入到一个主语言中。例如numpy将矩阵运算嵌入到python中。这类嵌入一般分为两种,其中一种嵌入的较浅,其中每个语句都按原来的意思执行,且通常采用命令式编程(imperative programming),其中numpy和Torch就是属于这种。而另一种则用一种深的嵌入方式,提供一整套针对具体应用的迷你语言。这一种通常使用声明式语言(declarative programing),既用户只需要声明要做什么,而具体执行则由系统完成。这类系统包括Caffe,theano和刚公布的TensorFlow。 这两种方式各有利弊,总结如下   浅嵌入,命令式编程 深嵌入,声明式编程 如何执行a=b+1 需要b已经被赋值。立即执行加法,将结果保存在a中。 返回对应的计算图(computation graph),我们可以之后对b进行赋值,然后再执行加法运算 优点 语义上容易理解,灵活,可以精确控制行为。通常可以无缝的和主语言交互,方便的利用主语言的各类算法,工具包,bug和性能调试器。 在真正开始计算的时候已经拿到了整个计算图,所以我们可以做一系列优化来提升性能。实现辅助函数也容易,例如对任何计算图都提供forward和backward函数,对计算图进行可视化,将图保存到硬盘和从硬盘读取。…