目录
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¢er,
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);

598

被折叠的 条评论
为什么被折叠?



