06- OpenCV:图像亮度与对比度、绘制形状与文字_opencv调整图像亮度和对比度(2)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

cv::Mat image(500, 500, CV_8UC3, cv::Scalar(255, 255, 255)); // 创建一个白色背景的图像

cv::Point pt1(100, 100); // 线段起始点坐标

cv::Point pt2(400, 400); // 线段结束点坐标

cv::Scalar color(0, 0, 255); // 线段颜色,红色

cv::line(image, pt1, pt2, color, 2, cv::LINE_AA); // 在图像上绘制线段

cv::imshow(“Line”, image);
cv::waitKey(0);


(2)画椭圆cv::ellipse


函数参数说明:



> 
> void cv::ellipse(  
>      cv::InputOutputArray img, // 输入输出图像,可以是Mat类型或者图像矩阵
> 
> 
>     cv::Point center, // 椭圆中心坐标
> 
> 
>     cv::Size axes, // 椭圆的长轴和短轴长度
> 
> 
>     double angle, // 椭圆旋转角度(逆时针为正)  
>      double startAngle, // 起始角度(顺时针方向为0度)  
>      double endAngle, // 终止角度(顺时针方向为0度)  
>      const cv::Scalar& color, // 椭圆颜色(BGR顺序)  
>      int thickness = 1, // 线条粗细,默认为1
> 
> 
>     int lineType = cv::LINE\_8, // 线条类型,默认为8-connected线条
> 
> 
>     int shift = 0 // 坐标点小数位数,默认为0
> 
> 
> );
> 
> 
> 


使用示例:这段代码创建了一个白色背景的图像,然后使用 `cv::ellipse` 函数在图像上绘制了一个红色椭圆。



cv::Mat image(500, 500, CV_8UC3, cv::Scalar(255, 255, 255)); // 创建一个白色背景的图像

cv::Point center(250, 250); // 椭圆中心点坐标

cv::Size axes(100, 200); // 长轴和短轴长度

double angle = 30; // 椭圆旋转角度

double startAngle = 0; // 起始角度

double endAngle = 360; // 结束角度

cv::Scalar color(0, 0, 255); // 椭圆颜色,红色

cv::ellipse(image, center, axes, angle, startAngle, endAngle, color, 2, cv::LINE_AA); // 在图像上绘制椭圆

cv::imshow(“Ellipse”, image);
cv::waitKey(0);


**(3)画矩形cv::rectangle**



> 
> // 函数原型:  
>  void cv::line(  
>      InputOutputArray img, // 输入输出图像。  
>      Point pt1, // 矩形的一个顶点坐标。  
>      Point pt2, // 矩形的对角顶点坐标。  
>      const Scalar& color, // 线段的颜色,可以是一个 `Scalar` 对象,表示 BGR 颜色值。  
>      int thickness = 1, // 线段的粗细,默认为 1。  
>      int lineType = LINE\_8,  //线段的类型,可以是 `LINE_4`(4邻接线段)、`LINE_8`(8邻接线段)或 `LINE_AA`(反锯齿线段)。  
>      int shift = 0 // 坐标点的小数位数。
> 
> 
> )
> 
> 
> 


使用示例:这段代码创建了一个白色背景的图像,然后使用 `cv::rectangle` 函数在图像上绘制了一个红色矩形。



cv::Mat image(500, 500, CV_8UC3, cv::Scalar(255, 255, 255)); // 创建一个白色背景的图像

cv::Point pt1(100, 100); // 矩形的一个顶点坐标

cv::Point pt2(400, 400); // 矩形的对角顶点坐标

cv::Scalar color(0, 0, 255); // 矩形颜色,红色

cv::rectangle(image, pt1, pt2, color, 2, cv::LINE_AA); // 在图像上绘制矩形

cv::imshow(“Rectangle”, image);
cv::waitKey(0);


**(4)画圆cv::circle 画填充cv::fillPoly**


`cv::circle` 函数用于在图像上绘制圆,而 `cv::fillPoly` 函数用于绘制填充多边形。



> 
> // 函数原型:  
>  void cv::circle(  
>      InputOutputArray img, // 输入输出图像。  
>      Point center, // 圆心坐标。  
>      int radius, // 圆的半径。
> 
> 
>     const Scalar& color, // 线段的颜色,可以是一个 `Scalar` 对象,表示 BGR 颜色值。  
>      int thickness = 1, // 线段的粗细,默认为 1。  
>      int lineType = LINE\_8,  //线段的类型,可以是 `LINE_4`(4邻接线段)、`LINE_8`(8邻接线段)或 `LINE_AA`(反锯齿线段)。  
>      int shift = 0 // 坐标点的小数位数。
> 
> 
> )
> 
> 
>   
>  void cv::fillPoly(  
>      cv::InputOutputArray img, // 输入输出图像,可以是Mat类型或者图像矩阵  
>      const cv::Point\*\* pts, // 多边形顶点的指针数组  
>      const int\* npts, // 每个多边形的顶点数  
>      int ncontours, // 多边形的数量  
>      const cv::Scalar& color, // 填充颜色(BGR顺序)
> 
> 
>     int lineType = LINE\_8, // 线条类型,默认为8-connected线条  
>      int shift = 0, // 坐标点小数位数,默认为0  
>      cv::Point offset = cv::Point() // 偏移量,默认为原点
> 
> 
> );  
>   
> 
> 
> 


