首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

确定 OpenCV 矩阵元素的数据类型

  • 23-09-26 04:21
  • 4036
  • 9063
blog.csdn.net

转自:http://www.jianshu.com/p/204f292937bb


在以下两个场景中使用 OpenCV 时,我们必须事先知道矩阵元素的数据类型:

  • 使用 at 方法访问数据元素的时候要指明数据类型
  • 做数值运算的时候,比如究竟是整数除法还是浮点数除法。

但面对一大堆代码,我们有时并不清楚当前的矩阵元素究竟是什么类型,这篇文章就是以 cv::Mat 类为例来解决这个问题。

cv::Mat 类的对象有一个成员函数 type() 用来返回矩阵元素的数据类型,返回值是 int 类型,不同的返回值代表不同的类型。OpenCV Reference Manual 中对 type() 的解释如下所示:

Mat::type
C++: int Mat::type() const
The method returns a matrix element type. This is an identifier compatible with the CvMat type system, like CV_16SC3 or 16-bit signed 3-channel array, and so on.

实际的代码如下所示:

  1. cv::Mat haha = cv::Mat::zeros(3,3,CV_64F);
  2. int hahaType = haha.type();
  3. std::cout<<"hahaType = "<

至此,知道了 type() 函数,下一步更关键的就是返回值和具体类型之间的对应关系了。文章《LIST OF MAT TYPE IN OPENCV》对此整理得非常清楚,具体如下表所示:

 C1C2C3C4
CV_8U081624
CV_8S191725
CV_16U2101826
CV_16S3111927
CV_32S4122028
CV_32F5132129
CV_64F6142230

表头的 C1, C2, C3, C4 指的是通道(Channel)数,比如灰度图像只有 1 个通道,是 C1;JPEG格式 的 RGB 彩色图像就是 3 个通道,是 C3;PNG 格式的彩色图像除了 RGB 3个通道外,还有一个透明度通道,所以是 C4。大家还会发现 7 怎么没有被定义类型,这个可以看 OpenCV 源码,有如下所示的一行,说明 7 是用来给用户自定义的:

#define CV_USRTYPE1 7

如果仅仅是为了在数值计算前明确数据类型,那么看到这里就可以了;如果是要使用 at 方法访问数据元素,那么还需要下面一步。因为以单通道为例,at 方法接受的是 uchar 这样的数据类型,而非 CV_8U。在已知通道数和每个通道数据类型的情况下,指定给 at 方法的数据类型如下表所示:

 C1C2C3C4C6
ucharucharcv::Vec2bcv::Vec3bcv::Vec4b
shortshortcv::Vec2scv::Vec3scv::Vec4s
intintcv::Vec2icv::Vec3icv::Vec4i
floatfloatcv::Vec2fcv::Vec3fcv::Vec4fcv::Vec6f
doubledoublecv::Vec2dcv::Vec3dcv::Vec4dcv::Vec6d

至此,我们就可以像《OpenCV for Matlab Users (2)》中演示的一样采用如下方式访问图像(矩阵)了

  1. cv::Vec3b vec3b = img.at(0,0);
  2. uchar vec3b0 = img.at(0,0)[0];
  3. uchar vec3b1 = img.at(0,0)[1];
  4. uchar vec3b2 = img.at(0,0)[2];
  5. std::cout<<"vec3b = "<
  6. std::cout<<"vec3b0 = "<<(int)vec3b0<
  7. std::cout<<"vec3b1 = "<<(int)vec3b1<
  8. std::cout<<"vec3b2 = "<<(int)vec3b2<

初写于 2015-04-30.
首发于 Yimian Dai's Homepage,转载请注明出处。

参考资料

  • LIST OF MAT TYPE IN OPENCV

附录

数据类型及其取值范围
数值具体类型取值范围
CV_8U8 位无符号整数(0…..255)
CV_8S8 位符号整数(-128…..127)
CV_16U16 位无符号整数(0……65535)
CV_16S16 位符号整数(-32768…..32767)
CV_32S32 位符号整数(-2147483648……2147483647)
CV_32F32 位浮点数(-FLT_MAX ………FLT_MAX,INF,NAN)
CV_64F64 位浮点数(-DBL_MAX ……….DBL_MAX,INF,NAN)
Vec 类的定义
  1. template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
  2. typedef Vec2> Vec2b;
  3. typedef Vec3> Vec3b;
  4. typedef Vec4> Vec4b;
  5. typedef Vec<short, 2> Vec2s;
  6. typedef Vec<short, 3> Vec3s;
  7. typedef Vec<short, 4> Vec4s;
  8. typedef Vec<int, 2> Vec2i;
  9. typedef Vec<int, 3> Vec3i;
  10. typedef Vec<int, 4> Vec4i;
  11. typedef Vec<float, 2> Vec2f;
  12. typedef Vec<float, 3> Vec3f;
  13. typedef Vec<float, 4> Vec4f;
  14. typedef Vec<float, 6> Vec6f;
  15. typedef Vec<double, 2> Vec2d;
  16. typedef Vec<double, 3> Vec3d;
  17. typedef Vec<double, 4> Vec4d;
  18. typedef Vec<double, 6> Vec6d;


文/YimianDai(简书作者)
原文链接:http://www.jianshu.com/p/204f292937bb
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
文章知识点与官方知识档案匹配,可进一步学习相关知识
OpenCV技能树首页概览20736 人正在系统学习中
注:本文转载自blog.csdn.net的夜_毒的文章"http://blog.csdn.net/u013021895/article/details/52045410"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top