为了便于对一些常见的数据进行操作,OpenCV定义了一些常见的数据结构(Point ,Scalar等),以方便后续对数据算法的实现,主要分为basic data type、helper objects、large array types等三种数据结构类型,其中basic data type是最常见使用频率最高的数据结构,主要包括一些简单的向量和矩阵等等,主要用于局部变量中,此类型最典型的是数据都是比较小,主要是提供一些方便操作。

Point class

point是OpenCV中最常见数据结构,支持整型、浮点型等数据类型,经常用来表示矩阵中某个点,是OpenCV中最简单的数据结构,按照维度主要分为二维(Point2)和三维(Point3)两个类型,可以再由该数据类型组成固定数量的vector。

Point2产生的变种:为Point2i、Point2l、Point2f、Point2d,其中i代表int,l代表int64, f代表float,d代表double,其实现如下:

Point3变种为:Point3i、Point3f、Point3d,其实现如下:

由上述二维和三维点表示可知 Point2和Point3分别为Point_和 Point3_类,上述两个类相对来说比较简单,支持常用的表达式:

Point_类

Point_类定义如下:

支持=,dot,cross,inside等操作。

Point3_类

Point3_类如下:

与Point2_所支持的操作类型一样

总结

Point3和Point2直接支持的操作是一样的,表格如下:

Operation Description
两者提前定义的数据类型

二维:Point2i、Point2l、Point2f、Point2d

三维:Point3i、Point3f、Point3d,其他类型需要开发者自己定义

两者支持的默认构造函数

比如:

二维:cv::Point2i a;

cv::Point2l b;

cv::Point2f c;

cv::Point2d d;

三维:cv::Point3i a;

cv::Point3f b;

cv::Point3d c;

数据copy构造函数

二维: cv::Point2i e(d);

三维:cv::Point3i d(a);

赋值重构

二维:cv::Point2i g(2,3);

三维:cv:Point3i g(2,3,4);

直接强转成vec

二维:Point2i 相当于cv::Vec2i

Point2f 相当于cv::Vec2f

三维:Point3i 相当于cv::Vec3i

Point3f 相当于cv::Vec3f

两则成员

二维:a.x 和a.y分别代码二维情况下的x和y index

三维:a.x,a.y和az分别代码三维情况下的x,y和z

dot

两者都支持dot:

二维:

Point2f a

Point2f b

float x= a.dot(b)

三维:

Point3f a;

Point3f b

float x= a.dot(b)

ddot double精度,其返回值为double

二维:

Point2f a

Point2f b

double x= a.dot(b)

三维:

Point3f a;

Point3f b

double x= a.dot(b)

cross

二维:

二维返回值为double值

三维:

Point3f a;

Point3f b

Point3f x= a.cross(b)

inside:查找b 是否在a的范围之内

只有二维支持:

Point2f a

Rect为矩形框表示方式,后面在Rect部分详细介绍

a.inside(Rect(1,2,3,4));

Point2用例:

