OpenCV--How to scan images, lookup tables and time measurement with OpenCV
2016-04-19 09:18
881 查看
一:学习目标
How to go through each and every pixel of an image?How is OpenCV matrix values stored?
How to measure the performance of our algorithm?
What are lookup tables and why use them?
二:图像矩阵在内存中如何存储
2.1 图像容器Mat
Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放<uchar>类型;如果是RGB彩色图,存放<Vec3b>类型。单通道灰度图数据存放格式:
多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:
注意通道的顺序反转了:由RGB转化成了BGR。通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便。可以用 isContinuous()函数来判断图像数组是否为连续的。
三:访问图像中的像素
3.1高效的方法:C操作符[ ]
最快的是直接用C风格的内存访问操作符[]来访问:CvMat& ScanImageAndReduceC(CvMat& I,const uchar* const table) { //accept only char type matrices CV_ASSERT(I.depth()!=sizeof(uchar)); int channels=I.channels(); int nRows=I.rows; int nCols=I.cols*channels; if (I.isContinuous()) { nCols*=nRows; nRows=1; } int i,j; for (i=0;i<nRows;++i) { p=I.ptr<uchar>(i); for (j=0;j<nCols;++j) { p[j]=table[p[j]]; } } return I; }
这种访问形式就是在每行定义一个指针,然后在内存上直接连续访问。如果整个数组在内存上都是连续存放的,那么只需要定义一个指针就可以访问所有的数据!如单通道的灰度图访问方式如下:
相关文章推荐
- 怎么解决Could not find Developer Disk Image
- 20160419运行apache2.4 丢失VCRUNTIME140.DLL的解决办法
- linux系统免密码登陆
- Eclipse的安装以及与Tomcat的集成
- 大型网站架构之分布式消息队列
- linux下的100个常用命令大全
- 一个用PHP写的网站,当两个人同时用一个账号登录时,后一个会将前一个账号挤下线。
- linux集群运维工具:clustershell和pssh
- 监控session process存储过程
- 如何在Windows下安装Tomcat服务器
- linux下安装QQ并运行
- 在linux下安装mysql数据库
- Linux守护进程运行命令daemonize
- HBase集群配置
- Zookeeper集群环境配置
- VN Working Copy xxx locked 并 cleanup失败之解
- wifi无法连接华为Mate8 热点问题
- Linux版本选择(CentOS)
- linux开机启动流程
- linux用户权限和用户组详解