今天我想到了一个项目,是这样设计的,我是用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 到灰度的转换 |
线程的设计太困了,明天再写吧