PLC论坛-全力打造可编程控制器专业技术论坛

 找回密码
 注册哦

QQ登录

只需一步,快速开始

微信扫码登录

查看: 24429|回复: 0

OpenCV中C++11 lambda方式像素遍历

[复制链接]
发表于 2024-6-22 17:20:17 | 显示全部楼层 |阅读模式

C++11 lambda语法
C++11中引入了lambda表达式,它支持定义一个内联(inline)的函数,作为一个本地的对象或者一个参数。有了lambda表达式,就可以很方便的使用stl标准库,它的标准语法如下:[...](...) mutable throwSpec -> returnType {...}
参数解释:

[…]里面包含的是可以引用的本地变量
(…)里面包含的是函数的变量参数
returnType是返回类型


一个简单的例子如下:
auto sum_xy = [](int x, int y) -> int {  return x + y;};std::cout <<" sum_xy = "<< sum_xy(11, 12) << std::endl;

引入本地变量
int a = 25, b = 9;auto sum_xy = [&a, &b](int x, int y) -> int {  return x + y + a + b;};std::cout <<" sum_xy = "<< sum_xy(11, 12) << std::endl;

注意:如果直接使用,没有把本地变量放到变量列表中去,就会出现一个常见的语法错误:
封闭函数局部变量不能在lambda体中引用,除非位于捕获列表中
Mat的for Each遍历
说实话我也没有注意过,OpenCV4从哪个版本开始支持,反正已经支持了,通过Mat的forEach方式结合C++11 lambda表达式,实现对Mat对象快速像素遍历。语法如下:void cv::Mat::forEach(const Functor & operation)其中operation是一个C++11 lambda表达式,同时也是一个匿名的C++函数。基于Mat的for Each实现的像素遍历代码如下:// wxh = 3840x2560cv::Mat image = cv::imread("D:/test_pixs.jpg");typedef cv::Point3_<uint8_t> Pixel;

// forEach方式的像素遍历double start = (double)cv::getTickCount();image.forEach<Pixel>([](Pixel &p, constint * position) -> void {p.x = 255 - p.x;p.y = 255 - p.y;p.z = 255 - p.z;});double time = (((double)cv::getTickCount() - start)) / cv::getTickFrequency();printf(" forEach time : %.4f seconds\n", time);

传统高效的OpenCV指针方式的像素遍历访问代码如下:
// raw pointer access.start = (double)cv::getTickCount();for (int r = 0; r < image.rows; ++r) {  Pixel* ptr = image.ptr<Pixel>(r, 0);const Pixel* ptr_end = ptr + image.cols;for (; ptr != ptr_end; ++ptr) {    ptr->x = 255 - ptr->x;    ptr->y = 255 - ptr->y;    ptr->z = 255 - ptr->z;  }}time = (((double)cv::getTickCount() - start)) / cv::getTickFrequency();printf(" raw pointer access time : %.4f seconds\n", time);
运行结果对比如下:



从执行的时间可以看出,针对一张3840x2560大小的图像、forEach方式遍历的确比较靠谱。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册哦

本版积分规则

QQ|小黑屋|手机版|Archiver|PLC技术网-PLC论坛 ( 粤ICP备17165530号 )|网站地图

GMT+8, 2024-9-8 07:36 , Processed in 0.044208 second(s), 25 queries .

快速回复 返回顶部 返回列表