opencv处理图像(一)

发布于:2025-05-11 ⋅ 阅读:(26) ⋅ 点赞:(0)

今天我想到了一个项目,是这样设计的,我是用c++qt6开发的,我在主线程中用OpenGL显示渲染图像,再造一个opencv的工作类,就是根据主程序的需求,比如我需要一个高斯模糊处理的图像,我需要图像轮廓等等,按照主程序指令,在opencv中是用函数指针还是创建对象还没考虑好,反正就是要把任务丢到线程池里去跑,运行好了以后将结果通过信号槽传回给主线程。

opencv中设计的相关概念

Mat

mat就是存放图像的矩阵,他的通道和OpenGL的有些区别,使用时需要转换,opencv用的是BGR,而OpenGL用的是RGB或RGBA,坐标轴也是,opencv的原点在左上角,OpenGL的在左下角,使用时需要注意翻转坐标轴。

数据形式 Mat 维度 示例
灰度图像 2 阶矩阵 尺寸:(rows, cols)
彩色图像(RGB/BGR) 3 阶矩阵 尺寸:(rows, cols, channels)
视频序列 4 阶矩阵 尺寸:(frames, rows, cols, channels)
高维数据(如点云) N 阶矩阵 用户自定义维度(如 3D 体素网格)

读取图片,视频,摄像头

读取图片就是cv::imread()。

读取视频和摄像头差不多,只不过是输入设备不同而已,在无限或有限循环里面用videocapture对象read每一帧,每一帧waitkey()多久

高斯模糊

高斯模糊(Gaussian Blur)是图像处理中最常用的平滑滤波技术之一,它通过高斯函数生成的卷积核来模糊图像,能有效去除噪声、降低细节层次,同时保留图像的整体结构。通俗点介绍就是有点像我以前项目绘制的草帽,中间高,周围逐渐降低,越高代表权重越高(插值算法)

cv::GaussianBlur(src, dst, ksize, sigmaX, sigmaY=0, borderType=cv::BORDER_DEFAULT);
参数 说明
src 输入图像(支持多通道,如彩色图)
dst 输出图像(与输入同尺寸和类型)
ksize 高斯核大小(宽高为奇数的 cv::Size(w,h),如 cv::Size(5,5)
sigmaX X方向标准差(若设为0,则根据 ksize 自动计算:σ = 0.3*((ksize-1)*0.5 - 1) + 0.8)
sigmaY Y方向标准差(默认0,表示与sigmaX相同)
borderType 边界处理方式(推荐默认值)

sigma标准差不用填,程序会根据ksize自动计算 ,ksize就是高斯模糊的卷积核大小,他越大图像越模糊,必须是奇数。

  • 高斯核可分解为水平和垂直方向的一维核,减少计算量:
    // 等效于二维高斯模糊,但更快
    cv::Mat tmp;
    cv::GaussianBlur(img, tmp, cv::Size(15,1), 0); // 水平方向
    cv::GaussianBlur(tmp, blurred, cv::Size(1,15), 0); // 垂直方向

灰度图

这个灰度图就是个黑白的图片,单通道只有B上有数字,操作也很简单,将opencv的图像从BGR转换为GRAY 

​核心函数

cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);
参数 说明
src 输入的 ​彩色图像​(BGR 格式,即 OpenCV 默认读取的格式)
dst 输出的 ​灰度图像​(单通道)
cv::COLOR_BGR2GRAY 颜色空间转换代码,表示从 BGR 到灰度的转换

线程的设计太困了,明天再写吧 


网站公告

今日签到

点亮在社区的每一天
去签到