程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Opencv 使用Rect選取與設置窗口ROI

Opencv 使用Rect選取與設置窗口ROI

編輯:C++入門知識

Opencv 使用Rect選取與設置窗口ROI


首先看一下Rect對象的定義:

typedef Rect_ Rect;

再看Rect_的定義:

/*!
  The 2D up-right rectangle class

  The class represents a 2D rectangle with coordinates of the specified data type.
  Normally, cv::Rect ~ cv::Rect_ is used.
*/
template class Rect_
{
public:
    typedef _Tp value_type;

    //! various constructors
    Rect_();
    Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
    Rect_(const Rect_& r);
    Rect_(const CvRect& r);
    Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
    Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);

    Rect_& operator = ( const Rect_& r );
    //! 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;

    //! conversion to another data type
    template operator Rect_<_Tp2>() const;
    //! conversion to the old-style CvRect
    operator CvRect() const;

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

    _Tp x, y, width, height; //< the top-left corner, as well as width and height of the rectangle
};

從上面的定義至少可以發現兩點:一,類Rect_的類模板中的數據類型_TpRect_中被指定為整型;二,從Rect_的構造函數可以看出,其形參列表一共有6種形式:

Rect_(),形參列表為空,即定義一個空窗口(默認值為:x=y=width=height=0); Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height),定義一個左上角點坐標為(_x, _y)_width*_height矩形窗口; Rect_(const Rect_& r),使用其他的Rect_對象初始化; Rect_(const CvRect& r),使用CvRect對象初始化; Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz),分別將位置坐標(_x, _y)和窗口大小(_width, _height)Point_Size_對象初始化; Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2),分別將坐標位置(_x, _y)和窗口大小(_width, _height)Point_Point_對象初始化。

在OpenCV庫中,圖像像素坐標與所在行列數的對應關系為:x -> col, y -> row, width -> cols, height -> rows

下面給出一段代碼,基本可以把Rect的常見用法涵蓋:

Mat image = imread("C:\\Users\\Leo\\Desktop\\lena.jpg");
Rect rect1(256, 256, 128, 128);
Rect rect2(224, 224, 128, 128);

Mat roi1;
image(rect1).copyTo(roi1); // copy the region rect1 from the image to roi1
imshow("1", roi1);
waitKey(0);

Mat roi2;
image(rect2).copyTo(roi2); // copy the region rect2 from the image to roi2
imshow("2", roi2);
waitKey(0);

cv::Rect rect3 = rect1&rect2; // intersection of the two sets
Mat roi3;
image(rect3).copyTo(roi3);
imshow("3", roi3);
waitKey(0);

Rect rect4 = rect1|rect2; // union of the two sets (the minimum bounding rectangle)
Mat roi4;
image(rect4).copyTo(roi4);
imshow("4", roi4);
waitKey(0);

Rect rect5(10, 10, 128, 128);
roi1.copyTo(image(rect5)); // copy the region rect1 to the designated region in the image
imshow("5", image);
waitKey(0);

結果為:

這裡寫圖片描述


相應代碼,可以在Github賬戶中下載:yhlleo。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved