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

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、b
    int 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,//点1
     Point pt2,//点2
     const 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.kler.cn/news/364427.html

相关文章:

  • NavMesh只制作可移动的导航网,清除多余不可走区域
  • 【忍无可忍,无需再忍】永久解决xshell or xftp 更新问题
  • AMD平台,5600X+6650XT,虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)
  • 《Windows PE》6.4.2 远程注入DLL
  • Bytebase 3.0.0 - AI 助手全面升级
  • Nginx可视化管理平台nginxWebUI(1)【保姆级部署方式】
  • 【纯血鸿蒙】HarmonyOS和OpenHarmony 的区别
  • 【LInux】Shell脚本编写基本语法
  • 快速获取 GitHub 个人资料成就徽章
  • LinkedList 源码分析
  • 数据清洗的具体方法有哪些?
  • 数字+文旅:虚拟数字人盘活景区文化旅游资源新策略
  • ajax 读取文件
  • Erric Gamma 关于resuable code的采访
  • Rust小练习,编写井字棋
  • Python异常检测- DBSCAN
  • ASP.NET MVC-font awesome-localhost可用IIS不可用
  • 51单片机快速入门之 串行通信 2024/10/21
  • Android Activity SingleTop启动模式使用场景
  • webpack生成的SourceMap更改生成路径
  • Python 打包成 EXE 的方法详解
  • 管理类联考 信息整理和经验分享
  • 洞察数据之美:用可视化探索销售与温度的关系
  • Java中String、StringBuffer和StringBuilder的区别是什么?
  • 【赵渝强老师】Oracle的参数文件与告警日志文件
  • 微信小程序25__实现卡片变换