当前位置: 首页 > news >正文

opencv学习笔记(4):图像属性和基本图形绘制

1.图像属性

1.1 图像上的一点: Point()

OpenCV中使用cv::Point()表示其图像坐标和指定的2D点。cv::Point()类的对象创建有两种方式:第一种是使用构造函数,第二种是使用成员变量赋值。具体示例如下。

// 1.画点 Point()Point p = Point(10,10); //第一种方式:使用构造函数Point p2;               //第二种方式:使用成员变量赋值p2.x = 10;p2.y = 10;

 1.2 描述颜色的类:Scalar()

OpenCV中使用cv::Scalar()类来表示一个4元素的向量。

其定义如下。

Scalar scalar(
double val[4];
)

Scalar类型被广泛应用于OpenCV中,常用于传递像素值,也常用于表示BGR颜色值(3个参数)。如果不使用最后一个参数,则无须定义最后一个参数。

当要定义一个颜色参数时,可以通过Scalar( a, b, c )来表示。例如,当要定义一个RGB颜色时,可以使Blue = a、Green = b、Red = c。

// 2.定义颜色 Scalar()Scalar s = Scalar(1,1,1);Scalar color = Scalar(0, 0, 255);

1.3 描述图像尺寸的类:Size()

OpenCV中图像的大小可以通过cv::Size类来表示,第一个参数width表示图像的宽度,第二个参数height表示图像的高度,其定义如下。

cv::Size(int _width,int _height
)
// 3.设置尺寸Size ss = Size(2,2);int width = ss.width;int height = ss.height;

1.4 图像的行和列:rows 和 cols

 OpenCV中图像的行数和列数可以通过Mat.rows和Mat.cols成员变量的值来获取。

// 4.获取图像的行和列Mat image(ss,CV_8UC3);//创建一个mat对象int row = image.rows;//图像的行数int col = image.cols;//图像的列数int sum = image.channels(); //图像每个像素点的通道个数cout<<"row = "<<row<<" col = "<<col<<endl;

 1.5 获取图像的像素值

 OpenCV中,通过mat.ptr<uchar>()获取图像某一行像素数组的指针。获取图像某一点的像素值,既可以使用该指针,也可以使用at函数。

// 5.获取图像的像素值// 5.1 灰度图image.ptr<uchar>(0); //获取image图像第一行像素数组的指针int val = image.ptr<uchar>(0)[0]; //读取点(x=0,y=0)的像素值val = image.at<uchar>(0,0);//使用at直接读取像素值读取点(x=0,y=0)的像素值//5.2 RGB图Vec3b rgb = image.at<Vec3b>(1,1); //rgb像素值用Vec3b类型的值来存int blue = rgb[0]; //opencv像素值存放顺序是b、g、r,不是r、g、bint green = rgb[1];int red = rgb[2];

使用mat.ptr<uchar>()指针和at函数的区别在于:mat.ptr<uchar>()更高效,因为它通过指针直接访问内存,没有边界检查。at()较慢一些,因为有边界检查,保证安全性。

如果你追求效率并能确保不会越界,ptr 方式更合适;如果希望代码更安全和易维护,at 方式更好。

在上面的代码中,灰度图和rgb彩色图的像素值类型不一样,灰度图的类型为uchar,而rgb的类型为Vec3b,其定义为typedef Vec<uchar,3> Vec3b,其实就是存放了blue、green、red三个分量的uchar。注意:opencv中rgb图像的像素存放顺序是bgr。

2.基本图形绘制

 2.1 绘制直线

cv::line()函数用于在图像中绘制连接点p1和点p2的直线。cv::line()函数定义如下。

 

