opencv技术访问图像中的像素

本文通过实例介绍了如何利用OpenCV的getTickCount()和getTickFrequency()函数来计时,以此评估图像处理操作的时间消耗。示例中,记录了开始时间,执行图像处理操作后,计算并输出了该操作的运行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计时函数
1、getTickCount()函数返回CPU自某个事件以来走过的时钟周期数
2、getTickFreQuency()函数返回CPU一秒钟所走过的时钟周期数。
实例如下:
double time0=static_cast(getTickCount());//记录起始时间
//进行图像处理操作。。。。。。
time0=((double)getTickCount()-time0)/getTickFrequency();
cout<<”此方法运行时间是”<

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void colorReduce(Mat& inputImage, Mat& outputImage, int div);
//用指针访问像素
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
outputImage=inputImage.clone();//复制实参到临时变量
int rowNumber=outputImage.rows;
int colNumber=outputImage.cols*outputImage.channels();
//列数*通道数=每一行元素的个数
for(int i=0;i<rowNumber;i++)
{
uchar* data=outputImage.ptr<uchar>(i);//获取第i行的首地址
for(int j=0;j<colNumber;j++)
{
data[j]=data[j]/div*div+div/2;
}
}
}
/*
//用迭代器操作像素
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
outputImage=inputImage.clone();
//获取迭代器
Mat_<Vec3b>::iterator it=outputImage.begin<Vec3b>();
Mat_<Vec3b>::iterator itend=outputImage.end<Vec3b>();
//存取彩色图像像素
for(;it!=itend;++it)
{
(*it)[0]=(*it)[0]/div*div+div/2;
(*it)[1]=(*it)[1]/div*div+div/2;
(*it)[2]=(*it)[2]/div*div+div/2;
}
}
*/
/*
//动态地址计算
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
    outputImage = inputImage.clone();
    int rowNumber = outputImage.rows;
    int colNumber = outputImage.cols;
    for (int i = 0; i<rowNumber; i++)
    {
        for (int j = 0; j<colNumber; j++)
        {
            outputImage.at<Vec3b>(i, j)[0] = outputImage.at<Vec3b>(i, j)[0] / div*div + div / 2;//蓝色通道
            outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div*div + div / 2;//绿色通道
            outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div*div + div / 2;//红素通道
        }
    }
}
*/
int main()
{
    //创建原始图并显示
    Mat srcImage = imread("1.jpg");
    imshow("原始图像", srcImage);
    //按原图的参数规格来创建效果图
    Mat dstImage;
    dstImage.create(srcImage.cols, srcImage.rows, srcImage.type());
    //记录起始时间
    double time0 = static_cast<double>(getTickCount());
    colorReduce(srcImage,dstImage,32);
    time0 = ((double)getTickCount() - time0) / getTickFrequency();
    cout << "此方法运行时间是" << time0 << "秒" << endl;
    imshow("【效果图】", dstImage);
    waitKey(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值