opencv Mat 函数--CheckVector
学习opencv ,我们需要对opencv的函数有点了解 ,实现什么样子的功能,以及如何实现
下面我们一次来看checkVector 这个函数,
int org.opencv.core.Mat.checkVector(int elemChannels)
elemChannels 的取值
单通道
单通道:取值== 矩阵的列数
返回结果:矩阵的行数
我们来验证一个这个理解是否正确
Mat truth = new Mat(4, 10, CvType.CV_8UC1) {{put(0, 0, 01, 02, 03, 04, 05, 06, 07, 8, 9, 0, 01, 02, 03, 04, 05, 06, 07, 8, 9, 0);put(1, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 10);put(2, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 20);put(3, 0, 31, 32, 33, 34, 35, 36, 37, 38, 39, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 30);}};System.out.println(truth.checkVector(10));
这样的一个单通道的矩阵 4*10 列数为10 elemChannel==10 ===》 truth.checkVector(10) 的结果为 4
那么我们可能会疑问 elemChannel的值可不可以为其他的值比如说:等于行数
尝试了一下:checkVector(4)===> -1
再来看这样的一个5*10的矩阵:
这个是一个5*10的一个单通道矩阵 ,checkVector(10)=5
所以单通道的矩阵 n*m checkVector(m)=n
那么对于多通道的呢,我们继续来看双通道的矩阵
双通道矩阵:
elemChannel==2
Mat truth = new Mat(20, 1, CvType.CV_8UC2); System.out.println(truth.checkVector(2));// result:20Mat truth = new Mat(1, 20, CvType.CV_8UC2); System.out.println(truth.checkVector(2));// result:20
对于双通道矩阵,m*n m和n 中必须有一个为 1的
如果m ==1 则 checkVector(2)==n
如果n ==1 则 checkVector(2)==m
否则 checkVector== -1
三通道矩阵:
elemChannel=3
Mat truth = new Mat(1, 20, CvType.CV_8UC3); System.out.println(truth.checkVector(3));// result:20Mat truth = new Mat(20, 1, CvType.CV_8UC3); System.out.println(truth.checkVector(3));// result:20
对于双通道矩阵,m*n m和n 中必须有一个为 1的
如果m ==1 则 checkVector(3)==n
如果n ==1 则 checkVector(3)==m
否则 checkVector== -1
多通道矩阵
Mat truth = new Mat(20, 1, CvType.CV_8UC(10)); System.out.println(truth.checkVector(10));// result:20Mat truth = new Mat(1, 20, CvType.CV_8UC(10)); System.out.println(truth.checkVector(10));// result:20
类似双,三通道矩阵 elemChannel 的值为通道数 并且m*n中其中一个为1
那么checkVector的值我们都知道了,opencv 设置这样的一个函数有什么作用
The official OpenCV's doc says:
cv::Mat::checkVector()
returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise
OpenCV considers some data types equivalent in case of some functions i.e. objectPoints
of cv::solvePnP()
can be:
- 1xN/Nx1 1-channel
cv::Mat
- 3xN/Nx3 3-channel
cv::Mat
std::vector<cv::Point3f>
With checkVector
you can make sure that you are passing the correct representation of your data.
大概的意思是说,在opencv中有些函数是要求参数满足一些特定的形式,比如:solvePnP
函数,checkVector 就是为了确保你传入的数据满足特定的形式
继续看:
truth.checkVector(elemChannels, depth);
elemChannel 通道元素数量
depth 深度
Mat 的深度是类型决定的,不同的类型对应不同的深度,深度反应出图像颜色像素值
深度的值:
CV_8U = 0,
CV_8S = 1,
CV_16U = 2,
CV_16S = 3,
CV_32S = 4,
CV_32F = 5,
CV_64F = 6,
CV_16F = 7;
Mat truth = new Mat(1, 20, CvType.CV_32FC2); // depth !=mat.depth() System.out.println(truth.checkVector(2,5));//result 20Mat truth = new Mat(1, 20, CvType.CV_32FC2); // depth !=mat.depth() System.out.println(truth.checkVector(2,0));//result -1
truth.checkVector(int elemChannels, int depth, boolean requireContinuous);
elemChannel 通道元素数量
depth 深度
requireContinuous 是否连续 (目前我知道的mat 经过submat 获取到的矩阵是不连续的,没有经过submat的矩阵是连续的)
通过上面的,我们可以看到的是checkVector 这个函数是为了检验mat 是否满足某些条件
int Mat::checkVector(int _elemChannels, int _depth, bool _requireContinuous) const
{return data && (depth() == _depth || _depth <= 0) &&(isContinuous() || !_requireContinuous) &&((dims == 2 && (((rows == 1 || cols == 1) && channels() == _elemChannels) ||(cols == _elemChannels && channels() == 1))) ||(dims == 3 && channels() == 1 && size.p[2] == _elemChannels && (size.p[0] == 1 || size.p[1] == 1) &&(isContinuous() || step.p[1] == step.p[2]*size.p[2])))? (int)(total()*channels()/_elemChannels) : -1;
}
我们看checkVector的源码 也是如此,如果不满足条件则返回 -1 如果满足条件则返回一个正数
上面是我对checkVector这个函数的理解
希望对你有所帮助!
opencv Mat 函数--CheckVector相关推荐
- opencv常用函数,QT中Mat与QImage的转换
一.opencv简介 opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法. ...
- matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...
- c++ opencv mat 最大值,数据类型
这个好像对的: cv::Mat image0 = cv::imread("../configs/bus.jpg", cv::IMREAD_UNCHANGED);cv::Mat ds ...
- OpenCV findContours函数参数
目录 OpenCV findContours函数参数 python检测外轮廓: c++轮廓检测: 一.mode取值"CV_RETR_EXTERNAL",method取值" ...
- OpenCV Mat 简介
OpenCV Mat 简介 Part I Mat是OpenCV最基本的数据结构,Mat即矩阵(Matrix)的缩写,Mat数据结构主要包含2部分:Header和Pointer.Header中主要包含矩 ...
- opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分
注意与cvtColor()函数的区别,cvtColor改变颜色空间,通道数也会改变,converTo只改变数据类型,不改变通道数,原来是几个通道转换后还是几个通道 示例: src.convertTo( ...
- OpenCV Mat类详解和用法(官网原文)
参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...
- OpenCV reshape函数需要注意的细节
OpenCV reshape函数需要注意的细节 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/80252853 本人在使 ...
- FFmpeg转OpenCV Mat显示
FFmpeg一般采用SDL进行显示,如果不追求复杂的界面.交互和多线程功能,当然也可以使用OpenCV的imshow()方法进行显示了,而且实现起来比SDL更简单.方法也很简单,只需要把视频帧的BGR ...
最新文章
- 你的能力代表你能走多远
- T4 (Text Template Transformation Toolkit)实现简单实体代码生成
- android aidl调用进程间服务的方法
- centos 7.0 ln命令 和chkconfig 命令介绍 开机自动启 服务
- 工作流引擎的五大接口
- SAP中的时间表达方式
- SVM支持向量机通俗导论(理解SVM的三层境界)
- HTML draggable 属性
- 别再骂中年人了,对他们好点吧~
- IntelliJ IDEA 将 Maven 构建的 Java 项目打包
- 走过电竞之路的程序员
- HorizontalScrollView入门技术
- python官网下载步骤-windows下载并安装Python的具体步骤
- java debug命令_Mame DEBUG调试命令详细指令速查大全
- 第三章作业题3--队列
- 发送广播失败 Parcelable encountered IOException writing serializable object (name =xxxx).
- eplan实战设计pdf百度云_EPLAN实战设计
- python 内建排序 HOW TO
- pytest接口自动化测试框架 | 用python代码测试接口
- 分享一款老照片修复神器