**使用示例:**



/// 1、画圆
cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3); // 创建一个空白图像

cv::Point center(250, 250); // 圆心坐标

int radius = 100; // 半径

cv::Scalar color(0, 0, 255); // 颜色,这里为红色(BGR顺序)
int thickness = 2; // 线条粗细

cv::circle(image, center, radius, color, thickness);

/// 2、画填充多边形

cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3); // 创建一个空白图像

std::vectorcv::Point points; // 多边形顶点坐标

points.push_back(cv::Point(100, 100));
points.push_back(cv::Point(200, 100));
points.push_back(cv::Point(150, 200));

cv::Scalar color(0, 255, 0); // 颜色,这里为绿色(BGR顺序)

// 将多边形的顶点坐标放入一个vector中

std::vector<std::vectorcv::Point> polygons;
polygons.push_back(points);

// 填充多边形

cv::fillPoly(image, polygons, color);


##### **3、随机生成与绘制文本**


**(1)生成高斯随机数:`cv::RNG`类中的 gaussian (double sigma)**


该函数接受一个`double`类型的参数`sigma`,表示高斯分布的标准差。



cv::RNG rng; // 创建随机数生成器对象

double sigma = 1.0; // 高斯分布的标准差

double randomNum = rng.gaussian(sigma); // 生成一个高斯随机数


这样,你就可以生成一个服从高斯分布的随机数了。


**(2)生成正态分布随机数:`cv::RNG`类中的 uniform (int a, int b)**


该函数接受两个`int`类型的参数`a`和`b`,表示生成随机数的范围。



cv::RNG rng; // 创建随机数生成器对象

int a = 0; // 随机数范围的下界

int b = 10; // 随机数范围的上界

int randomNum = rng.uniform(a, b); // 生成一个正态分布的随机数


这样,你就可以生成一个在指定范围内的正态分布随机数了。


##### 4、代码演示



#include <opencv2/opencv.hpp>
#include

using namespace std;
using namespace cv;
Mat bgImage;
const char* drawdemo_win = “draw shapes and text demo”;
void MyLines();
void MyRectangle();
void MyEllipse();
void MyCircle();
void MyPolygon();
void RandomLineDemo();
int main(int argc, char** argv) {
bgImage = imread(“D:/vcprojects/images/test1.png”);
if (!bgImage.data) {
printf(“could not load image…\n”);
return -1;
}
//MyLines();
//MyRectangle();
//MyEllipse();
//MyCircle();
//MyPolygon();

//putText(bgImage, "Hello OpenCV", Point(300, 300), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 23, 200), 3, 8);
//namedWindow(drawdemo_win, CV_WINDOW_AUTOSIZE);
//imshow(drawdemo_win, bgImage);

RandomLineDemo();
waitKey(0);
return 0;

}

void MyLines() {
Point p1 = Point(20, 30);
Point p2;
p2.x = 400;
p2.y = 400;
Scalar color = Scalar(0, 0, 255);
line(bgImage, p1, p2, color, 1, LINE_AA);
}

void MyRectangle() {
Rect rect = Rect(200, 100, 300, 300);
Scalar color = Scalar(255, 0, 0);
rectangle(bgImage, rect, color, 2, LINE_8);
}

void MyEllipse() {
Scalar color = Scalar(0, 255, 0);
ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 360, color, 2, LINE_8);
}

void MyCircle() {
Scalar color = Scalar(0, 255, 255);
Point center = Point(bgImage.cols / 2, bgImage.rows / 2);
circle(bgImage, center, 150, color, 2, 8);
}

void MyPolygon() {
Point pts[1][5];
pts[0][0] = Point(100, 100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);

const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(255, 12, 255);

fillPoly(bgImage, ppts, npt, 1, color, 8);

}

void RandomLineDemo() {
RNG rng(12345);
Point pt1;

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

id RandomLineDemo() {
RNG rng(12345);
Point pt1;

[外链图片转存中…(img-NLvyvnqh-1715498843914)]
[外链图片转存中…(img-dHseH49k-1715498843914)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值