学习OpenCV(二)

Opencv之<Vec3b>是什么东东 一、What is vector?        vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含:                 首先在程序开头处加上#include以包含所需要的类文件vector,还有一定要加上using name 阅读详情
/*
*本程序是学会使用:1、用下标访问像素,2、使用迭代器访问像素 , 3、使用指针访问像素
*4、把图像写入磁盘
*
*
*/

#include "highgui.h"

//访问元素用下标
void salt(cv::Mat &img , int n)
{
	for(int k = 0 ; k < n ; ++ k)
	{
		int i = rand() % img.cols ;
		int j = rand() % img.rows ;
		if(1 == img.channels())
		{
			img.at<uchar>(j , i) = 255 ;
		}
		else if(3 == img.channels())
		{
			img.at<cv::Vec3b>(j , i)[0] = 255 ;
			img.at<cv::Vec3b>(j , i)[1] = 255 ;
			img.at<cv::Vec3b>(j , i)[2] = 255 ;
		}
	}
	//扩展:
	//cv::Mat_<uchar> im1 = img ;
	//im1(50 , 100) = 0 ;//对于已经知道返回类型时 可以这样访问元素
}

//减少图像颜色数
void colorReduce(cv::Mat &img , int div = 64)
{
	int rowsNum = img.rows ;
	int closPiexlNum = img.cols * img.channels() ;

	for(int i = 0 ; i < rowsNum ; ++ i)
	{
		uchar *data = img.ptr<uchar>(i) ;
		for(int j = 0 ; j < closPiexlNum ; ++ j)
		{
			data[j] = data[j] / div * div + div / 2 ;
		}
	}
}


void colorReduce3(cv::Mat img , cv::Mat &result , int div = 64)
{
	result.create(img.rows , img.cols , img.type()) ;

	int rowsNum = img.rows ;
	int closPiexlNum = img.cols * img.channels() ;

	for(int i = 0 ; i < rowsNum ; ++ i)
	{
		uchar *data_in = img.ptr<uchar>(i) ;
		uchar *data_out = result.ptr<uchar>(i) ;
		for(int j = 0 ; j < closPiexlNum ; ++ j)
		{
			data_out[j] = data_in[j] / div * div + div / 2 ;
		}
	}
}

void colorReduce4(cv::Mat img , cv::Mat &result , int div = 64)
{
	//result.create(img.rows , img.cols , img.type()) ;
	result = img.clone() ;
	//注意两种迭代器的定义方法
	cv::MatIterator_<cv::Vec3b>   itStart = result.begin<cv::Vec3b>() ;
	cv::Mat_<cv::Vec3b>::iterator itEnd = result.end<cv::Vec3b>() ;

	while(itStart != itEnd)
	{
		(*itStart)[0] = (*itStart)[0] / div * div + div / 2 ;
		(*itStart)[1] = (*itStart)[1] / div * div + div / 2 ;
		(*itStart)[2] = (*itStart)[2] / div * div + div / 2 ;
		itStart ++ ;
	}
	//Const迭代器两种定义方法
	//cv::MatConstIterator_<cv::Vec3b> it ;
	//cv::Mat_<cv::Vec3b>::const_iterator it ;
}

void colorReduce5(cv::Mat img , cv::Mat &result , int div = 64)
{
	result = img.clone() ;

	int rNum = result.rows ;
	int cNum = result.cols ;

	if(result.isContinuous())
	{
		cNum *= rNum ;
		rNum = 1 ;
	}

	int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0)) ;
	uchar mask = 0xFF << n ;

	for(int i = 0 ; i < rNum ; ++ i)
	{
		uchar *data = result.ptr<uchar>(i) ;
		for(int j = 0 ; j < cNum ; ++ j)
		{
			*data++ = *data & mask + div / 2 ;
			*data++ = *data & mask + div / 2 ;
			*data++ = *data & mask + div / 2 ;
		}
	}
}

void colorReduce6(cv::Mat img , cv::Mat &result , int div = 64)
{
	int n = static_cast<int>(log(static_cast<double>(div)) / log(2.0)) ;
	uchar mask = 0xFF << n ;

	result = (img & cv::Scalar(mask , mask , mask) 
		      + cv::Scalar(div / 2 , div / 2 , div / 2)) ;
}

int main()
{
	cv::Mat img ;
	img = cv::imread("D:/Development/OpenCV/images/boldt.jpg") ; 

	cv::namedWindow("Original") ;
	cv::imshow("Original" , img) ;

	//salt(img , 3000) ;
	
	//colorReduce(img , 64) ;

	//cv::Mat imgClone = img.clone() ;

	cv::Mat result ;
	//colorReduce3(img , result) ;//使用指针
	//colorReduce4(img , result) ;//使用迭代器
	//colorReduce5(img , result) ;//使用位运算
	colorReduce6(img , result) ;//简洁的写法

	cv::namedWindow("Result") ;
	cv::imshow("Result" , result) ;

	//cv::imwrite("result.jpg" , img) ;//把图像写在磁盘上
	cv::waitKey() ;

	return 0 ;
}

新手学习opencv二:c++下openvc安装 opencv安装详细说明  win7平台,vs2010,opencv2.4.9,我的opencv安装路径: 1.环境变量D:\opencv\build\x86\vc10\bin(注意配置完环境变量,记得关机或注销一下,最好重启, 这点也是大家配置好,但是Opencv有些库不能用的原因) 2.包含目录和库目录 包含目录: D:\opencv\build 阅读详情

相关推荐

深入解析XTEA加密算法的核心机制与优化策略

本文深入解析XTEA加密算法的核心机制与优化策略,详细介绍了XTEA在嵌入式系统和资源受限环境中的优势,包括其高效的加解密速度和低资源消耗。文章还探讨了XTEA的轮函数设计、关键参数优化策略以及实战应用中的性能对比,为开发者提供了安全增强方案和优化技巧。

k8l9m0n的博客 243

数字图像处理OpenCV——实验一 熟悉OpenCV环境和基本操作

实验一 熟悉OpenCV环境和基本操作 熟悉OpenCV运行环境,了解图像的基本操作及直方图均衡化。 利用OpenCV产生一幅图像,尺寸为200*240,三通道,其中某一块为红色,其它皆为黑色,示例图如下。 对一副图像进行直方图均衡化处理。要求自行编写直方图均衡化函数,实现图像灰度均衡的算法步骤如下: (1) 统计直方图数组,用一个数组p记录p[i]; (2) i从1开始,令S[i]=S[i-1]+p[i],S[0]=p[0]; (3) 一个数组L记录新的S索引值,即令L[i]=S[i]*(256-1);

加载中....... 2916

WRF-CHEM 新手向实践(四):化学初始/边界场及namelist设置

这是这个系列的最后一节了,这些经验是自己作为一个半路出家的外行一步步摸索出来的,其中不免有很多理解不到位的地方,但也正是如此,我相信这是目前新手入门wrf-chem最友好的教程之一,希望能对大家有实质性的帮助。本节继续未完成的内容。在mozbc生成化学初始和边界条件之前,还需要先在wrfinput文件中开启化学部分。

qq_42335815的博客 4638

图像插值算法之双三次插值

数学原理 假设源图像A大小为m*n,缩放后的目标图像B的大小为M*N。那么根据比例我们可以得到B(X,Y)在A上的的  对应坐标为A(x,y)=A(X*(m/M),Y*(n/N))。在双线性插值法中,我们选取A(x,y)的最近四个点。而在双立方  插值法中,我们选取的是最近的16个像素点作为计算目标图像B(X,Y)处像素值的参数。如图所示: 如图所示P点就是目标图像

linqianbi的博客 1万+

STM32在六轴机械臂实时控制中的选型与分层架构设计

嵌入式实时控制系统中,微控制器的选型直接决定运动控制精度与系统可靠性。其核心在于匹配确定性中断响应、低延迟外设协同与工业协议栈支持等硬性指标。STM32凭借Cortex-M内核的NVIC调度能力、成熟HAL库及CAN FD/高级定时器等专用外设,在机电一体化场景中成为伺服控制中枢的首选。相比ESP32等通用MCU,STM32在硬实时性、EMC认证生态和工业总线兼容性上具备不可替代优势。本文围绕GTB六轴机械臂项目,详解基于STM32F407的硬件抽象层配置、FreeRTOS任务调度、事件队列解耦及闭环控制数

jupi8的博客 756

45 - Android系统源码-crosvm 实战:基于 KVM 的 Rust 安全虚拟机监控器核心技术

