Learning OpenCV(0)——关于cvPtr*D系列

c#与opencv Mat交互总结 这里有两种方案,第一种方案是采用OpencvCSharp,最后OpencvCSharp.Mat.CvPtr即是Mat **img 接下来可以采用C#调用c++ dll的方法实现交互 第二种方案即将OpencvCSharp 的转换方法提取出来,Mat对应的C#中的就是一个Intptr; 以下是C#的核心Src: public static Bitmap GetBitmapfromImgptr(IntPtr imgptr) { int w = 0; int h = 0; int 阅读详情

最近在看Learning OpenCV,刚看到第三章的Accessing Data in Your Matrix就卡住了,惭愧啊。查找了很多资料终于弄明白了。

 

首先介绍一下cvPtr*D系列函数,它们都是用来获取CvMat矩阵中指定索引值的数据的。查了一下OpenCV安装目录下的手册,居然发现所有cvPtr*D函数的返回值都是uchar*!这就奇怪了,CvMat矩阵是可以存储多种数据结构的,怎么可能用uchar*一个类型就代表了呢?于是接着查了一下CvMat的定义,如下:

发现它所有的数据都定义在一个union结构中。本人一直都是搞C++的,没怎么接触过union结构,而OpenCV大部分是用c写的,没想到居然使用union,没办法,还是先学习下union到底是干什么的吧。

长话短说,经过查阅一些资料,我发现:其实union和struct很像,区别在于,union中一旦给某个成员初始化,那么只有这一个成员是合法的,可以被外部访问,而其他的成员就会被替换掉,成为未定义状态;而struct是可以给每个成员赋值而不会相互影响的。显然,OpenCV正是利用这一机制灵活的实现了对各种数据类型的支持。

在CvMat中,data的第一个成员就是uchar* ptr,那么,只要得到这个ptr,我们就得到了指向data的第一个字节的指针,接着只要使用强制类型转换即可得到指向相应类型的数据指针了。下面的程序很好的演示了这一点:


同时还可以看出,对于mat3,尽管它是多通道矩阵,但仍然是一个4×1的二维矩阵,所以依然要使用cvPtr2D,但此时返回的是一个指向包含3个float类型元素的数组指针,为了得到各个通道的元素,还要对这个数组指针进行遍历。
其实,说了这么多,最主要的是要对union结构有较深刻的认识,那这个问题就迎刃而解了!^_^

OpenCV中Ptr<>的应用的几点问题 要弄懂Ptr 智能指针 智能指针的概念可以搜索别的文章,这里Ptr Smart pointer to dynamically allocated objects.   This is template pointer-wrapping class that stores the associated reference counter along with the   objec 阅读详情

相关推荐

C#中的IntPtr

C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 例如,我们可以在vs2008中用C#做基于OpenCV的图像处理开发,下面两行代码就可以完成打开一幅图像的操作。 IntPtr img = CvInvoke.cvLoadImage(openFileDialog.FileName, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_UNCHANGED); CvInvoke.cvShowImage("打开图片", img);

opencv基本数据类型

  目录 1.点的表示:Point_   Point3_ 2.尺寸的表示:Size_ 3.Vec类:描述多通道Mat的像素 4.Matx:已知尺寸的小Mat模板类 5.颜色类Scalar: 6.Rect:矩形表示类 7.Range类 8.cv::Ptr指针模板 1.点的表示:Point_   Point3_ opencv中Point_的定义(Point3_基本相同): ...

u012507022的博客 2001

风控IV、AUC、KS python计算代码

df_temp:数据集,Y:是否逾期标签,feas_list:需要计算IV的 变量。2、 按月和不同Y 下的 IV计算。

暮雨听轩的专栏 1618

OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形

练习:创建一个1000*1000的三通道图像,将其元素所有置0。以(200,50)和(400,200)为顶点绘制一个绿色平面 我们能够用两种方法来实现这一功能,一个是使用cvPtr2D,可是因为使用了函数,会使程序的效率变低。合适的方法是使用指针直接改变色素的值。   方法一:使用cvPtr2D CvPtr2D可以依据參数中的行和列读取该位置的元素。可是该元素包括三个指针,分别控制...

