OpenCV 三种图像遍历方法
2016-03-04 00:21
393 查看
实验环境:
Windows10 x64OpenCV 2.4.11 + vs2013
实验目的:
通过颜色压缩(color reduction)示例理解学习OpenCV中遍历图像的三种方法;实验代码:
#include<opencv2/opencv.hpp> #include<iostream> #include<cmath> using namespace cv; using namespace std; // 1:使用指针遍历图像 void colorReduceByPointer(Mat& image, int div = 64) { int nRows = image.rows; int nCols = image.cols * image.channels(); if (image.isContinuous()) { nCols *= nRows; nRows = 1; // 如果连续,外层循环执行只需一次,以此提高执行效率 } for (int i = 0; i < nRows; ++i) { uchar* data = image.ptr<uchar>(i); for (int j = 0; j < nCols; ++j) { data[j] = data[j] / div*div + div / 2; } } } // 2:使用at遍历图像 void colorReduceByAtMethod(Mat& image, int div = 64) { int nRows = image.rows; int nCols = image.cols; if (image.channels() == 1) { for (int i = 0; i < nRows; ++i) { for (int j = 0; j < nCols; ++j) { image.at<uchar>(i, j) = image.at<uchar>(i, j) / div * div + div / 2; } } } else if (image.channels() == 3) { for (int i = 0; i < nRows; ++i) { for (int j = 0; j < nCols; ++j) { image.at<Vec3b>(i, j)[0] = image.at<Vec3b>(i, j)[0] / div*div + div / 2; image.at<Vec3b>(i, j)[1] = image.at<Vec3b>(i, j)[1] / div*div + div / 2; image.at<Vec3b>(i, j)[2] = image.at<Vec3b>(i, j)[2] / div*div + div / 2; } } } } // 3:使用迭代器进行图像的遍历 void colorReduceByIterator(Mat& image, int div = 64) { const int channels = image.channels(); switch (channels) { case 1: { MatIterator_<uchar>begin, end; for (begin = image.begin<uchar>(), end = image.end<uchar>(); begin != end; ++begin) { *begin = *begin / div*div + div / 2; } break; } case 3: { MatIterator_<Vec3b> begin, end; for (begin = image.begin<Vec3b>(), end = image.end<Vec3b>(); begin != end; ++begin) { (*begin)[0] = (*begin)[0] / div * div + div / 2; (*begin)[1] = (*begin)[1] / div * div + div / 2; (*begin)[2] = (*begin)[2] / div * div + div / 2; } break; } } } int main() { Mat image; image = imread("E:\\dataset\\image.jpg"); if (!image.data) return -1; //cvtColor(image, image, CV_BGR2GRAY); //colorReduceByAtMethod(image); //colorReduceByPointer(image); colorReduceByIterator(image); namedWindow("after"); imshow("after", image); cvWaitKey(-1); destroyAllWindows(); return 0; }
参考资料:
opencv_tutorials.pdfOpenCV2 计算机视觉编程手册
相关文章推荐
- centos(linux) 下如何查看端口占用情况及杀死进程
- CentOS 安装贴士
- OpenCV实践之路——Hough变换检测猫眼
- 提高PHP网站性能的经验总结
- 在centos上安装最新版supervisord后台服务
- Linux下软件包的多种安装方式
- 汉化linux系统中帮助命令man
- [翻译]内存 - 第三部分:管理内存
- [翻译]内存 - 第四部分:Intersec定制分配器
- sed 获取shell变量和branch(b)分支的用法
- Linux扩增卷组\逻辑卷LVM
- Eclipse+Maven+Tomcat集成
- Linux 下 命令行 mail 发邮件方法
- CentOS 6 安装 gearman 和它的 php 扩展
- 百度地图API 学习网站
- JSONArray().fromObject(); 出现org.apache.catalina.core.StandardWrapperValve invoke错误的解决办法
- 珠海网站建设需要多少钱?
- jconsole连接linux服务器查看JVM使用情况,服务器配置记录
- 网站数据统计分析之日志收集原理及其实现
- 一个小网站的搬迁过程