zoukankan      html  css  js  c++  java
  • opencv 访问图像像素的三种方式

    访问图像中的像素

    访问图像像素有三种可行的方法
    方法一:指针访问
    指针访问访问的速度最快,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;
    }

  • 相关阅读:
    jdk9以上配置远程断点调试debug
    记解决grpc报错:HTTP/2 client preface string missing or corrupt. Hex dump for received bytes
    CENTOS7静默安装ORACLE11G及数据泵迁移
    数据链路层(7) 链路层设备
    数据链路层(6) 局域网 无线局域网 广域网
    数据链路层(5) 动态分配信道 ALOHA协议、CSMA协议、CSMA/CD协议、CSMA/CA
    数据链路层(3) 流量控制
    数据链路层(2) 差错控制
    数据链路层(1) 数据链路层基本概念
    数据链路层(4) 静态划分信道
  • 原文地址:https://www.cnblogs.com/techdreaming/p/5196541.html
Copyright © 2011-2022 走看看