opencv_c++学习(三)

news2024/12/22 23:32:50

一、获取图像像素指针

CV Assert(mylmage.depth() == CV 8U);
CV_Assert()函数判断图像数据的类型是否为uchar类型,不满足则抛出异常。
Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
获取当前像素点P(row, col)的像素值p(row, col) =current[col]

像素范围处理
saturate_cast
saturate_cast ( -100 ),返回0
saturate_cast ( 288 ) ,返回255
saturate_cast ( 100 ) ,返回100
这个函数的功能是确保RGB值得范围在0~255之间

二、矩阵的掩膜操作

下面我们实现一个滤波器为下图的掩膜操作;
在这里插入图片描述

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;

int main12(int arge, char** argv) {
	//加载图像,使用默认加载方式
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}
	//显示原始图像
	namedWindow("demo", CV_WINDOW_AUTOSIZE);
	imshow("demo", src); 

	//显示转换后的图像
	namedWindow("UOTPUT", CV_WINDOW_AUTOSIZE);
	Mat output_image;

	//开始转换,将原始图像转为灰度图
	cvtColor(src, output_image, CV_RGB2HLS);
	imshow("UOTPUT", output_image);

	//保存图片
	imwrite("./1.tif", output_image);
	waitKey(0);
	return 0;
}

int main() {

	Mat src, det;

	//读取图片
	src = imread("图片1.png");
	if (!src.data)
	{
		printf("不能打开空图片");
		return -1;
	}

	//显示图片
	namedWindow("INPUT", CV_WINDOW_AUTOSIZE);
	imshow("INPUT", src);

	//获取高度和宽度
	int cols = (src.cols - 1) * src.channels();
	int rows = src.rows;
	int offsets = src.channels();

	//定义一个与原始图像大小一致的全零矩阵
	det = Mat::zeros(src.size(), src.type());

	for (int row = 1; row < rows - 1; row++)
	{
		//获取像素的指针
		//第一行的指针
		const uchar* previous = src.ptr<uchar>(row - 1);

		//第二行的指针
		const uchar* current = src.ptr<uchar>(row);

		//第三行的指针
		const uchar* next = src.ptr<uchar>(row + 1);

		uchar* output = det.ptr<uchar>(row);
		for (int col = offsets; col < cols; col++)
		{
			output[col] = saturate_cast <uchar>(5 * current[col] - (current[col - offsets] + current[col + offsets] + previous[col] + next[col]));
		}
	}

	//显示图片
	namedWindow("OUTPUT", CV_WINDOW_AUTOSIZE);
	imshow("OUTPUT", det);

	waitKey(0);
	return 0;
}

这里好多同学有疑问,为什么列宽为int cols = (src.cols - 1) * src.channels();,这里做一个简单的解释。
在opencv的处理中,三通道的图像矩阵如下:
在这里插入图片描述
一个像素需要多个矩阵元素来保存,矩阵中的列会包含多个子列,且子列数和通道数相等,就如上图所示。具体来说就是图像左上角的一个像素是包含三个小子列的,而这三个小子列就是我们RGB格式图片的三通道。

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

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

相关文章

【五一创作】【远程工具】- Tabby 下载、安装、使用、配置【ssh/Serial】-免安装、解压即用

目录 一、Tabby 概述 二、Tabby 下载、安装 三、Tabby 的使用  &#x1f449;3.1 使用SSH协议连接Linux开发主机  &#x1f449;3.2 使用Serial(串口)协议连接开发板 一、Tabby 概述 在远程终端工具中&#xff0c;secureCrt 和 XShell 是两款比较有名的远程工具&#xff0c;但…

shell脚本之例题详解

文章目录 1 检查用户家目录中的test.sh文件是否存在&#xff0c;并且检查是否有执行权限2 提示用户输入100米赛跑的秒数&#xff0c;要求判断秒数大于0且小于等于10秒的进入选拔赛&#xff0c;大于10秒的都淘汰&#xff0c;如果输入其它字符则提示重新输入&#xff1b;进入选拔…

Selenium:集成测试报告

目录 一、分拆后的实现代码 二、创建用于执行所有用例的ALL_HTMLtest.py文件 三、集成测试报告 随着软件不断迭代功能越来越多&#xff0c;对应的测试用例也会呈指数增长。一个实现几十个功能的项目&#xff0c;对应的用例可能有上百个甚至更多&#xff0c;如果全部集成在一…

RocketMQ中单消费者订阅多个Topic,会阻塞消费吗?

RocketMQ 问题 背景是这样&#xff1a; 最近有个项目用MQ做消息流转&#xff0c;在RocketMQ集群模式下&#xff0c;一个消费者实例&#xff0c;订阅了两个Topic A、B。 Topic A&#xff1a;存储的是批量业务消息。 Topic B&#xff1a;存储的是单个业务消息。 有个小伙伴问我…

基于C++的职工管理系统

1、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C++来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责:完成经理交给的任务 经理职责:完成…

分布式系统概念和设计-分布式文件系统服务体系结构和实践经验

分布式系统概念和设计 文件系统的特点 负责文件的组织&#xff0c;存储&#xff0c;检索&#xff0c;命名&#xff0c;共享和保护 文件包含数据和属性 数据&#xff1a;包含一系列数据项——8比特的字节&#xff0c;读写操作可访问任何一部分数据属性&#xff1a;用一个记录表…

一文详解 SCTP 协议

SCTP(Stream Control Transmission Protocol)流控制传输协议,由 RFC2960 定义。SCTP的设计目的是提供一种可靠的、面向消息的数据传输服务,以便于支持多点通信以及满足传输的可靠性需求。SCTP 目前广泛应用于VoIP、移动通信和云计算等领域。 SCTP 主要特点SCTP 消息结构SCTP …

Android9.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在9.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…

应用层开发想转Android framework开发要从何开始

前言 现如今&#xff0c;由于市面上应用App的更新逐渐变少&#xff0c;很多Android移动应用开发者都开始转型做系统开发&#xff0c;这比开发应用有趣多了&#xff0c;因为你可以探索系统模块的运行原理&#xff0c;从框架层面去了解它。 在应用层&#xff0c;你只需要配置好…

JAVA-异常

文章目录 1.异常的体系1.3异常的分类 2.异常的处理2.2异常的抛出throw2.3异常的捕获2.3.1异常声明throws2.3.2 try-catch捕获并处理2.3.3 finally 2.4 异常的处理流程 3.自定义异常类 1.异常的体系 Throwable&#xff1a;是异常体系的顶层类&#xff0c;其派生出两个重要的子类…

前端框架篇学习--选择命令式还是声明式

命令式与声明式定义 大白话&#xff1a;假期回家了&#xff0c;我想吃老妈的大盘鸡&#xff0c;然后老妈就去采购食材&#xff0c;剁鸡块&#xff0c;卤鸡肉&#xff0c;切土豆&#xff0c;然后爆炒起来&#xff0c;想方设法给我做好吃的大盘鸡。老妈上菜的餐桌&#xff0c;我…

SQL语句学习笔记(对库、表、字段、的操作)

查看mysql的状态 status 启动、停止 mySQL服务 图像界面方法&#xff1a; dos窗口执行&#xff1a;services.msc 控制面板–>管理工具–>服务 命令行方法&#xff1a; 启动&#xff1a; net start mysql80 停止&#xff1a; net stop mysql80 启动与环境变量 添加环境…

UnityShaderBook中消融dissolve详解

消融这个效果算得上游戏开发中用的比较多的一个效果&#xff0c;表现游戏对象消失的时候经常用到&#xff0c;这个效果实现也非常简单&#xff0c;因此在《UnityShader入门精要》中也就短短几句话讲完了&#xff0c;这里我想针对书中的效果详细讲解一下。 Shader源代码&#x…

(浙大陈越版)数据结构 第二章 线性结构 2.2 堆栈

目录 2.2.1 什么是堆栈 堆栈 什么是堆栈 例子&#xff1a;计算机如何进行表达式求值&#xff1f;如&#xff1a;56/2-3*4 后缀表达式 堆栈的抽象数据类型描述 2.2.2 堆栈的顺序存储实现 例子&#xff1a;用一个数组实现两个堆栈&#xff0c;要求能最大利用数组空间&…

路径之谜(DFS)-2016年蓝桥杯国赛

路径之谜-2016年国赛 1、题目描述2、解题思路3、代码实现1、题目描述 小明冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn* 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能…

【Java虚拟机】JVM常见诊断命令和调试工具

1.JVM常用命令行参数jps和jinfo实操 准备测试代码 /*** author lixiang* date 2023/5/4 20:53*/ public class JVMTest {public static void main(String[] args) throws InterruptedException {Thread.sleep(1000000);} }&#xff08;1&#xff09;命令jps&#xff1a;全称 …

【exgcd】牛客练习赛 D-青蛙兔子的约会

D-青蛙兔子的约会_牛客练习赛111 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 感觉和那个青蛙的约会比较像 就是列了个方程&#xff1a; a*xb*yn 考虑用exgcd解方程 然后看x在[L,R]有没有解 做法就是先把x的最小整数解求出来&#xff0c;然后考虑它的通解 xx0b/…

2023年五一数学建模 B 题过程与结果

文章目录 第一问第二问数据时序分析Auto-ARIMA第二问求解解的情况A->Q:D-> AQ-V总快递数 第三问第四问遗传算法求解 第五问SARIMA 模型拟合季节性规律 第一问 见 2023 年 五一杯 B 题过程 代码&#xff08;第一问&#xff09; 第二问 第二问考虑是一个时序预测问题&a…

图像生成论文阅读:Latent Diffusion算法笔记

标题&#xff1a;High-Resolution Image Synthesis with Latent Diffusion Models 会议&#xff1a;CVPR2022 论文地址&#xff1a;https://ieeexplore.ieee.org/document/9878449/ 官方代码&#xff1a;https://github.com/CompVis/latent-diffusion 作者单位&#xff1a;慕尼…

数字乡村建设与示范项目可行性研究报告(word可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 5.1 “三平台”&#xff1a;建设支撑农业发展农村治理惠民服务的三大应用平 台 5.3.1 建设智慧农业综合服务平台 夯实数字农业基础&#xff0c;推进重要农产品全产业链大数据…