17.鼠标的响应与响应
处理鼠标事件的重要函数setMouseCallback()
void setMouseCallback(
const string&name, 指定要监听鼠标事件的窗口
onMouse, 鼠标事件的回调函数的指针
void*userdata 用户自定义数据的指针
);
鼠标回调函数签名
void onMouse(int event, 鼠标事件类型
int x,int y, 当前鼠标坐标
int flags, 事件附加标志(如Ctrl/Shift)
void*userdata 从setMouseCallback传递的数据
);
鼠标事件
| EVENT_MOUSEMOVE | 鼠标移动 |
| EVENT_LBUTTONDOWN | 左键按下 |
| EVENT_LBUTTONUP | 左键释放 |
| EVENT_RBUTTONDOWN | 右键按下 |
| EVENT_RBUTTONUP | 右键释放 |
18.数据类型转换和归一化
convertTo()数据类型转换
imag.convertTo(dst,type,scale,offset);
将imag转为type类型的dst,并且选择缩放scale和偏移量offset
imag.convertTo(dst,CV_8UC3);
normalize()归一化
归一化:把图像的像素值从原来的范围(比如 0~255)线性拉伸或压缩到一个新的范围(比如 0~1 或 50~200)。
归一化公式:

normalize(src,dst,
alpha, 目标范围下限,也就是最大值
beta, 目标范围上限,也就是最小值
norm_type 归一化方法:NORM_MINMAX缩放到【beta,alpha】
);
normalize(dst,dst,1.0,0,NORM_MINMAX);
19.图像放缩与插值
resize()
void cv::resize(
cv::InputArray src, 输入图像
cv::OutputArray dst, 输出图像
cv::Size dsize, 目标尺寸(宽,高)
double fx = 0, 水平缩放因子
double fy = 0, 垂直缩放因子
int interpolation = INTER_LINEAR 插值方法
);
插值方法
| 枚举值 | 计算复杂度 | 适用场景 |
| INTER_NEAREST | 最低 | 最快,但会产生锯齿(像素复制) |
| INTER_LINEAR | 中 | 平衡速度与质量(默认) |
| INTER_CUBIC | 高 | 高质量放大(4x4像素区域) |
| INTER_AREA | 中 | 缩小图像时最佳(区域像素平均) |
| INTER_LANCZOS4 | 最高 | 8x8像素区域,高质量放大 |
Mat zoomin,zoomax;
int h=image.rows;
int w=image.cols;
缩小到原来的一半
resize(image,zoomin,Size(w/2,h/2),0,0,INTER_LINEAR);
放大到原图的1.5倍
resize(image,zoomax,Size(w*1.5,h*1.5),0,0,INTER_LINEAR);
20.图像翻转与图像旋转
图像翻转 flip()
flip(
src,
dst,
int flipCode
);
flip(image,dst,0); 上下翻转
flip(image,dst,0); 左右翻转
flip(image,dst,0); 180°旋转
计算旋转矩阵 getRotationMatrix2D()
getRotationMatrix2D(
Point2f center, 旋转中心点:Point2f 类型,如 Point2f(w/2, h/2))
double angle, 旋转角度:顺时针为正,单位:度
double scale 缩放因子:1.0 表示不缩放
);
Mat M=getRotationMatrix2D(Point2f(w/2,h/2),45,1.0);
仿射变换 warpAffine()
void cv::warpAffine(
InputArray src,
OutputArray dst,
InputArray M, 仿射变换矩阵
Size dsize, 输出图像尺寸
int flags = INTER_LINEAR, 插值方法:(常用 INTER_LINEAR)
int borderMode = BORDER_CONSTANT, 边界填充模式(默认 BORDER_CONSTANT)
const Scalar& borderValue = Scalar() 边界填充值(默认黑色,Scalar(255,255,0) 表示黄色)
);
warpAffine(imag,dst,M,Size(nw,nh),INTER_LINEAR,0,Scalar(255,255,0));
21.视频文件/摄像头的使用
VideoCapture 构造函数
摄像头捕获
cv::VideoCapture capture(int index);
从视频文件读取
cv::VideoCapture capture(const String& filename);
capture.read()
capture.read(frame); 读取下一帧到frame变量
release()
释放VideoCapture对象占用的资源
capture.release(); 释放视频捕获资源
destroyAllWindows()
destroyAllWindows(); // 关闭所有OpenCV窗口
22.直方图均衡化
直方图均衡化是一种用于增强图像对比度的图像处理技术,它通过重新分配图像像素的强度值,使图像的直方图分布更加均匀,从而改善图像的视觉效果。
equalizeHist()
equalizeHist(gray, 输入图像(必须是8位单通道灰度图像)
dst 输出图像(与输入图像大小和类型相同)
);
Mat gray;
cvtColor(image,gray,COLOR_BGR2GRAY);
Mat dst;
equalizeHist(gray,dst);
23.图像卷积操作
均值模糊 (blur)基础马赛克
让图像变模糊,适合需要快速简单模糊的场景
void blur(
InputArray src, 输入:要模糊的原始图片
OutputArray dst, 输出:模糊后的图片
Size ksize, 模糊力度:比如Size(5,5)表示用5x5的方块来模糊
Point anchor=Point(-1,-1), 锚点位置(不用改,默认中心点就行)
int borderType=BORDER_DEFAULT 边界处理方式(一般不用改)
)
Mat image=imread("XXXXX");
Mat blurred_image;
blur(image,blurred_image,Size(15,15));
Size()数字越大模糊力度越大
24.高斯模糊
高斯模糊 (GaussianBlur)背景虚化
中间清晰向边缘逐渐模糊,适合需要自然过渡的模糊。
void GaussianBlur(
InputArray src, 输入:原始图片
OutputArray dst, 输出:模糊后的图片
Size ksize, 模糊核大小:必须是奇数,比如3,5,7...否则找不到中心点
double sigmaX, 模糊程度:数字越大越模糊(建议1.0-3.0)
double sigmaY=0, 垂直方向模糊程度(0表示和sigmaX一样)
int borderType=BORDER_DEFAULT 边界处理(一般不用改)
)
Mat image=("XXXXXXXX");
Mat soft_focus;
GaussianBlur(image,soft_focus,Size(0,0),3.0);
25.高斯双边模糊
双边滤波 (bilateralFilter)智能美颜
像美颜相机一样,平滑皮肤但保留眼睛、嘴唇等边缘细节。
void bilateralFilter(
InputArray src, 输入:原始图片
OutputArray dst, 输出:处理后的图片
int d,
磨皮力度:建议5-15(太大速度会变慢)
double sigmaColor,
颜色标准差:20-100:控制颜色相似性。值越大,颜色差异大的像素也会被混合(平滑更强)
double sigmaSpace,
空间标准差:类似sigmaColor,控制空间相似性。值越大,距离远的像素也会被混合
int borderType=BORDER_DEFAULT 边界处理(一般不用改)
)
Mat image=imread("XXXXXX");
Mat beauty;
bilateralFilter(image,beauty,12,60,60);

1381

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



