第四章(下)

简介: OpenCV中有多种选取区域的方法,罗列在表中。使用方法如下,其中比较值得注意的是乘法和除法。  此外,它还有更多的功能稀疏矩阵The cv::SparseMat class is used when an array is likely to be very large compared to                       SparseMat(稀疏矩阵)在一个矩阵的绝大部分都非零的时候使用。


img_a0ab6c86992dad63bee63f062d364206.jpe

OpenCV中有多种选取区域的方法,罗列在表中。使用方法如下,其中比较值得注意的是乘法和除法。

 

img_7484cdbe189bc5e4be63bd87acf90d83.jpe

 

img_a708dc3822341b94c83fe96f7a890cf1.jpe

此外,它还有更多的功能

img_aec59f2442505f41f02dc7bed7e898b5.jpe

img_b35ee50ea1a713e11b5ba37674d051ce.jpe

稀疏矩阵

The cv::SparseMat class is used when an array is likely to be very large compared to                       SparseMat(稀疏矩阵)在一个矩阵的绝大部分都非零的时候使用。也正因此,

the  number  of  nonzero  entries.  This  situation  often  arises  in  linear  algebra  with                   SparseMat(稀疏矩阵)节省空间,并且有特殊的用途。

sparse matrices, but it also comes up when one wishes to represent data, particularly                                

histograms,  in  higher-dimensional  arrays,  since  most  of  the  space  will  be  empty  in

many practical applications. A sparse representation stores only data that is actually

present  and  so  can  save  a  great  deal  of  memory.  In  practice,  many  sparse  objects

would be too huge to represent at all in a dense format. The disadvantage of sparse                          但是,SparseMat(稀疏矩阵)的不利在于基于它的计算比较慢。

representations  is  that  computation  with  them  is  slower  (on  a  per-element  basis).

This last point is important, in that computation with sparse matrices is not categori‐

cally slower, as there can be a great economy in knowing in advance that many oper‐

ations need not be done at all.。

 

普通Mat和稀疏Mat最大的区别,就是其中的元素是如何保存的。稀疏Mat提供4中能够不同的访问方法:

cv::SparseMat::ptr() cv::SparseMat::reft

和cv::SparseMat::value 和cv::SparseMat::find

 

其中

从v::SpareseMat::ptr用于创建一维矩阵。

最简单实用方法:

uchar* cv::SparseMat::ptr(int i0,bool creatMissing,size_t* hashval=0);

如果已经创建,那么将指向这个区域;如果没有指向,否则为NULL.如果当createMissing开着的话,就会创建一个原始的ceateMissing.

 

SpareseMat::ref<>()用于创建一个reference.

可以这样来使用

a_sprse_mat.ref<float>(i0,i1) += 1.0f;

这种使用方法是非常经典的。

什么常用的cv::SparseMagt::value<>()的使用方法和ref是完全一样。但是它返回的是值而不是矩阵。

 

最后cv::SarseMat::find<>(),它返回的是requested object。它的返回结果是只读的。

 

那么让我们拿出一个例子来说明说有的问题吧:

#include "stdafx.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
 
int main(int argc, char* argv[])
{
    // Create a 10x10 sparse matrix with a few nonzero elements
    //
    int size[] = {10,10};
    cv::SparseMat sm( 2, size, CV_32F );
    forint i=0; i<10; i++ ) {           // Fill the array
        int idx[2];
        idx[0= size[0* rand();
        idx[1= size[1* rand();
        sm.ref<float>( idx ) += 1.0f;
    }
    // Print out the nonzero elements
    //
    cv::SparseMatConstIterator_<float> it     = sm.begin<float>();
    cv::SparseMatConstIterator_<float> it_end = sm.end<float>();
    for(; it != it_end; ++it) {
        const cv::SparseMat::Node* node = it.node();
        printf(" (%3d,%3d) %f\n", node->idx[0], node->idx[1], *it );
    }
    waitKey();
}
    

 

通过这个例子可以看出,SparseMat是一个更加类似于hashtable的东西。在添加数据的时候,直接

 sm.ref<float>( idx ) += 1.0f;

而在读取数据的时候,最好采用 迭代器 的方式,

 cv::SparseMatConstIterator_<float> it     = sm.begin<float>();

这个例子就已经取到值了。注意其中你给的Node作为迭代器的存在。

wpsC2C5.tmp.jpg

4个函数的具体用法可以参看表格。上面的例子已经能够说明一类的问题。

 

cv::Mat 和 cv::SpareseMat还有一种模板写作的方法。

可以改写成

cv::Mat_<Vec2f> m(10,10);

以及

cv::SparseMat_<float> sm(ndim,size);


 





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
5月前
|
存储 编译器 C++
c++primer plus 6 读书笔记 第三章 处理数据
c++primer plus 6 读书笔记 第三章 处理数据
|
运维 监控 架构师
第二章 软件过程与思想 第一节 基础
第二章 软件过程与思想 第一节 基础
|
6月前
|
算法
第二章 算法
第二章 算法
29 0
|
存储 消息中间件 负载均衡
第三章介绍|学习笔记
快速学习第三章介绍
|
算法
《优化阵列信号处理》学习笔记(第四章)
注:目前因系统问题,故将本文中的公式全部删除,具体请见pdf版本或访问:http://www.yushuai.xyz/2019/10/16/4442.html 第四章:波束稳健性分析 在实际中,由于各种误差(如观察方向误差、阵型标定误差、通道幅度与相位误差等)的影响,造成导向向量存在误差;另外,由于接收数据协方差矩阵无法精确计算,只能通过接受数据进行估计,也不可避免的存在估计误差。
1621 0
《系统分析与设计方法及实践》一第三章 习题
本节书摘来华章计算机《系统分析与设计方法及实践》一书中的第3章 ,窦万峰 主编 宋效东 史玉梅 李东振 赵菁 等参编更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1213 0
|
存储 计算机视觉 数据挖掘
第四章(上)
第四章The cv::Mat Class: N-Dimensional Dense Arrays Mat n维稠密阵列 The cv::Mat class can be used for arrays of any number of dimensions. The data is                  mat可以作为任意维的数组。
843 0
|
定位技术
第四章 春夏秋冬,二十四节气
第四章 春夏秋冬,二十四节气 一切皆是映射。 春夏秋冬 春 甲骨文:春 左边的上下部分是“木 ”字 的 两 半 ,木 的 中 间 是 “日 ”,表 示 太 阳 的 升 起;字形的右边是“屯”,表示种子的扎根发芽。
1698 0
下一篇
无影云桌面