#include <stdio.h>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"using namespace cv;
using namespace std;void main()
{Point2i int_a;Point2l int64_b;Point2f float_c;Point2d double_d;Point2i int_a2(int_a);Point2l int64_b2(int64_b);Point2f float_c2(float_c);Point2d double_d2(double_d);int_a2.x = 1;int_a2.y = 2;cout << "int_a:" << int_a << endl;cout << "int_a2:" << int_a2 << endl;int64_b2.x = 23;int64_b2.y = 123456;cout << "int64_b:" << int64_b << endl;cout << "int64_b2:" << int64_b2 << endl;float_c2.x = 1.23;float_c2.y = 5.78;cout << "float_c:" << float_c << endl;cout << "float_c2:" << float_c2 << endl;double_d2.x = 12876;double_d2.y = 3787.324;cout << "double_d:" << double_d << endl;cout << "double_d2:" << double_d2 << endl;Point2i int_a3(7,8);Point2l int64_b3(234247, 32438);Point2f float_c3(23.34,465.8979);Point2d double_d3(246435, 463235.892379);cout << "int_a3:" << int_a3 << endl;cout << "int64_b3:" << int64_b3 << endl;cout << "float_c3:" << float_c3 << endl;cout << "double_d3:" << double_d3 << endl;cout << "int_a2.dot(int_a3):" << int_a2.dot(int_a3) << endl;cout << "int64_b2.dot(int64_b3):" << int64_b2.dot(int64_b3) << endl;cout << "float_c2.dot(float_c3):" << float_c2.dot(float_c3) << endl;cout << "double_d2.dot(double_d3):" << double_d2.dot(double_d2) << endl;cout << "int_a2.ddot(int_a3):" << int_a2.ddot(int_a3) << endl;cout << "int64_b2.ddot(int64_b3):" << int64_b2.ddot(int64_b3) << endl;cout << "float_c2.ddot(float_c3):" << float_c2.ddot(float_c3) << endl;cout << "double_d2.ddot(double_d3):" << double_d2.ddot(double_d2) << endl;cout << "int_a2.cross(int_a3):" << int_a2.cross(int_a3) << endl;cout << "int64_b2.cross(int64_b3):" << int64_b2.cross(int64_b3) << endl;cout << "float_c2.cross(float_c3):" << float_c2.cross(float_c3) << endl;cout << "double_d2.cross(double_d3):" << double_d2.cross(double_d2) << endl;cout << "int_a2.inside(int_a3):" << int_a2.inside(Rect(2,3,3,3)) << endl;cout << "int64_b2.inside(int64_b3):" << int64_b2.inside(Rect(2, 3, 3, 3)) << endl;cout << "float_c2.inside(float_c3):" << float_c2.inside(Rect(2, 3, 3, 3)) << endl;cout << "double_d2.inside(double_d3):" << double_d2.inside(Rect(2, 3, 3, 3)) << endl;}

运行结果:

Point3用例:

#include <stdio.h>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"using namespace cv;
using namespace std;void main()
{Point3i int_a;Point3f float_c;Point3d double_d;Point3i int_a2(int_a);Point3f float_c2(float_c);Point3d double_d2(double_d);int_a2.x = 1;int_a2.y = 2;int_a2.z = 3;cout << "int_a:" << int_a << endl;cout << "int_a2:" << int_a2 << endl;float_c2.x = 1.23;float_c2.y = 5.78;float_c2.z = 45.2344;cout << "float_c:" << float_c << endl;cout << "float_c2:" << float_c2 << endl;double_d2.x = 12876;double_d2.y = 3787.324;double_d2.z = 242;cout << "double_d:" << double_d << endl;cout << "double_d2:" << double_d2 << endl;Point3i int_a3(7,8,10);Point3f float_c3(23.34,465.8979,127.21);Point3d double_d3(246435, 463235.892379,21979.12424123);cout << "int_a3:" << int_a3 << endl;cout << "float_c3:" << float_c3 << endl;cout << "double_d3:" << double_d3 << endl;cout << "int_a2.dot(int_a3):" << int_a2.dot(int_a3) << endl;cout << "float_c2.dot(float_c3):" << float_c2.dot(float_c3) << endl;cout << "double_d2.dot(double_d3):" << double_d2.dot(double_d2) << endl;cout << "int_a2.ddot(int_a3):" << int_a2.ddot(int_a3) << endl;cout << "float_c2.ddot(float_c3):" << float_c2.ddot(float_c3) << endl;cout << "double_d2.ddot(double_d3):" << double_d2.ddot(double_d2) << endl;cout << "int_a2.cross(int_a3):" << int_a2.cross(int_a3) << endl;cout << "float_c2.cross(float_c3):" << float_c2.cross(float_c3) << endl;cout << "double_d2.cross(double_d3):" << double_d2.cross(double_d2) << endl;
}

运行结果:

operator重载

Point_和Point3_类通过C++ operator重载来实现该类的加减乘除操作。

Point_类operator重载

