Opencv常见数据类型(三)

一.cv::Rect类

(1)基本概念

cv::Rect类(矩形类)包括cv::Point类的成员x和y(用来表示矩形左上角顶点的坐标)以及cv::Size类的成员width和height(用来表示矩形的宽和高),其主要用来表示一个二维的矩形。在Opencv中其定义如下:

template<typename _Tp> class Rect_
{
public:
    typedef _Tp value_type;

    //! default constructor
    Rect_();
    Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
    Rect_(const Rect_& r);
    Rect_(Rect_&& r) CV_NOEXCEPT;
    Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
    Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);

    Rect_& operator = ( const Rect_& r );
    Rect_& operator = ( Rect_&& r ) CV_NOEXCEPT;
    //! the top-left corner
    Point_<_Tp> tl() const;
    //! the bottom-right corner
    Point_<_Tp> br() const;

    //! size (width, height) of the rectangle
    Size_<_Tp> size() const;
    //! area (width*height) of the rectangle
    _Tp area() const;
    //! true if empty
    bool empty() const;

    //! conversion to another data type
    template<typename _Tp2> operator Rect_<_Tp2>() const;

    //! checks whether the rectangle contains the point
    bool contains(const Point_<_Tp>& pt) const;

    _Tp x; //!< x coordinate of the top-left corner
    _Tp y; //!< y coordinate of the top-left corner
    _Tp width; //!< width of the rectangle
    _Tp height; //!< height of the rectangle
};

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

需要注意的是,cv::Rect类同样是cv::Rect_类int类型的别名,此外,别名还有Rect2f,Rect2d,分别用来表示float与double类型.

(2)用法

1.cv::Rect类支持的构造方式有以下几种:

	cv::Rect r;//默认构造
	cv::Rect r1(3, 4, 5, 6);//赋值构造
	cv::Rect r2(r1);//通过拷贝构造
	cv::Point p(1, 3);
	cv::Size s(2, 4);
	cv::Rect r3(p, s);//通过设置顶点与长宽构造
	cv::Point p1(3, 7);
	cv::Rect r4(p, p1);//通过设置左上角与右下角顶点构造

2.矩形类的成员可以通过命名变量访问,此外,其还支持各种重载运算符,可用于计算两个矩形或一个矩形和另一个对象的各种集合属性,具体操作可参考以下示例:

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

using namespace cv;
using namespace std;

int main()
{
	Mat I=Mat::zeros(300, 400, CV_8UC3);//创建一个黑色的幕布,大小为300*400
	Rect r1(10, 10, 100, 200);
	Rect r2(50, 60, 200, 150);
	rectangle(I, r1, Scalar(0, 255, 0), 2);//将矩r1画在幕布上,颜色为绿色,矩形边线厚度为2
	rectangle(I, r2, Scalar(0, 0, 255), 2);
	imshow("rectangle", I);//显示
	waitKey(1000);//1000ms刷新一次
	Mat B = I.clone();
	//求交集
	Rect r3 = r1 & r2;
	rectangle(B, r3, Scalar(255, 0, 0), 2); //将矩r3画在幕布B上,颜色为蓝色,矩形边线厚度为2
	imshow("交集", B);
	waitKey(1000);
	//两个矩形的并集
	B = I.clone();
	Rect r4 = r1 | r2;
	rectangle(B, r4, Scalar(255, 0, 0), 2); 
	imshow("并集", B);
	waitKey(1000);
	//改变矩形大小
	B = I.clone();
	Rect r5(r1);
	r4 += Size(50, 60);//将r4长宽各增加50,60
	rectangle(B, r5, Scalar(255, 0, 0), 2);
	imshow("enlarge", B);
	waitKey(1000);
	//平移矩形
	B = I.clone();
	Rect r6(r1);
	r6 += Point(60, 60);//将左上顶点平移
	rectangle(B, r6, Scalar(255, 0, 0), 2);
	imshow("translate", B);
	waitKey();
	//
	Point p(250, 100);
	cout << "rectangle r1" << r1 << endl;
	cout << "is r1=r2" << (r1 == r2) << endl;
	cout << "is r1 contains p" << r1.contains(p) << endl;//判断点p是否在矩形r1中
}

运行结果如下:

屏幕输出如下:

附:

cv::Rect_类

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
人脸检测与识别是计算机视觉与模式识别领域中重要的基础研究课题,随着人们安全 防范意识的的加强,这一基础研究在门禁系统的应用显得日益重要了。 本文阐述了国内外人脸检测识别技术研究及应用的发展现状,讨论了对人脸图像检测 和识别之前的图像预处理步骤,介绍了常见的人脸检测识别方法,重点分析了人脸检测的 一个重要机制:多个弱分类器集成的方法,即Viola等提出的基于AdaBoost的实时人脸检测 算法,该方法使用了Harr-like特征表示图像,引入了“积分图”概念,提高了特征值的计 算速度,采用AdaBoost方法生成强分类器,使用了级联“Cascade“策略提高人脸检测速度, 取得较好检测性能。详细的阐述了主成分分析(PCA)的人脸识别方法,即利用K-L变换抽 取人脸的主要成分,构成特征脸空间,以达到过滤出所有信息中占最大信息量的成分(主 成分),消除次成分,通过关联性特性,对重新构建的模型参数进行比较评测,是目前使 用最广泛的人脸识别基准方法。重点研究了人脸跟踪算法(Camshift)的优缺点,提出了 采用AdaBoost算法进行人脸定位,提取位置信息再将其作为初始化人脸跟踪窗口传递给 Camshift进行自动人脸跟踪的改进算法。 OpenCV(Open Source Computer Vision)是一个开源的计算机视觉库,支持 Windows, Linux,Mac OS,Android 等常见操作系统,代码移植性强。本文利用 OpenCV 开源库中 的一些数据类型如 CMat、IPlimage 和 OpenCV 提供的计算机视觉函数接口,通过实时摄 像头获取的人脸信息,编写程序实现人脸检测与识别门禁系统。最后对人脸识别率、检测 速度等指标进行了验证,实验证明,识别可信度为 82%,平均检测用时为 30 毫秒。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人工智能小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值