访问图像中的像素

访问图像像素有三种可行的方法
方法一:指针访问
指针访问访问的速度最快,Mat类可以通过ptr函数得到图像任意一行的首地址,
同时,Mat类的一些属性也可以用到公有属性 rows和cols 表示行和列
通道数可以通过channels()函数获得;
void visitPix1()
{
Mat srcImg = imread("jpg/1.jpeg");
Mat dstImg;
srcImg.copyTo(dstImg);
int rowNum = dstImg.rows;
int colNum = dstImg.cols*dstImg.channels();
for(int row = 0;row<rowNum;row++)
{
uchar* data = srcImg.ptr<uchar>(row);
for(int col = 0;col<colNum;col++)
{
data[col]+=23;
}
}
imshow("src",srcImg);
imshow("dst",dstImg);
waitKey();
}
方法二:迭代器访问
通过迭代器访问像素。可以获得begin和end 然后只需要从begin迭代到end就可以 用×操作符取得地址内容

void visitPix1()
{
Mat srcImg = imread("jpg/1.jpeg");
Mat dstImg;
srcImg.copyTo(dstImg);
Mat_<Vec3b>::iterator begin = dstImg.begin<Vec3b>();
Mat_<Vec3b>::iterator end = dstImg.end<Vec3b>();
for(Mat_<Vec3b>::iterator it = begin;it!=end;it++)
{
(*it)[0] += 12;
(*it)[1] +=13;
(*it)[2] +=14;
}
imshow("src",srcImg);
imshow("dst",dstImg);
waitKey();
}
方法三:动态地址计算
这里可以介绍一个at方法,at(int y,int x)可以用来存取图像,但是需要数据类型的转换
img.at<Vec3b>(j,i)[channel] = value;
void visitPix3()
{ Mat srcImg = imread("jpg/1.jpeg");
Mat dstImg;
srcImg.copyTo(dstImg);
int rowNum = dstImg.rows;
int colNum = dstImg.cols*dstImg.channels();
for(int row = 0;row<rowNum;row++)
{
for(int col = 0;col<colNum;col++)
{
dstImg.at<Vec3b>(row,col)[0] +=23;
dstImg.at<Vec3b>(row,col)[1] +=23;
dstImg.at<Vec3b>(row,col)[2] +=23;
}

}
imshow("src",srcImg);
imshow("dst",dstImg);
waitKey();

}

另外添加一个函数

计时函数

opencv 中有两个可以计时的函数 getTickCount 和 getTickFrequency
getTickCount 函数返回cpu自某个事件以来走过的时钟周期数
getTickFrequency 函数返回cpu 一秒钟所走的时钟周期数,

例子
void timeTest()
{
double time0 = static_cast<double>(getTickCount());
for(int i =0;i<100000;i++){}
time0 = (double)(getTickCount()-time0)/getTickFrequency();
cout<<"run time"<<time0<<"sec"<<endl;
}

opencv 访问图像像素的三种方式的更多相关文章

  1. Struts2访问Servlet API的三种方式

    有时我们需要用到Request, Response, Session,Page, ServletContext这些我们以前常用的对象,那么在Struts2中怎么样使用到这些对象呢,通常有三种方式. * ...

  2. TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  3. SpringMVC访问静态资源的三种方式(转)

    本文转自:http://www.iigrowing.cn/springmvc_fang_wen_jing_tai_zi_yuan_de_san_zhong_fang_shi.html 如何你的Disp ...

  4. 转转转!SpringMVC访问静态资源的三种方式

    如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  5. 当配置 DispatcherServlet拦截“/”,SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  6. SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  7. 【转】SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  8. 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】

    首先声明一点,springboot获取资源文件,需要看是 1>从spring boot默认的application.properties资源文件中获取 2>还是从自定义的资源文件中获取 带 ...

  9. opencv之访问图像像素

    访问像素的三种方法 ①指针访问:最快 ②迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 ③动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 ...

随机推荐

  1. GCD 信号量 dispatch_semaphore_t

    1.GCD知识讲解 1)dispatch_semaphore_create(long value) //创建一个信号量,总量为value,value不能小于0 2)dispatch_semaphore ...

  2. H5在线编辑器优化总结

    花了三个半月做了个编辑器.自己一个人写写CSS,搞搞html,弄下JS,大部分精力都是掏鼓js,时间很仓促,后面领导帮忙写了四个页面逻辑(音频,图片,视频). 很多能优化的,以此文章记录要已经优化和未 ...

  3. str-字符串功能介绍

    叨逼叨:字符串的各个功能修改不是本身,本身不变,会产生新的值,需要赋值给新的变量来接收 以下 "举例" 是解释每个功能的实例   "举例"下一行是pycharm ...

  4. React Native之APK文件签名及打包

    生成apk签名文件 我们使用android studio的方式进行签名 AS工具栏找到并点击 build->gennrate signed apk 两种情况: 1.这里如果已经有签名文件了则直接 ...

  5. org.apache.jasper.JasperException: - Page directive must not have multiple occurrences of pageencoding

    最近写jsp遇到一系列的低级错误,记录下来权当前车之鉴吧. 错误提示: SEVERE: Servlet.service() for servlet jsp threw exceptionorg.apa ...

  6. jmeter-命令行执行脚本

    日常测试过程中发现,在大数量并发时,jmeterGUI界面时长宕机.卡死,在这种情况下我们就需要使用命令行来执行脚本了(非GUI), 命令行执行首先就必须要配置环境变量,如同JAVA-HOME一样,这 ...

  7. 为何你跟着滴滴D8级前端大神撸代码,技术却依旧原地踏步?

    引子 听说最近有很多小伙伴,热衷于在慕课网上学习各种前端实战教程,并以完成项目为奋斗目标.比如本文接下来要提到的<Vue2.0高级实战之开发移动端音乐App>,这门课程的传授者是来自滴滴D ...

  8. Linux服务器下对Oracle作Rman备份

    由于工作需要,最近要对几台Linux系统下的Oracle数据库进行Rman备份,就在操作的同时,整理了一下,方便今后作为资料进行查阅. ------------------------Linux服务器 ...

  9. Jenkins: 执行 PowerShell 命令

    Jenkins 默认是不支持执行 PowerShell 命令的,需要安装插件才能完成这样的任务.本文将介绍 Jenkins PoserShell 插件的基本用法和常见问题. 安装 PowerShell ...

  10. (转)centos7安装telnet服务

    场景:在进行Telnet测试时候,发现无法连接,所以还得把这个软件也安装了 1 CentOS7.0 telnet-server 启动的问题 解决方法:   先检查CentOS7.0是否已经安装以下两个 ...