摘要:crosvm 是 Google 开发的基于 KVM 的轻量级虚拟机监控器(VMM),采用 Rust 语言编写,专为 ChromeOS 和 Android 设计。其核心特点包括: 安全架构:通过 Rust 的内存安全特性和多进程隔离(每个设备运行在独立沙箱进程)大幅降低攻击面 性能优化:基于 KVM 的硬件虚拟化支持,结合异步 I/O (io_uring/epoll) 实现高效设备模拟 模块化设计:清晰的 trait 抽象层(Hypervisor/Vm/Vcpu)支持跨平台扩展 Android 集成

保持专注,保持热爱 226

OpenCV学习笔记(1)——操作像素

一、存取像素 如果图像是单通道的

夏天的风 4290

UE5接入在线直播视频源,如hls(m3u8)格式

UE5接入在线直播视频源

专注GIS开发 9507

opencv像素基本操作及图像遍历at

矩阵元素的表达: 对于单通道图像,其元素类型一般为 8U (即 8位无符号整数),当然也可以 是 16S 、32F32F 等;这些类型可以直接用 uchar 、short 、float等 C/C++语言中的基本数据类型表达。 如果多通道图像,如RGB彩色图像,需要用三个通道来表示。在这种情况 下,如果依然将图像视作一个二维矩阵那么矩阵的元素不再是基本数据类型。 opencv中使用vec可表示

当你努力到把自己都感动的时候,你离成功就不远了。 1万+

CATIA文件的网页预览方案

CATIA是工业设计中广泛使用的专业软件,产出`.CATPart`或 `.CATProduct`等文件类型,当资产数量较大时,我们希望快捷预览这些文件,就有了`CATPart`文件网页预览的需求 但我们知道,网页上无法直接渲染`CATPart`这种复杂的文件, CATIA生成的文件(如 `CATPart` 和 `CATProduct`)不仅包含三维几何信息(例如点、线和曲面),还涵盖了丰富的元数据与专业设计特征。 那有没有办法,能实现CATIA文件在网页上的便捷预览?

weixin_44211633的博客 1452

用一张分析型 CDS Query 看清争议案件新增与结案节奏:C_OpenClosedDisputeCase 深度解读

应收账款争议管理中的关键CDS视图分析 摘要:C_OpenClosedDisputeCase是SAP系统中用于监控应收账款争议案件的重要CDS视图,提供三个时间窗口(当日、近5天、当月)的新增与结案数据。该视图通过"创建vs解决"的净变化指标,帮助财务团队实时掌握争议管理趋势,特别适用于多币种跨国企业的现金流管理。其核心价值在于将争议管理从被动"救火"转变为可量化运营,通过统一汇率换算和关键日期参数,为管理层提供标准化的运营仪表盘。视图采用特权访问模式,需通过上层应用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 123

opencv学习二值分析

第一种T(x,y)结果是在(x,y)的邻域blockSize×blockSize范围内所有灰度值的均值减去C�;第二种首先,生成一个大小为blockSize×blockSize的高斯核,作为权重;其次,利用高斯核与(x,y)邻域范围内灰度值,进行加权求和,再减去C,得到T(x,y);高斯核:符合高斯分布,距离越近权重越大。

qq_52758467的博客 1163

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OPENCV学习指南——二值分析(一)

通过对找到的轮廓进行面积、周长、质心等几何特征的计算,可以深入了解图像中物体的大小、形状和位置信息。例如,面积可以反映物体的大小,周长能体现物体边界的长度,质心则代表物体的中心位置。这些方法在减少数据量的同时,能保留物体的关键形状信息,提高后续处理的效率,并且使形状分析更加方便。轮廓分析结合连通组件标记、轮廓发现、测量、拟合与逼近等方法,对图像中的物体进行形状、方向、是否包含孔洞等方面的分析。轮廓分析是对图像中物体进行全面、深入分析的过程,综合运用前面的各种技术,获取物体更丰富的信息。

m0_74128723的博客 964

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OPENCV学习指南——二值图像操作

二值图像在图像处理领域是一种较为基础却极为关键的图像类型。其显著特征是每个像素仅存在两种可能的取值,在大多数情形下,用 0 来代表黑色,用 255 代表白色。这种简单的像素取值模式使得二值图像在数据存储和处理上相对简便。由于二值图像的简洁性,它在诸多实际应用场景中发挥着重要作用。例如在文字识别领域,将文字图像转换为二值图像,能够清晰地凸显文字的轮廓和笔画,极大地提升识别的准确性和效率;在物体检测中,二值图像可以精准地划分出物体与背景的界限,有助于准确检测出目标物体;