weixin_34380781的博客 212

SQL 通过sum() over(order by ,rownum)实现财务现金日记账实例

SELECT 类型,to_char(发生日期,'yyyy-MM-dd') 发生日期,期初余额,借方金额,贷方金额, (CASE WHEN 借方金额>0 THEN '借' WHEN 贷方金额>0 THEN '贷' ELSE '平' END) 方向, sum(收支金额) over(order by 发生日期, rownum) 余额 FROM( SELECT LX 类型,账户,账号,摘要,发生日期,单据ID, ...

qq_41451794的博客 1022

FPGA图像处理之直方图均衡实现

直方图均衡的基本原理,就是对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行拉伸,而对像素个数较少的灰度值(即对画面不起主要作用的灰度值)进行合并,从而提高对比度,使图像清晰,达到增强的目的。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

FZWzsl的博客 1428

OpenCV学习笔记(一)

OpenCV简介本篇属于翻译类的学习笔记,督促现在的自己学习之用,也供以后回头再看。OpenCV (Open Source Computer Vision Library: http://opencv.org) 是一个BSD开源许可协议下的库,它包含了成千上万的计算机视觉算法。OpenCV是模块化结构,这意味着这个库包含了几个共享或者静态子库。以下的库在OpenCV中: Core functiona

啊呜兮兮的博客 763

【实战指南】利用CAN适配器高效调试CAN总线通信

本文提供了一份利用CAN适配器高效调试CAN总线通信的实战指南。文章从硬件连接、终端电阻配置、软件参数设置等基础环节入手,详细解析了CAN适配器作为关键调试工具的工作原理与使用方法,并针对常见的通信故障提供了系统化的问题排查思路,帮助工程师快速打通通信链路,提升调试效率。

weixin_28285943的博客 412

使用函数CVPTR2D()将指针指向中间的通道(“绿色”)

看到网上很多人使用 CvMat * Mdata; Mdata= cvCreateMat(100,100,CV_8UC3); //将矩阵数据赋值为0; cvZero(Mdata); //pData指针指向中间通道 uchar * pData = cvPtr2D(Mdata,1,0,NULL); 这个程序段来访问图像的中间通道。不解cvPt...

witsky2008的专栏 479

智能 Agent 跨模态决策机制实战:多源数据融合与感知驱动行为策略设计

随着智能 Agent 应用从结构化文本处理拓展至图像识别、语音交互、传感器响应等多模态环境,其决策机制也面临从单模态语言理解向“多源感知驱动行为选择”的系统跃迁。本文聚焦跨模态输入下的 Agent 决策体系,系统性解析多源数据建模、感知融合方式、模态对齐机制、输入权重控制策略与策略引擎适配路径,进一步结合多模态提示构建、模态感知异常检测、模态优先级路由调度等工程问题进行实战拆解。通过企业级智能客服、制造车间控制、智慧医疗助手等典型案例,本文提供面向真实场景的跨模态 Agent 架构与多输入决策融合方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1353

AI产品经理面试宝典第94天:RAG知识库构建与预处理策略面试指南

本文深入解析RAG知识库构建的核心挑战与预处理策略,涵盖文档格式转换、问答对生成及自动化测试全流程,为AI产品经理提供面试必备的实战方法论与避坑指南,助你精准应对技术深度类问题。

打造全国最全的AI Agent开发知识领域的博客 312

SLAM小白日记——OpenCV特征提取与匹配

1.定义特征提取器和描述子提取器: cv::Ptr<cv::FeatureDetector> detector; cv::Ptr<cv::DescriptorExtractor> descriptor; 2.设置提取器的类型(ORB\SIFT\SURF) detector=cv::FeatureDetector::create("ORB"); // 如果使用 sift, surf ,之前要初始化nonfree模块 // cv::initModule_nonfree(); // _d

weixin_45626706的博客 531

制作3D地形图的方法-使用GlobalMapper和3ds Max软件

打开GlobalMapper软件,在菜单栏中选择“文件”>“打开数据文件”,然后选择相应的高程数据文件。在菜单栏中选择“渲染”>“渲染设置”,根据需要进行设置,如分辨率和输出格式。选择地形对象,点击菜单栏中的“渲染”>“材质编辑器”,然后根据需要调整材质属性,如颜色、纹理和光照等。在菜单栏中选择“工具”>“高程栅格和网格”>“创建地形网格”。在菜单栏中选择“文件”>“导出”>“导出栅格格式”。打开3ds Max软件,在菜单栏中选择“文件”>“导入”,然后选择之前导出的地形数据文件。步骤3:导出地形网格。

JqlScala的博客 1535

OpenCV中矩阵数据的访问(一)(Learning OpenCV第三章2)

<br />在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式。以下先讲容易的方式和困难的方式。<br />容易的方式<br />最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵的指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素,例如:<br />CvMat* mat = cvCreateMat(5,5,CV_32FC1);<br />float element = CV_MAT_ELEM(*m

1563

量化之趋势跟踪策略

趋势跟踪策略 import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns from finance import GetData import warnings; warnings.filterwarnings('ignore') data = GetData.get_data('../data/002236.csv') .

木头大左的博客 2533

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Learning Opencv第二章(2)

1.矩阵数据的存取     (1)简单的方法:             利用宏CV_MAT_ELEM()传入四个参数,矩阵、数据类型、列号、行号,返回一个指定的元素。                 CvMat* mat = cvCreateMat( 5, 5, CV_32FC1 );                 float element_3_2 = CV_MAT_ELEM( *ma

流水落花的专栏 657

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

opencv3.0中的cv::Mat类学习日记(at函数以及ptr函数,cv::Mat迭代器访问数组)

上一章介绍了如何创建cv::Mat类的数组,学习了cv::Mat的成员函数,构造函数,复制构造函数,模板函数以及静态构造函数来创建图像数组的方法。 想一想,我们已经构造好了数组并且填充了我们想要的图像数据,但是我们如何访问这些数组里面的数据呢? 别担心,天无绝人之路,正所谓车到山前必有路嘛,opencv大佬们早就想好了如何应对这一难题,这不整出了成员函数at<>()和ptr<&g...

weixin_43664952的博客 2667

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《Learning OpenCV3》——第三章 OpenCV3 数据类型

第三章 OpenCV3 数据类型 第三章 OpenCV3 数据类型 一基本数据类型 1 cvVec 2 cvMatx 3 cvPoint 4 cvScalar 5 cvSize 6 cvRect 7 cvRotatedRect 8 cvComplex 二帮助类 1 cvTermCriteria class 2 cvRange class 3 cvPtr 模板和垃圾回收 3 cvExce...

一步的专栏 4650

Opencv学习笔记(2)——辅助对象

Opencv学习笔记——辅助对象

qq_43626274的博客 552

OpenCV Mat数据类型指针ptr的使用

常用形式:mat.ptr&lt;type&gt;(row)[col]对于Mat的ptr函数,返回的是&lt;&gt;中的模板类型指针,指向的是()中的第row行的起点通常&lt;&gt;中的类型和Mat的元素类型应该一致然后再用该指针去访问对应col列位置的元素以下转载自:https://blog.youkuaiyun.com/github_35160620/article/details/51708659单...

kupar的博客 1万+

openCV的.ptr智能指针的简单使用

cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600 uchar * data00 = image.ptr<uchar>(0); uchar * data10 = image.ptr<uchar>(1); uchar * data01 = image.ptr<uchar>(0)[1];解释:定义了一个Mat变量imag

CV_YOU的博客 6146

OpenCV-利用cvPtr2D存取矩阵元素和用cvGetReal2D取矩阵元素

1:代码如下: #include "stdafx.h" #include "highgui.h" #include "cv.h" #include "iostream" using namespace std; void PrintMat2(CvMat*target, char * name)//第一个参数为cvMat矩阵指针,第二个参数为输出的矩阵的名字 { printf("%s:\n

一串字符串 2950
下一篇: CvMat学习(1)
flybywind
博客等级 码龄19年 18粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值