OpenCV使用forEach的方式来遍历像素值

news2024/10/7 0:27:31

opencv 4.x新增了forEach的方式遍历像素值,比传统方式略快一些。因为它本身是使用多线程并行的方法来遍历的。从opencv源码能看到这句话:

parallel_for_(cv::Range(0, LINES), PixelOperationWrapper(reinterpret_cast<Mat_<_Tp>*>(this), operation));

写了一个测试用例,把它用起来。包括单通道,三通道,浮点型等cv::Mat的遍历。

#include <iostream>

typedef cv::Point3_<uint8_t> Pixel;

void test1(cv::Mat &image)
{
    //raw pointer access.
    double 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;
        }
    }

    double time = (((double)cv::getTickCount() - start)) / cv::getTickFrequency();
    printf(" raw pointer access time1 : %.4f seconds\n", time);
}

void test2(cv::Mat &image)
{
    double start = (double)cv::getTickCount();
    int w = image.cols;
    int h = image.rows;
    for (int row = 0; row < h; row++)
    {
        uchar *uc_pixel = image.data + row * image.step;
        for (int col = 0; col < w; col++)
        {
            uc_pixel[0] = 255 - uc_pixel[0];
            uc_pixel[1] = 255 - uc_pixel[1];
            uc_pixel[2] = 255 - uc_pixel[2];
            uc_pixel += 3;
        }
    }

    double time = (((double)cv::getTickCount() - start)) / cv::getTickFrequency();
    printf(" raw pointer access time2 : %.4f seconds\n", time);
}

void test3(cv::Mat &image) //OpenCV中C++11 lambda方式像素遍历,OpenCV4.x开始支持
{
    //forEach方式的像素遍历,三通道图像
    //Pixel和 position(分别指该像素的数值信息和位置信息)
    //使用了x,y,z分别代表该像素点的blue, grean, red这三个通道的颜色值
    //position是遍历的像素点坐标位置
    //position[0]=row, position[1]=col
    double start = (double)cv::getTickCount();
    image.forEach<Pixel>([](Pixel &p, const int *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 time3 : %.4f seconds\n", time);
}

void test4(cv::Mat &image)
{
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

    //遍历单通道图像
    //position是遍历的像素点坐标位置
    //position[0]=row, position[1]=col
    gray.forEach<uint8_t>([](uint8_t &p, const int *position) -> void {
        p += 1;
    });
}

void test5(cv::Mat &image)
{
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

    cv::Mat ft;
    gray.convertTo(ft, CV_32FC1, 1.0 / 255.0);

    //多线程并行遍历像素,需要加锁
    float score = 0.8;
    std::vector<cv::Point> vtPos;
    std::vector<float> vtConfidences;
    std::mutex mtx;
    ft.forEach<float>([&vtConfidences, &vtPos, &score, &mtx](float &val, const int *position) -> void {
        if (val > score)
        {
            mtx.lock();
            vtPos.emplace_back(cv::Point(position[1], position[0])); //x,y==col,row
            vtConfidences.emplace_back(val);
            mtx.unlock();
        }
    });

    std::cout << vtPos.size() << std::endl;
}

int main(int argc, char *argv[])
{
    cv::Mat image = cv::imread("D:/temp/2-6-11.jpg", cv::IMREAD_COLOR);
    test1(image);
    test2(image);
    test3(image);
    test4(image);
    test5(image);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring框架学习笔记(本地印象笔记搬运)(整理中)

1、背景 Spring作为Java Web开发使用最频繁的框架&#xff0c;具有非常高的学习价值&#xff0c;在Spring框架源码中包含了很多设计模式&#xff08;单例、原型、代理、观察者等&#xff09;&#xff0c;读懂这些源码有助于拓宽开发思路&#xff0c;同时也能提高后端排查错误的…

QQ等级评估源码+软件

今天&#xff0c;我将和大家探讨一个与直播、撸礼物相关的主题&#xff0c;它涉及到的是一种特殊的软件及其源码——QQ等级评估工具。在我们的生活中&#xff0c;直播已经成为了一种越来越流行的娱乐方式。不论是音乐会、电子竞技&#xff0c;还是日常生活分享&#xff0c;你都…

使用AI技术实现语言练习

使用人工智能技术实现语言场景练习&#xff0c;可以有效地提高学习者的语言能力&#xff0c;包括口语、听力、阅读和写作。以下是一些常见的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 口语练习 虚拟对话伙伴: 利用…

基于最优滑膜控制的永磁同步电机调速系统MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 最优滑模面的选取 假定系统初始位于滑模面上&#xff0c;可得&#xff1a; 通过设计c(t)使如下积分性能指标达到最小: T为到达滑模面的终值时间&#xff0c;求解方程: a为系统初始条件参数。设cmc(0)为c(t)变…

软件协同开发是一种通过团队合作来创建软件的开发方法

软件协同开发是一种通过团队合作来创建软件的开发方法。与传统的瀑布模型相比&#xff0c;软件协同开发强调团队成员之间的合作和沟通&#xff0c;以实现更高效的开发过程和更优质的软件产品。 在软件协同开发中&#xff0c;团队成员通过一系列工具和技术来协同工作。这些工具…

Ubuntu-22.04 安装Confulence

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

昇思25天学习打卡营第4天|onereal

今天学习的内容是&#xff1a;ResNet50迁移学习 以下内容拷贝至教程&#xff0c;实话实话看不懂&#xff0c;迷迷糊糊都运行jupyter里的代码。走完程序&#xff0c;训练生成了一些图片。 ResNet50迁移学习 在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;所以很少…

[MYSQL] MYSQL表的操作

前言 由图可以看出,表是库的一部分,所以有库才能使用表 show databases; 查看已有的库 create database db_name ; 创建库 使用 use bd_name 使用库,之后对标进行增删查改就只会操作这个库里的而不影响其他库 创建表 create table [if not exists] table_name( d…

vue的学习--day2

如有错误&#xff0c;烦请指正~ 目录 一、什么是单页面应用程序 二、使用工具&#xff1a;node.js 三、工具链 易错点 一、什么是单页面应用程序 多个组件&#xff08;例如登录、注册等以vue结尾的都叫做组件&#xff09;在一个页面显示&#xff0c;叫单页面应用…

如何用亚马逊合作伙伴网络快速上线跨境电商

目前跨境电商已成为行业发展主流&#xff0c;如何快速、低成本打造品牌海外独立站和智能客服营销中心、构建全链路跨境电商体系是出海电商商家都会遇到的难题。亚马逊云科技凭借与亚马逊电商平台易于集成的先天优势成为首选的电商解决方案平台。本文介绍了如何用亚马逊云科技平…

ONLYOFFICE8.1新版本桌面编辑器测评

什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#xff0c;支持编辑处理文本文档、电子表格、演示文稿、可填写的表单、PDF&#xff0c;可多人在线协作&#xff0c;支持 AI 集成。 该套件可在 Windows、Linux、Android 和 iOS上使用&#xff0c;包括网页…

【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下Hive中常见的优化手段----数据采集&#xff01;常见的Join 优化有哪几种&#xff01;什么是Hive索引&#xff01;数据怎么发生倾斜&#xff01;什么是mapreduce的本…

2024年6月24日 (周一) 叶子游戏新闻

图吧工具箱: 全名图拉丁吧硬件检测工具箱,是开源、免费、绿色、纯净的硬件检测工具合集,专为图钉及所有DIY爱好者制作,包含常用硬件测试和检测工具,月工JS必备! 土豆录屏: 免费、无录制时长限制、无水印的录屏软件 高手在民间 粉丝玩家打造精美《黄金树幽影》巨大插画虽然不是专…

私接路由器导致部分终端(电脑、手机等)无法上网问题分析

目录 【1】私接路由器场景 【2】进行网络基本配置&#xff0c;模拟终端可以正常上网 【2.1】Http-Server配置 【2.2】ISP配置 【2.3】R-hefa配置 【2.4】Client1配置 【2.5】PC配置 【2.6】测试验证上网是否正常 【3】私接路由器后再测试验证公司内网各终端访问外网是…

Linux网络编程:套接字编程

1.Socket套接字编程 1.1.什么是socket套接字编程 Socket套接字编程 是一种基于网络层和传输层网络通信方式&#xff0c;它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件&#xff0c;它提供了不同主机间的进程间通信端点的抽象。一个Socket就是…

【Python】已解决:TypeError: a bytes-like object is required, not ‘int’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;TypeError: a bytes-like object is required, not ‘int’ 一、分析问题背景 在使用Python进行文件操作或处理二进制数据时&#xff0c;开发者可能会遇到如下错…

Coldrage Dagger

剃刀高地【寒怒匕首 Coldrage Dagger】 2020.11.26.剃刀高地刷【寒怒匕首】-1_网络游戏热门视频 2020.11.26.剃刀高地刷【寒怒匕首】-2_网络游戏热门视频

讯飞星火企业智能体平台正式发布,打造每个岗位专属AI助手

大力财经 | 发布 讯飞星火V4.0来了&#xff01;6月27日&#xff0c;科大讯飞在北京发布讯飞星火大模型V4.0及相关落地应用。讯飞星火V4.0七大核心能力全面提升&#xff0c;整体超越GPT-4 Turbo&#xff0c;在8个国际主流测试集中排名第一&#xff0c;国内大模型全面领先。 大模…

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数 0. 引言1. 关于m_line2. 关于m_quiver3. 关于m_text4. 关于m_plot5. 结语 0. 引言 本篇介绍下m_map中添加绘制基础线&#xff08;m_line、m_plot&#xff09;、绘制箭头&#xff08;m_quiver&#x…

Gradle学习-3 Gradle插件

1、Gredle插件是什么 Gradle插件是用于扩展和增强Gradle构建系统的功能模块通过插件&#xff0c;Gradle可以执行各种构建任务&#xff0c;如编译代码、打包应用、运行测试等 Gradle插件主要分为&#xff1a;二进制插件、脚本插件 二进制插件二进制插件是预编译的、可以复用的…