m0_74128723的博客 819

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OpenCV学习(二)-二维、三维识别

摘要:OpenCV是强大的计算机视觉库,支持二维和三维图像处理。二维处理包括图像分类(使用ResNet等模型)、对象检测(YOLO/SSD)和特征提取(SIFT/ORB)。三维处理需结合Open3D等库,支持点云可视化、三维重建和特征提取(如法线估计)。OpenCV适合二维任务,而三维处理需要额外工具扩展功能。

在全栈和前端徘徊的程序员 941

opencv学习笔记二

opencv学习笔记二 1.前言:关于学习opencv可以自己去找cv的官方文档去学习。如果有不懂的建议大家去看相关的视频,我之前也是从B站上学习看的opencv但对于我项目的开发有一定的帮助,但有些东西并不是太清楚,建议直接去看cv官方的文档,cv有c++,java,python三种接口,但是也同时也有c的接口。 2.库 我觉得先得弄懂库和头文件的引用,每个库是干嘛的得先清楚。 #include < opencv2 / core.hpp > //这是核心库用来定义Mat对象定义了图书馆的基本结

waoshiwerr的博客 479

OpenCV学习笔记(二)——OpenCV简介

本文主要介绍了OpenCV中图像的定义、图像的基本知识以及OpenCV的发展历史、OpenCV主要应用场景以及OpenCV的主要核心模块

qq_54186956的博客 948

opencv学习二

接着Mat类的学习继续搬砖(三篇很不错的译文),下面是构造函数的介绍: Mat::~Mat Mat的析构函数。 C++: Mat::~Mat() 析构函数调用Mat::release()。 Mat::operator = 提供矩阵赋值操作。 C++: Mat& Mat::operator=(const Mat& m) C++: Mat& Mat::operator=(const

深藏功与名 4076

opencv学习二——improc

1.平滑 减少图像的噪声或失真。 滤波处理分为两大类:线性滤波和非线性滤波。OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法。 线性滤波:方框滤波、均值滤波、高斯滤波 非线性滤波:中值滤波、双边滤波 首先,线性滤波算法必须知道的概念叫做邻域算子,是指利用一张图片中给点的像素点的周围的像素值决定该给定点的像素的一种算子,opencv中经常用来做图像的模糊或者是锐化,例如,邻域...

weixin_41940752的博客 757

【OpenCV】Mango的OpenCV学习笔记【二】

本文主要参考自 OpenCV官方文档 一、图像的基本操作 访问、修改像素值 import cv2 img = cv2.imread('../../Resources/messi15.jpg') px = img[100, 100] print(px) # 仅访问单一通道像素值 blue = img[100, 100, 0] print(blue) # 修改像素值 img[100, 100] = [255, 255, 255] print(img[100, 100]) # 更好的像素访问和编辑.

MangoloD的博客 338

【OpenCV学习笔记】二、OpenCV例程赏析

这一节的主要内容是OpenCV的实例程序赏析。 一、部分说明 这里是简单交待一下当用命令行运行时,main函数参数的含义,int型argc为参数个数,char*类型数组argv中保存参数。 二、OpenCV自带例程赏析 1.绘图例程,生成exe文件直接运行 2.边缘检测例程 命令行运行:E:\mylearn\OpencvPractise\OpencvLearn\Debug>...

Climber的博客 1618

opencv 基础学习二

1. 绘制中文 2. 鼠标事件 3. 滑动条 4. 拆分合并通道 5. 图像运算 6.图像融合 7. 图像位运算 8. HSV颜色空间 9.图像集合变换 10.透视变换

jenny88889999的博客 272

Opencv学习笔记——利用二值图像画简单轮廓

通过opencv自带的cvFindContours函数可以但简单的

acm2014的专栏 2196

OpenCV学习笔记【二】

一、改变图像的大小方法1:使用CvPyrDown()、CvPyrUp() CvPyrDown()可以实现对图像进行缩放(长、宽分别变成原来的1/2),采用Gaussian金字塔分解法是实现,通过拒绝掉偶数行、列得到。 向下采样导致图像放大,导致模糊。 CvPyrUp()可以实现对图像的放大(长、宽分别变成原来的2倍),同样采用的是Gaussian金字塔的方法,通过填充0偶数行、列,之后再进行插

Trouble_provider的博客 622
上一篇: 学习OpenCV(一)
下一篇: 学习OpenCV(三)
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值