第三周OPENCV学习笔记

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值