#include
#include
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 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 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_ Point2i
typedef Point_ cv::Point2I
typedef Point_ Point2f
typedef Point_ cv::Point2d
/*三维点*/
typedef Point3_ cv::Point3i
typedef Point3_ cv::Point3f
typedef Point3_ cv::Point3d
所以,Point_
互相等价,Point_
互相等价。
OpenCv 中的颜色是由 Scalar() 表示的。Scalar() 表示具有 4 4 4 个元素的数组,用来传递像素值,如 RGB 颜色值。一般我们只用到前三个值,如下所示:
Scalar(r, g, b);颜色分量分别为 r、g、b
Scalar 类的源头是 Scalar_ 类,而 Scalar_ 是 Vec4x 的一个变种,我们常用的 Scalar 其实就是 Scalar_。
Size 类的定义如下:
typedef Size_ Size2i;
typedef Size2i Size;
由上述可知,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 类的定义如下:
typedef Rect2i cv::Rect;
typedef Rect_ cv::Rect2d;
typedef Rect_ cv::Rect2f;
typedef Rect_ cv::Rect2i;
Rect 类用来表示一个矩形,常见的属性有:
Size_ 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;
for(int y = roi.y; y < roi.y + roi.height; y++) {
for(int x = roi.x; x < roi.x + roi.width; x++) {
// ...
}
}
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
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;
}
结果如下: