OpenCv常用数据类型

定义和输出常见的点


#include <opencv2/opencv.hpp>
#include <vector>

int main()
{
     // 定义和输出二维点
     cv::Point2f p2f(6, 2);	// 定义二维点
     std::cout << "二维点 p2f = " << p2f << std::endl;

     // 定义和输出三维点
     cv::Point3f p3f(8, 2, 0);	// 定义三维点
     std::cout << "三维点 p3f = " << p3f << std::endl;

     // 定义和输出基于 Mat 的 std::vector
     std::vector<float> vec;
     vec.push_back(3);
     vec.push_back(5);
     vec.push_back(7);
     std::cout << "Mat(vector) = " << cv::Mat(vec) << std::endl;

     // 定义和输出 std::vector 点
     std::vector<cv::Point2f> points(20);
     for (size_t i = 0; i < points.size(); i++)
     points[i] = cv::Point2f((float)(i * 5), (float)(i % 7));
     std::cout << "二维点向量 points = " << points << std::endl;

     getchar();

     return 0;
}

运行结果如下:

在这里插入图片描述


点的表示


Point 类数据结构表示了二维坐标系下的点,即由其图像坐标 xy 指定的2D点。用法如下:

Point point;
point.x=10;
point.y=8;
/*或者*/
Point point=Point(10,8);

另外,常见的点的类型在 OpenCv 中的定义如下:

/*二维点*/
typedef Point2i cv::Point
typedef Point_<int> Point2i
typedef Point_<int64> cv::Point2I
typedef Point_<float> Point2f
typedef Point_<double> cv::Point2d
/*三维点*/
typedef Point3_<int> cv::Point3i
typedef Point3_<float> cv::Point3f
typedef Point3_<double> cv::Point3d

所以,Point_<int>、Point2i、Point互相等价,Point_<float>、Point2f互相等价。


颜色表示:Scalar 类


OpenCv 中的颜色是由 Scalar() 表示的。Scalar() 表示具有 4 4 4 个元素的数组,用来传递像素值,如 RGB 颜色值。一般我们只用到前三个值,如下所示:

Scalar(r, g, b);颜色分量分别为 r、g、b

Scalar 类的源头是 Scalar_ 类,而 Scalar_ 是 Vec4x 的一个变种,我们常用的 Scalar 其实就是 Scalar_。


尺寸表示


Size 类的定义如下:

typedef Size_<int> Size2i;
typedef Size2i Size;

由上述可知,Size_<int> 、Size2i、Size 三者是等价的。且,Size_ 是个模板类,其定义如下:

template< typename _Tp> class Size_ 
{ 
public: 
    typedef _Tp value_ type; 
    /*不同的构造函数定义*/ 
    Size_( ); 
    Size_(_ Tp _width, _Tp _height); 
    Size_( const Size_& sz); 
    Size_( const CvSize& sz); 
    Size_( const CvSize2D32f& sz); 
    Size_( const Point_<_ Tp>& pt); 
    Size_& operator = (const Size_& sz); 
    
    /*区域( width* height)*/ 
    _Tp area( ) const; 

    /*转化为另一种数据类型*/ 
    template< typename_ Tp2> operator Size_<_ Tp2>( ) const; 

    /*转换为旧式的OpenCV 类型*/
    operator CvSize( ) const; 
    operator CvSize2D32f( ) const;

    _Tp width, height; //宽度和高度, 常用属性 
};

我们最常使用的是下面的构造函数:

Size_(_Tp _width, _Tp _height);

代码的末尾定义了属性长、宽属性:_Tp weight, height
使用示例如下:

cv::Size size(5, 5);
size.width; // 表示宽度
size.height; // 表示长度

矩形的表示:Rect 类


Rect 类的定义如下:

typedef Rect2i cv::Rect;
typedef Rect_<double> cv::Rect2d;
typedef Rect_<float> cv::Rect2f;
typedef Rect_<int> cv::Rect2i;

Rect 类用来表示一个矩形,常见的属性有:

  • x、y:表示左上角点的坐标;
  • width:表示宽度;
  • height:表示高度;
    常用的接口为:
  • Size_<Tp> size() const:返回 Rect 对象的尺寸;
  • _Tp area() const:返回 Rect 对象的面积大小;
  • bool contains(const Point_<_Tp> &pt) const:检测点 pt 是否在 Rect 对象内;
  • Point_<_Tp> tl() const:返回 Rect 对象的左上角坐标;
  • Point_<_Tp> br() const:返回 Rect 对象的右下角坐标;

常见的用法:

  • 判断一个点是否在矩形对象内:
bool cv::Point_< _Tp >::inside	(	const Rect_< _Tp > & r	)	const;
  • 求两个矩形的交集和并集:
Rect rect = rect1 & rect2;
Rect rect = rect1 | rect2;
  • 对矩形进行平移和缩放操作:
Rect rectShift = rect + point;
Rect rectScale = rect + size;
  • OpenCv 中的 ROI 通常用 Rect 来实现,遍历 Rect 中像素为:
for(int y = roi.y; y < roi.y + roi.height; y++) {
    for(int x = roi.x; x < roi.x + roi.width; x++) {
        // ...
    }
}

颜色空间转化:cvtColor() 函数


cvtColor() 函数可以实现 RGB 颜色空间相 HSI、HSV、灰度等颜色空间的转化,其函数原型如下:

C++:void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)

函数参数意义:

  • InputArray src:表示输入图像;
  • OutputArray dst:表示输出图像;
  • int code:表示颜色空间转换标识符;
  • int dstCn = 0:目标图像的通道数;0:目标图像取源图像的通道数;

使用例子:

/*OpenCv2 版本*/
cvtColor(srcImage, dstImage, CV_GRAY2BGR);
/*OpenCv3 版本*/
cvtColor(srcImage, dstImage, COLOR_GRAY2BGR);

常用的 Code 标识符为:

转化类型标识符列举
RGB <–> BGRCOLOR_BGR2BGRA、COLOR_RGB2RGBA、COLOR_BGRA2RGBA、COLOR_BGR2BGRA、COLOR_BGRA2BGR
RGB <–> GrayCOLOR_RGB2GRAY、COLOR_GRAY2RGB、COLOR_RGBA2GRAY、COLOR_GRAY2RGBA
RGB <–> HSVCOLOR_BGR2HSV、COLOR_RGB2HSV、COLOR_HSV2BGR、COLOR_HSV2RGB
RGB <–> HLSCOLOR_BGR2HLS、COLOR_RGB2HLS、COLOR_HLS2BGR、COLOR_HLS2RGB

其他标识符可以参考官方文档;针对 OpenCv2,把 COLOR 替换为 CV 就可以了。
特殊使用:当需要把一个 8 8 8 位的 RGB 图像转化为 Luv 格式的图像时,需要先把图像转化为单精度 32 32 32 位。

img *= 1./255;
cvtColor(img, img, COLOR_BGR2Luv);

样例:把一个 BGR 图像转化为灰度图像格式:

#include <opencv2/opencv.hpp>

int main()
{
 /*加载图像*/
 cv::Mat srcImg = cv::imread("bird.bmp", 1);

 /*转化颜色空间*/
 cv::Mat dstImg;
 cv::cvtColor(srcImg, dstImg, cv::COLOR_BGR2GRAY);

 /*显示图像*/
 cv::imshow("srcImg", srcImg);
 cv::imshow("Gray", dstImg);
 cv::waitKey();

 return 0;
}

结果如下:

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值