Point2实现通过operator重载实现表达式如下,其实现在modules\core\include\opencv2\core\types.hpp文件中:

operator Method
= template<typename _Tp> inline
Point_<_Tp>& Point_<_Tp>::operator = (const Point_& pt)
template<typename _Tp> inline
Point_<_Tp>& Point_<_Tp>::operator = (Point_&& pt)
Vec与Point之间转换 template<typename _Tp> inline
Point_<_Tp>::operator Vec<_Tp, 2>
+= template<typename _Tp> static inline
Point_<_Tp>& operator += (Point_<_Tp>& a, const Point_<_Tp>& b)
-= template<typename _Tp> static inline
Point_<_Tp>& operator -= (Point_<_Tp>& a, const Point_<_Tp>& b)
*= template<typename _Tp> static inline
Point_<_Tp>& operator *= (Point_<_Tp>& a, int b)
template<typename _Tp> static inline
Point_<_Tp>& operator *= (Point_<_Tp>& a, double b)
template<typename _Tp> static inline
Point_<_Tp>& operator *= (Point_<_Tp>& a, float b)
/= template<typename _Tp> static inline
Point_<_Tp>& operator /= (Point_<_Tp>& a, int b)
template<typename _Tp> static inline
Point_<_Tp>& operator /= (Point_<_Tp>& a, float b)
template<typename _Tp> static inline
Point_<_Tp>& operator /= (Point_<_Tp>& a, double b)
norm:sqrt((double)pt.x*pt.x + (double)pt.y*pt.y) template<typename _Tp> static inline
double norm(const Point_<_Tp>& pt)
== template<typename _Tp> static inline
bool operator == (const Point_<_Tp>& a, const Point_<_Tp>& b)
!= template<typename _Tp> static inline
bool operator != (const Point_<_Tp>& a, const Point_<_Tp>& b)
+ template<typename _Tp> static inline
Point_<_Tp> operator + (const Point_<_Tp>& a, const Point_<_Tp>& b)
- template<typename _Tp> static inline
Point_<_Tp> operator - (const Point_<_Tp>& a, const Point_<_Tp>& b)
template<typename _Tp> static inline
Point_<_Tp> operator - (const Point_<_Tp>& a)
* template<typename _Tp> static inline
Point_<_Tp> operator * (const Point_<_Tp>& a, int b)
* template<typename _Tp> static inline
Point_<_Tp> operator * (int a, const Point_<_Tp>& b)
template<typename _Tp> static inline
Point_<_Tp> operator * (const Point_<_Tp>& a, float b)
template<typename _Tp> static inline
Point_<_Tp> operator * (float a, const Point_<_Tp>& b)
template<typename _Tp> static inline
Point_<_Tp> operator * (const Point_<_Tp>& a, double b)
template<typename _Tp> static inline
Point_<_Tp> operator * (double a, const Point_<_Tp>& b)
template<typename _Tp> static inline
Point_<_Tp> operator * (const Matx<_Tp, 2, 2>& a, const Point_<_Tp>& b)
template<typename _Tp> static inline
Point3_<_Tp> operator * (const Matx<_Tp, 3, 3>& a, const Point_<_Tp>& b)
/ template<typename _Tp> static inline
Point_<_Tp> operator / (const Point_<_Tp>& a, int b)
template<typename _Tp> static inline
Point_<_Tp> operator / (const Point_<_Tp>& a, float b)
template<typename _Tp> static inline
Point_<_Tp> operator / (const Point_<_Tp>& a, double b)

Point3_类operator重载

Point3_类支持的重载:

operator Method
 = template<typename _Tp> inline
