opencvc++学习笔记第二周

目录

7.亮度与对比度调整

8.键盘响应操作

9.OPENCV自带颜色表操作

10.图像像素的逻辑操作

11.通道分离和合并

12图像色彩空间转换(人像背景更换)

13图像像素统计的操作

14图像几何形状绘制

 15.随机数和随机颜色

16.多边形填充与绘制


7.亮度与对比度调整

对两个图像进行加权融合

 addWeighted()函数

void cv::addWeighted(
    cv::InputArray src1,     // 第一个输入图像(如原图像)
    double alpha,            // 第一个图像的权重(对比度系数)
    cv::InputArray src2,     // 第二个输入图像(需与src1尺寸、类型相同)
    double beta,             // 第二个图像的权重
    double gamma,            // 加到结果上的标量值
    cv::OutputArray dst,     // 输出图像
    int dtype = -1           // 可选输出类型(默认-1表示与输入相同)
);

src1必须和src2的尺寸和类型相同

gamme加载结果上的常数值,用于调整亮度,正值增亮,负值变暗

alpha和beta图像的权重占比

修改size和type和通道

resize()将图像方所到相同的尺寸

resize(输入图像,输出图像,目标尺寸)

Mat imag1=imread();

Mat imag2=imread();

Size size=imag1.size();

resize(imag2,imag2,size);

convertTo()将图像转换为相同的类型

convertTo(输出图像,目标类型);

Mat imag1=imread();

Mat imag2=imread();

int type=imag1.type();

imag2.convertTo(imag2,type);

cvtColor()转换通道数

8.键盘响应操作

int cv::waitKey(int delay=0)用来控制程序暂停和处理键盘事件的重要函数

delay:

=<0 无限等待,直到用户按下任意键

>0   等待指定毫秒数,期间若用户按键特提前返回,超时后返回-1

返回值 若按键返回按键的ASCII值!!!!!(例如Esc=27)

        若超时未按键,返回-1

9.OPENCV自带颜色表操作

给定颜色映射到图像上

applyColorMap(输入图像(1或者3)个通道,输出图像3通道,色彩映射类型)

void applyColorMap(
inputarray src,    输入图像
outputarray dst,    输出图像
int colormap        色彩映射类型
);

输入图像若为三通道,则自动转为灰度图,再映射

色彩映射:

COLORMAP_AUTUMN,      // 红到黄渐变(秋日)
COLORMAP_BONE,        // 灰白色调(医学)
COLORMAP_JET,         // 蓝青绿黄红渐变(热力图)
COLORMAP_WINTER,      // 蓝到绿渐变(低温)
COLORMAP_RAINBOW,     // 彩虹色渐变
COLORMAP_OCEAN,       // 深蓝到青绿渐变(海洋)
COLORMAP_SUMMER,      // 绿到黄渐变(夏季)
COLORMAP_SPRING,      // 紫到黄渐变(春季)
COLORMAP_COOL,        // 青到紫渐变(冷色调)
COLORMAP_HOT,         // 黑红黄白渐变(热成像)
COLORMAP_PINK,        // 粉色调(3D模型)
COLORMAP_PARULA,      // 蓝绿黄渐变(科学)
COLORMAP_MAGMA,       // 黑红紫白渐变(高对比度)
COLORMAP_INFERNO,     // 黑红黄白渐变(热辐射)
COLORMAP_PLASMA,      // 紫蓝绿黄渐变(AI可视化)
COLORMAP_VIRIDIS,     // 绿蓝黄渐变(科学首选)
COLORMAP_CIVIDIS,     // 蓝绿黄渐变(色盲友好)
COLORMAP_TWILIGHT,    // 蓝紫黑渐变(黄昏)
COLORMAP_TWILIGHT_SHIFTED, // 偏移版黄昏
COLORMAP_TURBO        // 红黄绿蓝渐变(高精度)

10.图像像素的逻辑操作

表示一个矩形区域

Rect(x,y,width,height)

矩形左上角坐标,矩形的宽度和高度

vector<Rect>raw={
Rect(95,90,210,220),
Rect(300,400,150,100)
};
计算中心点
Rect rect(100,50,200,150);
Point center(rect.x+rect.width/2,rect.y+rect.height/2);
cout<<"center:"<<center<<endl;
//输出[200,125]

绘制一个矩形

rectangle(imag,Rect rec,const Scalar&color,thickness,linetype,shift)

rectangle(目标图像,矩形区域,颜色,线条粗细(-1表示填充),线条类型,坐标点的小数点位数)

绘制多个矩形
vector<Rect>vec={
Rect(100,100,100,100),
Rect(50,50,100,100)
}
for(const auto&it:vec){
    rectangle(image,it,Scalar(255,255,0),1);
}
抗锯齿绘制(平滑边缘)
Rect rect(25,10,50,50);
rectangle(image,rect,Scalar(0,0,255),2,LINE_AA);
LINE_AA表示这个是抗锯齿线型

Mat result=~imag;

~按位取反操作符,对图中的每个像素值进行按位取反

执行两个图像的逐位运算

与运算,只有对应位置的像素都为非0,结果才为非0

bitwise_and(第一个图像,第二个图象,输出图像)  交集

对应位置的像素只要有一个非零,结果就为非零。

bitwise_or(第一个图像,第二个图象,输出图像)  并集

等同于~操作符。

bitwise_not(输入图像,输出图像)  取反

11.通道分离和合并

将多通道图像分离成多个单通道图像

split(输入的多通道图像,输出的单通道图像数组)

void split(
    InputArray m,                // 输入的多通道图像
    OutputArrayOfArrays mv       // 输出的单通道图像数组(通常为vector<Mat>)
);
Mat image = imread("test.jpg"); // 读取BGR三通道图像
vector<Mat> mv;                 // 定义存储单通道图像的向量
split(image, mv);               // 分离通道

// mv[0]为蓝色通道(B),mv[1]为绿色通道(G),mv[2]为红色通道(R)
imshow("Blue Channel", mv[0]);
imshow("Green Channel", mv[1]);
imshow("Red Channel", mv[2]);

将多个单通道图像合并为一个多通道图像

merge()

void merge(
    InputArrayOfArrays mv,       // 输入的单通道图像数组(如vector<Mat>)
    OutputArray dst              // 输出的多通道图像
);
vector<Mat> mv;
// 假设已经有三个单通道图像mv[0], mv[1], mv[2]
Mat mergedImage;
merge(mv, mergedImage); // 合并为三通道图像(BGR顺序)

更灵活地重拍图像通道

 mixChannels()

void mixChannels(
    const Mat* src,              // 输入图像数组(指针)
    size_t nsrcs,                // 输入图像数量
    Mat* dst,                    // 输出图像数组(指针)
    size_t ndsts,                // 输出图像数量
    const int* fromTo,           // 通道映射表(源通道→目标通道)
    size_t npairs                // 映射对的数量
);

映射对数量:有多少个:源通道->目标通道

from_to数组:每对整数表示[源通道索引, 目标通道索引],例如:

int from_to[] = { 0,2, 1,1, 2,0 }; // B→R, G→G, R→B(交换B和R通道)

例子

Mat src = imread("test.jpg"); // BGR图像
Mat dst(src.size(), src.type()); // 创建与src同尺寸、类型的输出图像

// 交换B和R通道(BGR→RGB)
int from_to[] = { 0,2, 1,1, 2,0 };
mixChannels(&src, 1, &dst, 1, from_to, 3);

imshow("BGR Image", src);
imshow("RGB Image", dst); // 注意:OpenCV显示函数仍按BGR解释,因此颜色会反转

存储多个Mat对象动态数组

vector<Mat>mv

vector<Mat> channels; // 创建一个空的"收纳盒"

// 向盒子里添加三个单通道图像(模拟BGR)
Mat blue = Mat::zeros(Size(100, 100), CV_8UC1);  // 蓝色通道(全黑)
Mat green = Mat::zeros(Size(100, 100), CV_8UC1); // 绿色通道(全黑)
Mat red = Mat::ones(Size(100, 100), CV_8UC1) * 255; // 红色通道(全白)

channels.push_back(blue);   // 将蓝色通道放入盒子(位置0)
channels.push_back(green);  // 将绿色通道放入盒子(位置1)
channels.push_back(red);    // 将红色通道放入盒子(位置2)

// 从盒子里取出绿色通道并显示
imshow("Green Channel", channels[1]); 

12图像色彩空间转换(人像背景更换)

检测图像中像素值在指定范围的区域,并且生成二值掩码(黑0白255)

inRange()

void inRange(
    inputarray src,    输入图像
    lowerb,            下界值
    upperb,            上界值
    dst                输出掩码(CV_8U类型)
);

输出掩码部分,选中的区域会变成白色255,未选中区域变成黑色0

提取部分代码范围

将源图像的内容复制到目标图像

无掩码

imag.copyTo(bst);

将imag完全复制到bst

有掩码

imag.copyTo(dst,mask);

仅复制mask中的白色像素对应的imag区域到dst

mask必须是CV_8U,且尺寸与imag相同

Mat src1=imread();
Mat hsv;

cvtColor(src1,hsv,COLOR_BGR2HSV);

Mat mask;
inRange(hsv,Scalar(0,0,0),Scalar(a,b,c),mask);确定白色背景位置

Mat imag=Mat::zeros(src1.size(),src1.type());
imag=Scalar(255,0,0);背景颜色

bitwise_not(mask,mask);把原来白色背景变为黑色背景,原来黑色主体变为白色主体
src1.copyTo(imag,mask);把src1中的mask白色主体部分复制到imag背景颜色上

imshow

13图像像素统计的操作

计算单通道图像中的最小值和最大值,并返回它们的位置坐标 

minMaxLoc()

void minMaxLoc(
    src,        输入单通道图像
    double*minVal,        存储最小值的指针
    double*maxVal,        存储最大值的指针
    Point*minLoc,         存储最小值位置的Point指针
    Point*maxLoc          存储最大值位置的Point指针
);以上指针都可以为NULL

返回Point类型表示像素位置X列Y行,原点在图像左上角

maxloc.x  maxloc.y

Mat gray=imread("",IMREAD_GRAYSCALE);
double minval,maxval;
Point minloc,maxloc;
minMaxLoc(gray,&minval,&maxval,&minloc,&maxloc)

cout<<"最小值"<<minval<<"x="<<minloc.x<<"y="<<minloc.y<<endl;最暗点
cout<<"最大值"<<maxval<<"x="<<maxloc.x<<"y="<<maxloc.y<<endl;最亮点

计算图像各通道的均值和标准差

meanStdDev()

void meanStdDev(
        src,    输入图像,单通道或多通道
        mean,    输出均值Mat类型
        stddev    输出标准差Mat类型
);
mean = [B均值; G均值; R均值]
stddev = [B标准差; G标准差; R标准差]

标准差反应离散程度

Mat imag=imread();
Mat mean,stddev;
meanStdDev(image,mean,stddev);
cout<<"均值"<<mean<<endl<<"平均差"<<stddev<<endl;

14图像几何形状绘制

Rect类

Rect(int x,int y,int width,int height)

x,y矩形左上角的坐标

width,height矩形的宽和高

绘制矩形

rectangle()

void rectangle(
Mat&imag,    引用图像
Rect rec,    REC区域
const Scalar& color,    颜色
int thickness,    -1填充
int line,    线条的类型LINE_AA抗锯齿LINE_8等
int shift    坐标中的小数位数
);
rectangle(imag,Rect(200,100,100,100),Scalar(255,0,0),2,LINE_8,0);

绘制矩形

circle()

void circle(
Mat&imag,
Point center,    POINT类型的中心点
int radius,        半径
const Scalar&color,
int thinkness,    
int linetype,    
int shfit    小数点的个数
);
circle(imag,Point(50,50),50,Scalar(0,0,255),-1,8,0);
抗锯齿绘制
Point center(50,50);
int radius=50;
circle(image,center,radius,Scalar(255,0,0),2,LINE_AA);

绘制直线

line()

void line(
Mat&imag,
Point p1,    POINT类型两个点位的坐标
Point p2,
const Scalar&color,
int thickness,
int linetype,
int shift
);
line(imag,Point(0,0),Point(100,100),Scalar(255,0,0),2,LINE_AA,0);

RotatedRect类表示旋转矩形

RoatatedRect(
const Point&center,        
const Size&size,         (width,height)
float angle
);

angle旋转角度,顺时针为正

RotatedRect rrt(Point(100,100),Size(100,50),30.0)

绘制椭圆

ellipse()函数

使用RotatedRect

void ellipse(
Mat &imag,
const RotatedRec& box,
const Scalar&color,
int thickness,
int linetype
);

不使用
void ellipse(
Mat& imag,
Point center,    椭圆中心点坐标
Size axes,        椭圆的长半轴和短半轴
double angle,        椭圆整体旋转角度
double startangle,       椭圆弧度的起始角度
double endangle,           椭圆弧度的结束角度
const Scalar&color,
int thickness,
int linetype,
int shift                坐标小数位数
);

使用的例子

RotatedRect rrt(Point(50,50),Size(80,120),30.0);
ellipse(imag,rrt,Scalar(255,0,0),2,8,0);

不使用的例子

ellipse(bg, Point(30, 80), Size(30, 20), 30, 0, 270, Scalar(0, 255, 0), 2,8,0);

 15.随机数和随机颜色

RNG mg(1555);

mg.uniform(a,b);

RNG类  基于Mersenne Twister算法生成高质量伪随机数序列

mg对象名

1555(seed)初始化随机生成器种子

uniform:RNG类的成员函数

随机生成包括a<=x<=b的数字

16.多边形填充与绘制

在图片上绘制多边形或直线

polylines()

void polylines(){
imag,        目标图像
pts,            折线顶点集合
bool isclosed,        是否闭合
const Scalar&color,
int thickness,            此处-1无法填充
int linetype,
int shift        坐标小数点个数
);
单个多边形绘制
vector<Point>vec1={{200,200},{100,100},{300,100},{500,500}};
vector<vector<Point>>poly={vec1};显示定义变量
polylines(image,poly,true,Scalar(0,0,255),2,LINE_AA,0);

多个多边形绘制
vector<vector<Point>>multipoly=
{
{{100,100},{50,50},{250,250}},
{{250,250},{20,20},{50,50}}
};
polylines(image,multipoly,true,Scalar(250,250,0),2);

填充多边形区域

fillPoly()用于在图像上填充多边形区域

void fillPoly(){
imag,
pts,            多边形顶点集合
const Scalar&color,        填充颜色
int linetype,        
int shift        
);

  

填充一个多边形
fillPoly(image,vector<vector<Point>>{poly},Scalar(250,250,0));
填充多个多边形,带透明效果
Mat overlay =image.clone();
fillPoly(overlay,vector<vector<Point>>,Scalar(250,0,0);
addWeight(overlay,0.5,image,0.5,0,image);

用于在图像上绘制轮廓或者填充

drawContours()

void drawContours(
imag,
contours,
int condox,    轮廓索引,如同数组索引,从0开始,-1绘制全部
const Scalar&color,
int thickness   -1填充
int linetype
);
vector<vector<Point>>contours={
{{1,1},{50,50},{100,100},{200,200}},
{{20,20},{30,30},{40,40}}
};
绘制轮廓
drawContours(image,contours,-1,Scalar(0,0,250),2);

填充模式
drawContours(image,contours,0,Scalar(0,0,250),-1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值