OpenCV中,有3种访问每个像素的方法:使用at方法、使用迭代器方法、使用指针

运行如下程序后可以发现使用at方法速度最快。

代码如下:

//操作图像像素
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdio>
using namespace std;
using namespace cv; void colorReduce(Mat &a, Mat &b, int div) {//at方法
b = a.clone();
int row = b.rows, col = b.cols;
for(int i = ; i < row; ++i) {
for(int j = ; j < col; ++j) {
b.at<Vec3b>(i, j)[] = b.at<Vec3b>(i, j)[] / div * div + div/;
b.at<Vec3b>(i, j)[] = b.at<Vec3b>(i, j)[] / div * div + div/;
b.at<Vec3b>(i, j)[] = b.at<Vec3b>(i, j)[] / div * div + div/;
}
}
}
void colorReduce1(Mat &a, Mat &b, int div) {//指针
b = a.clone();
int row = b.rows, col = b.cols * b.channels();
uchar *c = b.data;
for(int i = ; i < row; ++i) {
for(int j = ; j < col; ++j) {
*c = *c / div * div + div / ;
c++;
}
}
}
void colorReduce2(Mat &a, Mat &b, int div) {//迭代器
b = a.clone();
Mat_<Vec3b>::iterator it = a.begin<Vec3b>();
Mat_<Vec3b>::iterator itend = a.end<Vec3b>();
Mat_<Vec3b>cimg = b;
Mat_<Vec3b>::iterator itout = cimg.begin();
Mat_<Vec3b>::iterator itoutend = cimg.end();
for(; it != itend; it ++,itout++) {
(*itout)[] = (*it)[]/div * div + div / ;
(*itout)[] = (*it)[]/div * div + div / ;
(*itout)[] = (*it)[]/div * div + div / ;
}
}
int main() {
Mat img, res, temp;
img = imread("PIC1.jpg");
if(!img.data) {cout<<"read image file wrong!"<<endl; getchar(); return ;}
//cout << "height = " << img.size().height << ",width = " << img.size().width << endl;
getchar();
imshow("PIC", img); double t1=(double)getTickCount(); //colorReduce(img, res, 128);//at
colorReduce1(img, res, );//指针
//colorReduce2(img, res, 128);//迭代器 double t2=(double)getTickCount();
double time = (t2-t1)/getTickFrequency()*;
cout<<"Time = " << time << "ms" <<endl; namedWindow("Picture");
imshow("Picture", res); waitKey();
return ;
}

【OpenCV】三种方式操作图像像素的更多相关文章

  1. php三种方式操作mysql数据库

    php可以通过三种方式操作数据库,分别用mysql扩展库,mysqli扩展库,和mysqli的预处理模式分别举案例加以说明 1.通过mysql方式操作数据库 工具类核心代码: <?php cla ...

  2. OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)

    OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...

  3. Android 接入 OpenCV库的三种方式

           OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少 ...

  4. Android 使用OpenCV的三种方式(Android Studio)

    http://blog.csdn.net/sbsujjbcy/article/details/49520791 其实最早接触OpenCV是很久很久之前的事了,大概在2013年的5,6月份,当时还是个菜 ...

  5. JDBC的批处理操作三种方式 pstmt.addBatch()

    package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...

  6. HTML5实现动画三种方式

    编者注:作者以一个运动的小车为例子,讲述了三种实现HTML5动画的方式,思路清晰,动画不仅仅是canvas,还有css3和javascript.通过合理的选择,来实现最优的实现. PS:由于显卡.录制 ...

  7. 监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile

    大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...

  8. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  9. Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

随机推荐

  1. .Net平台技术介绍、C#语言

    转载别人的  只是用做学习 一.什么是.Net平台? .Net平台是微软搭建的技术平台,技术人员在此平台上进行应用的搭建与开发.它提供了运行所必须的环境.NET Framework类库以及CLR(公共 ...

  2. asp,对待绑定数据加序号列(DataSet)

    string sql_sel = "select InS.ID as isID, InS.InventorySize , InS.MinValue,InS.MaxValue from Inv ...

  3. MongoDB 从入门到精通

    1,安装并启动数据库       从官网(www.mongodb.org/downloads)下载一个适合你平台的版本,我的系统是win7 64位的,下载文件也就10几M,将下载的文件解压放到任何目录 ...

  4. NET Core 应用程序 IIS 运行报错 502.3-Gateway

    转自:http://www.zmland.com/forum.php?mod=viewthread&tid=941 将 NET Core 应用程序部署在 IIS 环境,默认配置下,如果任务执行 ...

  5. 二:HTML基础

    一:html语言基础 1.基本结构 <html> <head> <!--元信息:提供额外信息:关键字.作者信息.页面更新时间.设置字符编码--> <meta ...

  6. UVA 624(01背包记录路径)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. springmvc 框架原理

    先来个原理图,镇博. (图片出处:http://www.cnblogs.com/selene/p/4658554.html,感谢博主的图) 着重看:处理器映射器,处理器适配器,这两个的配置. 这两个的 ...

  8. Java注解拾遗

    注解简介: 注解Annotation是jdk1.5的新增功能,在现在的日常开发中,几乎离不开注解,写篇短文,来做个拾遗. 注解作用: Annotation(注解)的作用是修饰包.类.构造方法.方法.成 ...

  9. 初学Node.js

    下载Node.js,官方网址:https://nodejs.org/en/download/ 可根据根据自己的电脑配置来下载相当于的Node.js 下载完成后使用Windows键+R 输入cmd 输入 ...

  10. HTML——基本html标签

    基本html标签 <html> ... </html>  定义HTML文档 <head> ... </head>  文档的信息 <meta /&g ...