Point3_<_Tp>& Point3_<_Tp>::operator = (const Point3_& pt)
template<typename _Tp> inline
Point3_<_Tp>& Point3_<_Tp>::operator = (Point3_&& pt)
vec与Point转换 template<typename _Tp> inline
Point3_<_Tp>::operator Vec<_Tp, 3>()
+= template<typename _Tp> static inline
Point3_<_Tp>& operator += (Point3_<_Tp>& a, const Point3_<_Tp>& b)
-= template<typename _Tp> static inline
Point3_<_Tp>& operator -= (Point3_<_Tp>& a, const Point3_<_Tp>& b)
*= template<typename _Tp> static inline
Point3_<_Tp>& operator *= (Point3_<_Tp>& a, int b)
template<typename _Tp> static inline
Point3_<_Tp>& operator *= (Point3_<_Tp>& a, float b)
template<typename _Tp> static inline
Point3_<_Tp>& operator *= (Point3_<_Tp>& a, double b)
/= template<typename _Tp> static inline
Point3_<_Tp>& operator /= (Point3_<_Tp>& a, int b)
template<typename _Tp> static inline
Point3_<_Tp>& operator /= (Point3_<_Tp>& a, float b)
template<typename _Tp> static inline
Point3_<_Tp>& operator /= (Point3_<_Tp>& a, double b)

norm:

sqrt((double)pt.x*pt.x + (double)pt.y*pt.y + (double)pt.z*pt.z)

