三种方法分别问:

指针访问: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 = ; i < rowNumber; i++)
{
uchar* data = outputImage.ptr<uchar>(i);
for (size_t j = ; j < colNumber; j++)
{
data[j] = data[j] / div*div + div / ;
}
}
} 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 = ; px < ; px++)
{
(*it)[px] = (*it)[px] / div*div + div / ;
}
}
} 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 = ; i < rowNumber; i++)
{
for (size_t j = ; j < colNumber; j++)
{
for (size_t px = ; px < ; px++)
{
outputImage.at<cv::Vec3b>(i, j)[px] = outputImage.at<cv::Vec3b>(i, j)[px] / div * div + div / ;
}
}
}
} 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, );
timeStart = ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency();
cout << "ptr方法运行时间为:" << timeStart << "秒" << endl; timeStart = static_cast<double>(cv::getTickCount());
colorReduce_iterator(srcImg, dstImg, );
timeStart = ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency();
cout << "iterator方法运行时间为:" << timeStart << "秒" << endl; timeStart = static_cast<double>(cv::getTickCount());
colorReduce_at(srcImg, dstImg, );
timeStart = ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency();
cout << "at方法运行时间为:" << timeStart << "秒" << endl; cv::imshow("dstImg", dstImg);
cv::waitKey();
}

最新文章

  1. Google云平台对于2014世界杯半决赛的预测,德国阿根廷胜!
  2. quartz 线程问题
  3. Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)
  4. This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms
  5. 过滤菜鸟的iOS面试题-b
  6. windows下安装mysql5.6.13的主从复制
  7. nyoj 79 拦截导弹 (动态规划)
  8. seajs和requirejs对比;node初识
  9. MYSQL:RELPACE用法
  10. python3脚本打开摄像头
  11. vue框架中的Axios封装
  12. PolarCode
  13. 使用github的感想
  14. 118/119. Pascal&#39;s Triangle/II
  15. eclipse CDT写c++使用文件作为输入源(输入重定向)
  16. BarTender表单的人性化设计—分组框
  17. 福大软工 &#183; 第十一次作业 - Alpha 事后诸葛亮
  18. jvm 内存机制
  19. FTP上传(批处理)
  20. webapi 获取json数据

热门文章

  1. HTTP协议扫盲(一)HTTP协议的基本概念和通讯原理
  2. 【第二十一篇】手C# MVC 微信授权登录 OAuth2.0授权登录
  3. 服务器批量管理软件ansible安装以及配置
  4. 图片处理之 Base64
  5. transform做2d和3d变形(css动画一)
  6. 一张图片快速明白Python概述
  7. 初试GH-OST
  8. Testlink1.7.5安装部署
  9. Ubuntu重装mysql错误解决
  10. 想进大厂,想收获高薪offer,资深猎头告诉你怎么做......