总结一下OpenCV遍历图像的几种方法

在图形处理中,遍历每个像素点是最基本的功能,是做算法的基础,这篇文章来总结一下opencv遍历图像的几种方法。
本文章参考文档opencv tutorials的how_to_scan_images.cpp例子。
最有效率--指针用c语言直接访问是最有效率的,最快的,下面是简单的示例。
int scan_image_c(mat &i){ int channels = i.channels(); if (channels != 3) { printf(test support only three channel.\\n); return -1; } for (int i = 0; i < i.rows; i++) { vec3b *ptr = i.ptr最安全--迭代器迭代器是c++中的一个概念,因为迭代器从用户手中接管了一些工作,它会保证访问的安全,所以必然会导致一些性能上的降低,简单例子如下。
int scan_image_iterator(mat &i){ int channels = i.channels(); if (channels != 3) { printf(test support only three channel.\\n); return -1; } matiterator_最便捷--at方法opencv的mat类中有一个at方法,它可以直接返回某个像素点,示例如下。
int scan_image_random(mat &i){ int channels = i.channels(); if (channels != 3) { printf(test support only three channel.\\n); return -1; } for( int i = 0; i < i.rows; ++i) { for( int j = 0; j < i.cols; ++j { i.at完整例子#include #include using namespace std;using namespace cv;int scan_image_c(mat &i);int scan_image_iterator(mat &i);int scan_image_random(mat &i);int main( int argc, char* argv[]){ if (argc != 2) { cout << input parameters failed! << endl; return -1; } mat i; i = imread(argv[1], imread_color); if (i.empty()) { cout << the image << argv[1] << could not be loaded. << endl; return -1; } const int times = 100; double t = 0; t = (double)gettickcount(); for (int i = 0; i < times; ++i) { cv::mat clone_i = i.clone(); scan_image_c(clone_i); } t = 1000*((double)gettickcount() - t)/gettickfrequency(); t /= times; cout << time of scan_image_c (averaged for << times << runs): << t << ms.<< endl; t = (double)gettickcount(); for (int i = 0; i < times; ++i) { cv::mat clone_i = i.clone(); scan_image_iterator(clone_i); } t = 1000*((double)gettickcount() - t)/gettickfrequency(); t /= times; cout << time of scan_image_iterator (averaged for << times << runs): << t << ms.<< endl; t = (double)gettickcount(); for (int i = 0; i < times; ++i) { cv::mat clone_i = i.clone(); scan_image_random(clone_i); } t = 1000*((double)gettickcount() - t)/gettickfrequency(); t /= times; cout << time of scan_image_random (averaged for << times << runs): << t << ms.<< endl; return 0;}int scan_image_c(mat &i){ int channels = i.channels(); if (channels != 3) { printf(test support only three channel.\\n); return -1; } for (int i = 0; i < i.rows; i++) { vec3b *ptr = i.ptr运行结果如下:
time of scan_image_c (averaged for 100 runs): 2.04884 ms.time of scan_image_iterator (averaged for 100 runs): 4.77701 ms.time of scan_image_random (averaged for 100 runs): 3.64237 ms.从数据上看,c语言的方法确实是最快的,和其他两种方式拉开了一定的差距。而at遍历比迭代器遍历快了不少。
在平常使用中,我们可以根据每个方法的优点去选择不同的方法。


从虚拟电厂在城市实践中的案例
3D打印部件缺陷尚未完善 X射线研究可理解出错原因
超卓联益传授:汽车线路板盲埋孔的制作方法
如何判断空调四通阀的好坏
阿里云混合云、IoT等产品解决方案帮助东风日产及北汽新能源增产增收
总结一下OpenCV遍历图像的几种方法
清洁维护有讲究 拆装板卡要谨慎
IC Park执行“IC 合伙人”计划 打破传统科技园区招商困局
为什么机器人过程自动化是智能数据中心的前进方向
紫外线特性检测电路(纸币鉴伪系统电路)
小米6什么时候上市?小米6:杀招多但需谨防猪队友,困境之下雷军这样漂亮逆袭
高阶PCB设备需求持续成长 大量等厂商加码成长动能
毫米波雷达与摄像头单应性变换标定方法误差因素分析
多层级网格划分技术如何做到便捷、高效?积鼎CFD大幅减少前处理时间
跨界合作推动创新:IEEE标准协会与多方达成全球战略合作,引领无线局域网络和超高清视频等关键技术的全球
17部门近日印发《“机器人+”应用行动实施方案》
CV芯片作为整个视觉感知技术中最关键的一环,目前也还处在初期
FPGA跨异步时钟ASYNC_REG和XPM_CDC处理
计算光学成像:突破传统光学成像极限
放大器中幅频特性和相频特性的概念及实例测量