学习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相关推荐

  1. opencv常用函数,QT中Mat与QImage的转换

    一.opencv简介 opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法. ...

  2. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同

    为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...

  3. c++ opencv mat 最大值,数据类型

    这个好像对的: cv::Mat image0 = cv::imread("../configs/bus.jpg", cv::IMREAD_UNCHANGED);cv::Mat ds ...

  4. OpenCV findContours函数参数

    目录 OpenCV findContours函数参数 python检测外轮廓: c++轮廓检测: 一.mode取值"CV_RETR_EXTERNAL",method取值" ...

  5. OpenCV Mat 简介

    OpenCV Mat 简介 Part I Mat是OpenCV最基本的数据结构,Mat即矩阵(Matrix)的缩写,Mat数据结构主要包含2部分:Header和Pointer.Header中主要包含矩 ...

  6. opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分

    注意与cvtColor()函数的区别,cvtColor改变颜色空间,通道数也会改变,converTo只改变数据类型,不改变通道数,原来是几个通道转换后还是几个通道 示例: src.convertTo( ...

  7. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  8. OpenCV reshape函数需要注意的细节

    OpenCV reshape函数需要注意的细节 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/80252853 本人在使 ...

  9. FFmpeg转OpenCV Mat显示

    FFmpeg一般采用SDL进行显示,如果不追求复杂的界面.交互和多线程功能,当然也可以使用OpenCV的imshow()方法进行显示了,而且实现起来比SDL更简单.方法也很简单,只需要把视频帧的BGR ...

最新文章

  1. 你的能力代表你能走多远
  2. T4 (Text Template Transformation Toolkit)实现简单实体代码生成
  3. android aidl调用进程间服务的方法
  4. centos 7.0 ln命令 和chkconfig 命令介绍 开机自动启 服务
  5. 工作流引擎的五大接口
  6. SAP中的时间表达方式
  7. SVM支持向量机通俗导论(理解SVM的三层境界)
  8. HTML draggable 属性
  9. 别再骂中年人了,对他们好点吧~
  10. IntelliJ IDEA 将 Maven 构建的 Java 项目打包
  11. 走过电竞之路的程序员
  12. HorizontalScrollView入门技术
  13. python官网下载步骤-windows下载并安装Python的具体步骤
  14. java debug命令_Mame DEBUG调试命令详细指令速查大全
  15. 第三章作业题3--队列
  16. 发送广播失败 Parcelable encountered IOException writing serializable object (name =xxxx).
  17. eplan实战设计pdf百度云_EPLAN实战设计
  18. python 内建排序 HOW TO
  19. pytest接口自动化测试框架 | 用python代码测试接口
  20. 分享一款老照片修复神器

热门文章

  1. DevExpress控件使用系列--ASPxUploadControl(图片上传及预览)
  2. SCOM发送邮件通知
  3. java Servlet学习笔记
  4. 发现了lucene一个bug
  5. leangoo思维导图工具
  6. 网关拓扑结构与功能设计归纳
  7. 低代码、无代码?深度解读硅谷新趋势(上)
  8. 当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮
  9. 【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
  10. 每日一技|巧用 Telnet 调试 Dubbo 服务