【OpenCV】三种方式操作图像像素
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】三种方式操作图像像素的更多相关文章
- php三种方式操作mysql数据库
php可以通过三种方式操作数据库,分别用mysql扩展库,mysqli扩展库,和mysqli的预处理模式分别举案例加以说明 1.通过mysql方式操作数据库 工具类核心代码: <?php cla ...
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...
- Android 接入 OpenCV库的三种方式
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少 ...
- Android 使用OpenCV的三种方式(Android Studio)
http://blog.csdn.net/sbsujjbcy/article/details/49520791 其实最早接触OpenCV是很久很久之前的事了,大概在2013年的5,6月份,当时还是个菜 ...
- JDBC的批处理操作三种方式 pstmt.addBatch()
package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...
- HTML5实现动画三种方式
编者注:作者以一个运动的小车为例子,讲述了三种实现HTML5动画的方式,思路清晰,动画不仅仅是canvas,还有css3和javascript.通过合理的选择,来实现最优的实现. PS:由于显卡.录制 ...
- 监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- Linux中设置服务自启动的三种方式
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/e ...
随机推荐
- amazeui笔记-Cookie
- TabControl 选项卡控件
TabControl 控件是由System.Windows.Forms.TabControl类提供的,作用就是讲相关的组件组合到一系列选项卡页面上. MulitiLine 属性用来设置是否显示多行 ...
- [linux] shell脚本编程-xunsearch安装脚本学习
安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...
- 02-Http请求与响应全解
什么是协议 约束双方规范的一个准则 什么是HTTP协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵 ...
- Go按照条件编译
Go 支持按照条件编译,具体来说它是通过 go/build包 里定义的tags和命名约定来让Go的包可以管理不同平台的代码 . 我们这里以下面这个开源项目为例,来看Go的按条件编译, 这个开源项目是把 ...
- HTTP 错误500.19 - 错误代码 0x80070021
1.错误描述 HTTP 错误500.19 -Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息 模块 IIS Web Core 通知 Begi ...
- 第N次学习javaIO之后
io按流分 输入流.输出流 io按类型分(是类型吧) 字节流.字符流 ------------------------------------- 先说说一直以来混淆什么时候用输入流,什么时候用输出流. ...
- [HAOI2009]逆序对数列(加强)
ZJL 的妹子序列 暴力就是 \(\Theta(n\times m)\) 如果 \(n,m \le 10^5\) ? 考虑问题的转换,设 \(a_i\) 表示 \(i\) 小的在它后面的数的个数 \( ...
- Python 关于bytes类方法对数字转换的误区, Json的重要性
本文起源于一次犯错, 在发觉bytes()里面可以填数字, 转出来的也是bytes类型, 就心急把里面的东西decode出来. 结果为空.搞来搞去以为是命令不熟练事实上错在逻辑. a1 = bytes ...
- line-height属性的深入了解
line-height属性的细节与大多数CSS属性不同,line-height支持属性值设置为无单位的数字.有无单位在子元素继承属性时有微妙的不同. 语法line-height: normal | & ...