template<typename _Tp> static inline
double norm(const Point3_<_Tp>& pt)
== template<typename _Tp> static inline
bool operator == (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
!= template<typename _Tp> static inline
bool operator != (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
+ template<typename _Tp> static inline
Point3_<_Tp> operator + (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
- template<typename _Tp> static inline
Point3_<_Tp> operator - (const Point3_<_Tp>& a, const Point3_<_Tp>& b)
template<typename _Tp> static inline
Point3_<_Tp> operator - (const Point3_<_Tp>& a)
* template<typename _Tp> static inline
Point3_<_Tp> operator * (const Point3_<_Tp>& a, int b)
template<typename _Tp> static inline
Point3_<_Tp> operator * (int a, const Point3_<_Tp>& b)
template<typename _Tp> static inline
Point3_<_Tp> operator * (const Point3_<_Tp>& a, float b)
template<typename _Tp> static inline
Point3_<_Tp> operator * (float a, const Point3_<_Tp>& b)
template<typename _Tp> static inline
Point3_<_Tp> operator * (const Point3_<_Tp>& a, double b)
template<typename _Tp> static inline
Point3_<_Tp> operator * (double a, const Point3_<_Tp>& b)
template<typename _Tp> static inline
Point3_<_Tp> operator * (const Matx<_Tp, 3, 3>& a, const Point3_<_Tp>& b)
template<typename _Tp> static inline
Matx<_Tp, 4, 1> operator * (const Matx<_Tp, 4, 4>& a, const Point3_<_Tp>& b)
/ template<typename _Tp> static inline
Point3_<_Tp> operator / (const Point3_<_Tp>& a, int b)
template<typename _Tp> static inline
Point3_<_Tp> operator / (const Point3_<_Tp>& a, float b)
template<typename _Tp> static inline
Point3_<_Tp> operator / (const Point3_<_Tp>& a, double b)

下面为Point3一个简单的例子:

#include <stdio.h>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"using namespace cv;
using namespace std;void main()
{Point3i int_a(4,5,6);Point3i int_a2(int_a);int_a2.x = 1;int_a2.y = 2;int_a2.z = 3;cout << "int_a=:" << int_a << endl;cout << "int_a2=:" << int_a2 << endl;cout << "int_a2- int_a=:" << (int_a2- int_a) << endl;cout << "int_a2+ int_a=:" << (int_a2 + int_a) << endl;cout << "int_a2*2=:" << int_a2 *2 << endl;cout << "int_a2/2=:" << int_a2 /2 << endl;cout << "(int_a2==int_a)=:" << (int_a2 ==int_a) << endl;}

运行结果:

OpenCV中基本数据结构(1)_Point相关推荐

  1. OPENCV中图像数据结构及其转化

    OPENCV中图像数据结构及其转化 1. IplImage 它是openCV库中表示图像的结构体. 初始化: cvLoadImage(),cvCreateImage() 访问元素:[行指针] b = ...

  2. OPENCV中的数据结构总结

    最近在写自己的算法,其实就是对一些传统算法的改进.传统算法可以参考opecv的源代码.在阅读源代码的过程中,我慢慢领会到了opencv的强大之处,并不是因为它实现了各种算法,而是在于它对于基本数据结构 ...

  3. OpenCV中的数据结构

    首先介绍2维点对Point_,它的是一个模板类.我们可以直接访问数据成员x,y.它不仅定了+.-.==.!=这4个基本的操作,还定义了点乘.叉乘等操作.特别的这个类还提供了inside函数来判断一个点 ...

  4. OpenCV中基本数据结构(4)_Rect

    Rect数据结构经常是在OpenCV中被用来表示为一个矩形尺寸,其成员包括x,y, width,height,其中x和y分别表示矩形框的左上角的起始点坐标,width和height分别表示宽和高. R ...

  5. OpenCV中基本数据结构(8)_Complex

    Complex为OpenCV中的复数表示类,与STL 中的complex类似但是不一样,两者可以互换,与STL的complex最大的不同是,STL中获取到实部和虚部的值 分别使用real()和imag ...

  6. OpenCV中基本数据结构(6)_Matx

    Matx为OpenCV轻量级的矩阵,被称为fixed matrix classes,意思是每个矩阵的大小都是固定的,主要是应对矩阵数据比较小的场景,最新的版本4.0不超过6*6大小的矩阵,旧版本一般不 ...

  7. OpenCV中基本数据结构(7)_Vec

    Vec系列数据结构是Matx的一个派生类,其矩阵的行的大小永远固定为一行,列大小从1到6不等,可以认为类似与C++ vector,但与C++ 的vector又有很大不同,,以下不同来自于一段技术博客, ...

  8. OpenCV中基本数据结构(5)_RotatedRect

    RotatedRect也是表示一个矩形框,但是与Rect不同的是,RotatedRect可以带倾斜角的矩形,如下图所示: RotatedRect结构中包括三个变量: Point2f center:为矩 ...

  9. OpenCV中Mat数据结构使用举例

    #include "stdafx.h" #include <string> #include <iostream> #include <opencv2 ...

最新文章

  1. 程序员和产品经理的恩怨情仇 | 每日趣闻
  2. 南通市交巡警支队同城异地容灾备份系统项目中标结果公告
  3. 程序员的.NET时代
  4. Qt Creator使用3D组件
  5. dapper 多对多查询对象和对象列表
  6. HTML5与触摸界面
  7. 数组 -- removeElement -- 图解
  8. 从零开始学Android(一)
  9. 解决手机QQ发送文件给电脑端,电脑端无法接收的问题
  10. 向工程腐化开炮 | manifest 治理
  11. 评价的等级优良差_小学生期末评语-等级优良合格(最佳版本)
  12. POI操作excel基本使用
  13. 【论文笔记】MGU-Net
  14. elasticsearch和elasticsearch-sql安装教程
  15. Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
  16. 核桃编程C语言,核桃编程毕业设计获奖感言?
  17. VsCode 使用less
  18. linux学习的几个网站
  19. 手机显示无法接通服务器是怎么回事,手机暂时无法接通是什么原因 可能处于飞行模式...
  20. java64 压缩包,qq64位下载-rar 64位 v5.21 免费版

热门文章

  1. package-lock.json 文件的作用
  2. JeeWx 微信开发公开课(Jeewx-API 专题),今晚8点不见不散
  3. JAVA版本微信公众账号开源项目版本发布-jeewx1.0(捷微)
  4. jeecg-framework-3.3.2-RELEASE 最新版本发布
  5. 个人成长中,关于规划设计的思考
  6. 数据源管理 | 基于JDBC模式,适配和管理动态数据源
  7. 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)
  8. 算法及shell脚本编程基础
  9. .NET MVC Scripts.Render 上下文不存在问题解决方法
  10. Vector3 *2 ,ToString()自动四舍五入