opencv 3.1.0 访问像素值的三种方法(C++)

三种方法分别问:

指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div);

迭代器访问:void colorReduce_iterator(cv::Mat &inputImage, cv::Mat &outputImage, int div);

动态地址计算:void colorReduce_at(cv::Mat &inputImage, cv::Mat &outputImage, int div);

#include <opencv.hpp>
#include <iostream>

using namespace std;

void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div);
void colorReduce_iterator(cv::Mat &inputImage, cv::Mat &outputImage, int div);
void colorReduce_at(cv::Mat &inputImage, cv::Mat &outputImage, int div);

void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div)
{
    outputImage = inputImage.clone();
    int rowNumber = outputImage.rows;
    int colNumber = outputImage.cols*outputImage.channels();
    for (size_t i = 0; i < rowNumber; i++)
    {
        uchar* data = outputImage.ptr<uchar>(i);
        for (size_t j = 0; j < colNumber; j++)
        {
            data[j] = data[j] / div*div + div / 2;
        }
    }
}

void colorReduce_iterator(cv::Mat &inputImage, cv::Mat &outputImage, int div)
{
    outputImage = inputImage.clone();
    cv::Mat_<cv::Vec3b>::iterator it = outputImage.begin<cv::Vec3b>();
    cv::Mat_<cv::Vec3b>::iterator it_end = outputImage.end<cv::Vec3b>();

    for (;it != it_end; ++it)
    {
        for (size_t px = 0; px < 3; px++)
        {
            (*it)[px] = (*it)[px] / div*div + div / 2;
        }
    }
}

void colorReduce_at(cv::Mat &inputImage, cv::Mat &outputImage, int div)
{
    outputImage = inputImage.clone();
    int rowNumber = outputImage.rows;
    int colNumber = outputImage.cols;

    for (size_t i = 0; i < rowNumber; i++)
    {
        for (size_t j = 0; j < colNumber; j++)
        {
            for (size_t px = 0; px < 3; px++)
            {
                outputImage.at<cv::Vec3b>(i, j)[px] = outputImage.at<cv::Vec3b>(i, j)[px] / div * div + div / 2;
            }
        }
    }
}

int main(int argc, char** argv[])
{
    cv::Mat srcImg = cv::imread("E:/data/lena.jpg");
    cv::imshow("srcImg", srcImg);

    cv::Mat dstImg;
    dstImg.create(srcImg.rows, srcImg.cols, srcImg.type());

    double timeStart;
    timeStart = static_cast<double>(cv::getTickCount());
    colorReduce_ptr(srcImg, dstImg, 32);
    timeStart = ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency();
    cout << "ptr方法运行时间为:" << timeStart << "秒" << endl;

    timeStart = static_cast<double>(cv::getTickCount());
    colorReduce_iterator(srcImg, dstImg, 32);
    timeStart = ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency();
    cout << "iterator方法运行时间为:" << timeStart << "秒" << endl;

    timeStart = static_cast<double>(cv::getTickCount());
    colorReduce_at(srcImg, dstImg, 32);
    timeStart = ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency();
    cout << "at方法运行时间为:" << timeStart << "秒" << endl;

    cv::imshow("dstImg", dstImg);
    cv::waitKey(0);
}

时间: 2024-11-02 23:27:15

opencv 3.1.0 访问像素值的三种方法(C++)的相关文章

js(20140517)在JS方法中返回多个值的三种方法

在JS方法中返回多个值的三种方法 在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: <html> <head> <title>JS函数返回多个值--oec2003</title> </head> <body> <input type="button" onclick="getNames()" value="t

struts2的action访问servlet API的三种方法

学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object get(Object key);可以获取request属性 Map getSession():可以得到session属性 Map getAppliction():可以得到ServletContext实例 2.action类实现 ServletContextAware,ServletRequestAwa

Action访问Servlet API的三种方法

一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器而言,不访问action是不行的,Struts提供了一种比较简单的方式来访问Servlet API . 二.通常我们需要访问的Servlet API 是 HttpSession.HttpservletRequest.ServletContext,分别对应了JSP内置对象 session,reques

RHEL7.0 配置网络IP的三种方法

导读 RHEL7里面的网卡命名方式从eth0,1,2的方式变成了enoXXXXX的格式. en代表的是enthernet (以太网),o 代表的是onboard (内置),那一串数字是主板的某种索引编号自动生成,以便保证其唯一性.和原先的命名方式对比,这种新的方式比较长,难以记忆,不过优点在于编号唯一,做系统迁移的时候不容易出错. 1.修改/etc/sysconfig/network-scripts/eno16777736 查看你的网卡名称(本机是eno16777736): [[email pr

Mybatis+Mysql插入数据库返回自增主键id值的三种方法

一.场景: 插入数据库的值需要立即得到返回的主键id进行下一步程序操作 二.解决方法: 第一种:使用通用mapper的插入方法 Mapper.insertSelective(record): 此方法:插入一条数据,只插入不为null的字段,不会影响有默认值的字段支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)优先使用传入的参数值,参数值空时,才会使用序列.UUID,自动增长 controller的实际应用:使用方法id会直接将映射到参数的实体上使用时直接使用

在JS方法中返回多个值的三种方法

在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: <html> <head> <title>JS函数返回多个值--oec2003</title> </head> <body> <input type="button" onclick="getNames()" value="test" /> &

Servlet配置虚拟路径(访问路径)的三种方法以及web开发中的路径问题

一.虚拟路径 配置虚拟路径 web.xml配置文件的虚拟路径 <servlet-mapping> <url-pattern>/demo5</url-pattern> </servlet-mapping> 三种配置方法 * 完全路径匹配 * 以/开头的                 /demo5         /servlet/demo5 * 目录匹配   * 以/开头的                    /*   * 通过:http://localh

JS判断一个数组中是否有重复值的三种方法

方法一: var s = ary.join(",")+","; for(var i=0;i<ary.length;i++) { if(s.replace(ary[i]+",","").indexOf(ary[i]+",")>-1) { alert("数组中有重复元素:" + ary[i]); break; } } 方法二: var ary = new Array("

OpenCV笔记(二)——查看Mat对象的数据的三种方法

我们有了Mat的对象之后,就可以开始对图像进行处理. 在图像的处理过程中,对数据的查看并且对其进行修改,这应当是比较频繁的操作了. 这里讲讲官方手册当中给出的三种方法. 第一种方法:使用指向Mat数据部分的指针. 代码如下: 1 Mat& ScanImageAndReduceC(Mat& I, const uchar* const table) 2 { 3 // accept only char type matrices 4 CV_Assert(I.depth() != sizeof(u