定义和输出常见的点
#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 类数据结构表示了二维坐标系下的点,即由其图像坐标 x
和 y
指定的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 <–> BGR | COLOR_BGR2BGRA、COLOR_RGB2RGBA、COLOR_BGRA2RGBA、COLOR_BGR2BGRA、COLOR_BGRA2BGR |
RGB <–> Gray | COLOR_RGB2GRAY、COLOR_GRAY2RGB、COLOR_RGBA2GRAY、COLOR_GRAY2RGBA |
RGB <–> HSV | COLOR_BGR2HSV、COLOR_RGB2HSV、COLOR_HSV2BGR、COLOR_HSV2RGB |
RGB <–> HLS | COLOR_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;
}
结果如下: