【和春笋一起学C++】OpenCV中数组和指针运用实例
前言:前面学习了数组和指针在C++中的处理原理,本文通过自己编写一个图像处理的函数实例来加深对数组和指针的理解。为什么是图像处理呢,因为图像数据是一个二维矩阵,相当于一个二维数组,前面学习了一维数组,现在可以看看指针是怎么来处理二维数组的。
目录
遍历OpenCV中图像像素方法一
遍历OpenCV中图像像素方法二
总结
正文:我们首先使用opencv图像处理库读入一张图像,然后对图像进行二值化(opencv库中已经集成了此功能,此处自己编写仅仅为了巩固指针和数组的知识)。
遍历OpenCV中图像像素方法一
代码如下:
#include <iostream>
#include <cstring>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main()
{Mat srcImage = imread("test.jpg");Mat srcGray;cvtColor(srcImage, srcGray, COLOR_BGR2GRAY);Mat outputImage = srcGray.clone();int rows = outputImage.rows;int cols = outputImage.cols*outputImage.channels();int threshold = 50;for (int i = 0; i < rows; i++){uchar* data = outputImage.ptr<uchar>(i);///获取第i行的首地址for (int j = 0; j < cols; j++){if (data[j] < threshold){data[j] = 255;}else{data[j] = 0;}}}imshow("src", srcImage);imshow("binary", outputImage);waitKey();return 0;
}
该方法中最重要的是这条语句:uchar* data = outputImage.ptr<uchar>(i);Mat类中的ptr函数返回的是某一行的首地址,ptr是一个模板函数,代码中它返回的是第i行的首地址。
第一个循环体内获取每行的首地址,第二个循环体内获取每行的每个像素值,并做阈值划分。前面文章《使用new创建动态数组》讲过,访问数组中的元素既可以用指针访问,也可以用数组的方括号表示法来访问,此处用的是方括号表示法,data[j]代表的是第i行中的第(j+1)个像素,通过双层循环对图像中每一行的每个像素做阈值划分,就完成了图像的二值化。
也可以通过指针的方式来访问图像中的每个像素,将上面代码中的循环体换成以下代码,运行的结果是一样的。
for (int i = 0; i < rows; i++){uchar* data = outputImage.ptr<uchar>(i);///获取第i行的首地址for (int j = 0; j < cols; j++){if ((*(data+j)) < threshold){*(data + j) = 255;}else{*(data + j) = 0;}}}
遍历OpenCV中图像像素方法二
方法一中通过获取每行的首地址来访问每行中的每个像素。也可以直接通过二维数组的整个数组的首地址来访问每个像素,代码如下:
#include <iostream>
#include <cstring>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main()
{Mat srcImage = imread("test.jpg");Mat srcGray;cvtColor(srcImage, srcGray, COLOR_BGR2GRAY);Mat outputImage = srcGray.clone();int rows = outputImage.rows;int cols = outputImage.cols*outputImage.channels();int threshold = 50;uchar* data = outputImage.data;for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){if (data[i*cols+j] < threshold){data[i*cols + j] = 255;}else{data[i*cols + j] = 0;}}}imshow("src", srcImage);imshow("binary", outputImage);waitKey();return 0;
}
方法二中最重要的是这条语句:uchar* data = outputImage.data; Mat类中的data指针指向的就是图像数据二维数组的首地址,该方法用的是数组的方括号表示法来访问每个像素。同理,循环体中也可以换成指针的方式来访问每个像素。循环体中的代码换成指针的方式如下:
for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){if (*(data+i*cols + j) < threshold){*(data + i * cols + j) = 255;}else{*(data + i * cols + j) = 0;}}}
总结
opencv中遍历图像像素的方法有十几种,本文通过4种遍历图像像素的方式编写了一个简单的图像二值化函数,既巩固了指针和数组的知识,又掌握了遍历opencv中图像像素的方法。
相关文章:
【和春笋一起学C++】OpenCV中数组和指针运用实例
前言:前面学习了数组和指针在C中的处理原理,本文通过自己编写一个图像处理的函数实例来加深对数组和指针的理解。为什么是图像处理呢,因为图像数据是一个二维矩阵,相当于一个二维数组,前面学习了一维数组,现…...
Maya 中创建游戏角色的头发,并将其导出到 Unreal Engine 5
这段视频教程讲解了如何在 Maya 中创建游戏角色的头发,并将其导出到 Unreal Engine 5 中,重点是如何处理头发的物理模拟和材质。 作者 Andrew Giovannini 首先展示了一个已完成的带物理模拟的头发模型,并介绍了他自己的游戏行业背景。然后&a…...
React 路由(React Router):在 React 应用中管理路由
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
SAP-CPI组件Transformation介绍之Converter
1.配置CSV to XML Converter Field Description XML Schema 选择Select按钮,选择合适 XSD 文件. 或者可以选择 Upload from File System 系统中查找合适的XML文件....
Laravel 代理收益排行榜
创建了一个收入表 CREATE TABLE income_logs (id int(11) unsigned NOT NULL AUTO_INCREMENT,order_id int(11) NOT NULL COMMENT 订单ID,type int(11) NOT NULL DEFAULT 0 COMMENT 类型 0 支出 1收入,user_id int(11) NOT NULL COMMENT 消费者用户,price decimal(10,2) NOT…...
LeetCode hot100面试背诵版(自用)
点击题目可以跳转到LeetCode 哈希 两数之和 public int[] twoSum(int[] nums, int target) {int lengthnums.length;int[] ans new int[2];for (int i 0; i <length-1 ; i) {for (int j i1; j < length; j) {if(nums[i]nums[j]target){ans[0]i;ans[1]j;}}}return an…...
常见的Web安全漏洞——XSS
概念 跨站脚本攻击(XSS),指攻击者通过篡改网页,嵌入恶意脚本程序,在用户浏览网页时,控制用户浏览器进行恶意操作。 XXS的分类 反射型XSS存储型XSSDOM型XSS 原理 反射型XSS 接收用户提交的访问者的姓名࿰…...
liteflow 架构详解
LiteFlow 是一个轻量级的、高性能的流程编排框架,主要用于解决复杂业务流程的编排问题。它提供了一种简单而强大的方式来定义和执行复杂的业务流程。下面是 LiteFlow 的架构详解: 核心概念 组件(Component):是流程中…...
国产麒麟操作系统上运行LabVIEW
LabVIEW 目前并没有官方支持直接在国产麒麟操作系统(Kylin OS)上运行。LabVIEW 是由美国国家仪器公司(NI)开发的软件,主要面向 Windows 和 Linux 操作系统。麒麟操作系统虽然基于 Linux,但其内核和一些软件…...
【C语言】结构体(一)
一,是什么 结构体就是一些值的集合,这些值称为成员变量。 结构体的每个成员可以是不同类型的变量。说到集合,数组也是集合,但是不同的是数组只能是相同类型元素的集合。 二,结构体的声明 struct tag { member1;…...
C++《set与map》
在之前我们已经学习了解了CSTL当中的string和vector等容器,现在我们已经懂得了这些容器提供的接口该如何使用,并且了解了这些容器的底层结构。接下来我们在本篇当中将继续学习STL内的容器set与map,在此这两个容器与我们之前学习的容器提供的成…...
深度学习-52-AI应用实战之基于Yolo8的目标检测自动标注
文章目录 1 YOLOv81.1 YOLOV8的不同版本1.2 可检测类别1.3 数据说明1.4 网络结构1.5 算法核心步骤2 目标检测的基本原理2.1 安装yolov8(cpu版本)2.2 图片检测2.3 视频检测2.4 自动标注2.5 保存标注结果3 参考附录1 YOLOv8 YOLOv8是一种前沿的计算机视觉技术,它基于先前YOLO版…...
【Elasticsearch】05-DSL查询
1. 查询所有 es最多只支持查询1万条数据。 # 查询所有 GET /items/_search {"query": {"match_all": {}} }2. 叶子查询 全文检索 会对结果进行相关度打分。 # 检索单个字段 GET /items/_search {"query": {"match": {"name&…...
qml项目创建的区别
在Qt框架中,你可以使用不同的模板来创建应用程序。你提到的这几个项目类型主要针对的是Qt的不同模块和用户界面技术。下面我将分别解释这些项目类型的区别: 根据你提供的信息,以下是每个项目模板的详细描述和适用场景: Qt Widgets…...
.NET8/.NETCore 依赖注入:自动注入项目中所有接口和自定义类
.NET8/.NETCore 依赖接口注入:自动注入项目中所有接口和自定义类 目录 自定义依赖接口扩展类:HostExtensions AddInjectionServices方法GlobalAssemblies 全局静态类测试 自定义依赖接口 需要依赖注入的类必须实现以下接口。 C# /// <summary>…...
Flutter:city_pickers省市区三级联动
pubspec.yaml city_pickers插件地址 自己用的GetBuilder页面模板 cupertino_icons: ^1.0.8 # 省市区城市选择 city_pickers: ^1.3.0编辑地址页面:controller class AddressEditController extends GetxController {AddressEditController();Future<Result?>…...
Kafka-Connect自带示例
一、上下文 《Kafka-Connect》中已经阐述了Kafka-Connect的理论知识,为了更生动的理解它,我们今天通过官方的一个小例子来感受下它的妙用。 二、创建topic kafka-topics --create --topic connect-test --bootstrap-server cdh1:9092 --partitions 2 -…...
Hbase应用案例 随机号码生成
Hbase应用案例1 随机号码生成 在Hbase中插入如下格式的数据,数据内容随机生成 名称示例说明phonenumber158randomrowkey,号码dnum199randomcolumn,另一位通话者lengthrandomcolumn,时长valuerandomcolumn,接收或拨打…...
论文阅读——量子退火Experimental signature of programmable quantum annealing
摘要:量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明,在理想化的封闭系统条件下,量子退火可以胜过基于经典热化的算法(例如模拟退火)。当前设计的量子退火装置的退相干时间比绝热演…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)
相信实验一大家已经完成了,对Arcgis已进一步熟悉了,现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…...
使用Yolo 11进行定制化图像识别全流程
全流程预览 Label Studio标注 → 导出YOLO格式 → 编写data.yaml → 拆分数据集 → 模型训练 → 预测部署步骤工具/技术产出物数据标注Label Studio标注好的图片数据导出YOLO with imagesimages/ labels/配置文件data.yaml数据集配置数据拆分Python脚本train/val/test模型训练…...
实时数据复制技术在大数据平台中的应用与实践
实时数据复制技术在大数据平台中的应用与实践关键词:实时数据复制、大数据平台、CDC(变更数据捕获)、数据同步、数据一致性、分布式系统、ETL摘要:本文深入探讨了实时数据复制技术在大数据平台中的核心应用场景与实践方法。我们将…...
LyricsX深度解析:macOS平台终极歌词解决方案的技术实现与高级应用
LyricsX深度解析:macOS平台终极歌词解决方案的技术实现与高级应用 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的终极歌词应用,通过…...
OpenClaw日志分析:Qwen3-32B每日自动汇总服务器异常事件
OpenClaw日志分析:Qwen3-32B每日自动汇总服务器异常事件 1. 为什么需要自动化日志分析 作为一名运维工程师,我每天早晨的第一项工作就是检查服务器日志。Nginx的错误日志、系统内核日志、应用服务的异常输出……这些文件分散在不同的目录,格…...
从立创EDA到Cadence Allegro:封装转换的完整指南
1. 为什么需要封装转换? 最近在帮朋友做一个硬件项目,发现他用立创EDA设计的电路板需要转到Cadence Allegro平台生产。这就像两个说不同语言的人要合作,必须找个翻译——封装转换就是这个翻译过程。立创EDA和Allegro虽然都是PCB设计工具&…...
SD卡 vs SD NAND:SPI模式下性能对比与选型建议(含实测数据)
SD卡 vs SD NAND:SPI模式下性能对比与选型建议(含实测数据) 在智能硬件和消费电子产品的开发过程中,存储方案的选择往往成为硬件工程师面临的关键决策之一。面对市场上琳琅满目的存储器件,如何在性能、成本和可靠性之…...
打开软件就弹出D3DCompiler_47.dll错误 免费下载修复方法分享
在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...
Ai人工智能知识补充
文章目录 1.5 数据与算法基础:智能系统的“燃料”与“引擎” 1.5.1 数据工程:从原始数据到模型“燃料”的全链路 1.5.2 算法模型构建:从问题定义到模型部署的“炼金术” 1.5.3 数据隐私与安全:在价值挖掘与权利保护间走钢丝 1.6 面临的主要挑战:通往真正智能之路的险阻 1.…...
RWKV7-1.5B-g1a作品分享:多轮追问下保持主题聚焦的能力验证
RWKV7-1.5B-g1a作品分享:多轮追问下保持主题聚焦的能力验证 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型,特别适合基础问答、文案续写、简短总结和轻量中文对话场景。本次测试将重点验证该模型在多轮对话中保持主题聚焦…...
OpenClaw三种方式安装:手把手保姆级教程
前置操作 【一】获取API Key 现在很多平台的API Key都有免费额度,阿里云和Kimi的优惠力度大些,大家按需索取。 阿里云百炼 Step01:注册/登录阿里云 Step02:创建并获取API Key 注意:我们要的是API Key,如…...
