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. asp.netCore连接多个数据库

    1.首先要有对应的context实体类, 多个实体类的构造函数的参数都应该是集合 public class firstContext : DbContext { //多个数据库应该使用这个构造函数,参 ...

  2. ssh 连接慢问题

    连接先看报错: There were 11 failed login attempts since the last successful login. 先前有上百上千失败login,被攻击了,把短时 ...

  3. JAVA获取5位随机数

    package baofoo.utils; import org.junit.Test; import java.text.SimpleDateFormat; import java.util.Dat ...

  4. java EE 新手入门了解

    郑重申明:本文转载至https://blog.csdn.net/Neuf_Soleil/article/details/80962686,在此深表感谢! 为什么选择java? 想必有很多初学者会像我一 ...

  5. 《JavaWeb从入门到改行》很好的复习资料: SQL语句到底怎么写 ?

    本文用到的数据库如下: CREATE DATABASE exam; /创建部门表/ CREATE TABLE dept( deptno INT PRIMARY KEY, dname ), loc ) ...

  6. MYSQL建表问题(转)

    今天在dos下准备新建一个数据表,但一直出错,如下 后面在网上查了好久,终于找到了原因.创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上 ...

  7. HTML网页随笔笔记

    文档设置标记   1.格式标记 1.<br> 强制换行标记 让后面的文字.图片.表格等等,显示在下一行 2.<p> 换段落标记 换段落,由于多个空格和回车在HTML中会被等效为 ...

  8. 原型链中的prototype、__proto__和constructor的关系

    先来看一张图,这张图可以说是围绕以下代码完整的描述了各对象之间的关系.接下来我们来看看如何一步步画出这张图. function Foo(){}; var foo = new Foo(); 首先,明确几 ...

  9. vue如何下载报表

    _export() { const _c = this.$createElement; this.$msgbox({ title: '请确认', showCancelButton: true, con ...

  10. ThreeJS geometry的顶点世界坐标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...