void cv::line(inputOutputArray img,//图像Point pt1,//点1Point pt2,//点2const Scalar & color,//绘制直线的颜色int thickness = 1,//直线的厚度int lineType = LINE_8,//直线的类型int shief = 0 //点坐标中的小数位数
)
//opencv绘制直线示例
void function2()
{// 基本图形的绘制// 1.绘制直线Mat m1 = Mat::zeros(Size(100,100),CV_8UC3);line(m1,Point(1,1),Point(2,2),Scalar(111,111,111));namedWindow("line",WINDOW_AUTOSIZE);imshow("line",m1);waitKey(0);}

2.2 绘制矩形 

cv::rectangle()函数用于绘制矩形。

OpenCV中通过cv::Rect类定义矩形,Rect矩形类包括Point点类的成员x和y(表示矩形的左上角)以及size类的成员width和height(表示矩形的大小)。但是,矩形类不会从Point点类或size类继承,因此通常不会从它们中继承操作符。其基本定义和使用方法如下表所示。 

a417d00d5fb64d71915e9902302db814.jpeg

 

cv::rectangle()函数定义有以下两种形式。

形式一:

   void rectangle(cv::Mat& img,// 待绘制的图像cv::Point pt1,// 矩形的第一个顶点cv::Point pt2 // 矩形的对角顶点const cv::Scalar& color,// 线条的颜色(RGB)int lineType = 8,// 线型(4邻域或8邻域,默认为8邻域)int shift = 0 // 偏移量);

形式二:

   void rectangle(cv::Mat& img,// 待绘制的图像cv::Rect r,// 待绘制的矩形const cv::Scalar& color,// 线条的颜色(RGB)int lineType = 8,// 线型(4邻域或8邻域,默认为8邻域)int shift = 0 // 偏移量);

2.3 绘制圆形

cv::circle()函数用于绘制圆形。cv::circle()函数定义如下。

void circle(
cv::Mat& img,// 待绘制的图像
cv::Point center,// 圆心位置
int radius,// 圆的半径
const cv::Scalar& color,// 线条的颜色(RGB)
int thickness = 1,// 线宽
int lineType = 8,// 线型(4邻域或8邻域,默认为8邻域)
int shift = 0// 偏移量
);

2.3 其他图形

椭圆:cv::ellipse ()

填充:cv::fillPoly()

向图像中添加文字:cv::putText() 

2.4 随机数

OpenCV使用RNG类生成随机数:cv::rng

 

  1. 生成高斯随机数:rng.gaussian(double sigma)
  2. 生成均匀分布随机数:rng.uniform(int a,int b)
//生成随机数
RNG rng;//生成器
double number=0;
for (int i = 0; i <= 10; i++)
{number = rng.gaussian(10.0); //高斯随机数cout << number << endl;}

 

 


http://www.mrgr.cn/news/58173.html

相关文章:

  • 1024是什么日子
  • Do not use built-in or reserved HTML elements as component id: map
  • ansible面试题
  • 基于Python和OpenCV的疲劳检测系统设计与实现
  • Linux运行时动态库搜索路径优先级
  • 策略模式是一种行为设计模式
  • P4735 最大异或和 题解
  • MES(制造执行系统)物料管理模块概述
  • Cursor零基础小白教程系列「高阶」 - Cursor 模型选择和API密钥配置
  • antv g6问题处理汇总
  • MySQL(python开发)——(10)Sql操作及优化
  • 智联引擎是什么?
  • 基于ssm+vue的房源管理系统设计与实现
  • 中国区 Microsoft365主页链接请您参考:
  • 时间数据可视化基础实验(大数据可视化)——Python热狗大胃王比赛前三名分析
  • xss-labs靶场第十二关测试报告
  • 程序员的最终出路在哪
  • ZYNQ AXI_GPIO_INT
  • 使用Python画一个蓝色的动感爱心
  • 升级到Delphi 12,DUnitx 测试用例项目闪退
  • C语言——求解一元二次方程
  • 【付费】Ambari集成Dolphin实战-004-实战bigtop.bom——下
  • 网易博客旧文----BASE64编码解码工具的使用
  • Jenkins + GitLab + Docker实现自动化部署(Java项目)
  • 基于ssm+jsp的宠物常规护理知识管理系统设计与实现(含源码+数据库)
  • Strategy_Mode