opencv核心类型

mat

Mat替代lplImage

创建和清理mat空间
  • Mat mat(3000, 4000, CV_8UC3);//3000行,4000列数组,数组里存放3个unsigned char类型的数据
  • mat.create(rows, cols, CV_8UC1);//行数,列数,如果mat已经有空间,create时会自动清理已有空间
  • release或者析构:引用计数为1时释放

处理类型一定要用unsigned char而不是char

3*3RGB图像存放方式(连续)

[iimage

isContinuous
  • 判断存储空间是否连续
  • 通过step记录
直接地址访问连续空间
复制代码
int size = mat.rows*mat.cols*mat.elemSize();
for(int i = 0; i< size; i+3)//3是因为RGB
{
  mat.data[i] = 0; //B
  mat.data[i+1] = 0; //G
  mat.data[i+2] = 0; //R
}

//优化编码后效率高13ms (4000*3000)

直接地址访问不连续空间
复制代码
for(int i = 0; i < mat.row; i++)
{
  for(int j = 0; j < mat.cols; j++)
  {
    (&mat.data[i*mat.step])[j*3] = 255;//B
    (&mat.data[i*mat.step])[j*3 + 1] = 255;//G
    (&mat.data[i*mat.step])[j*3 + 2] = 1;//R
  }
}
通过ptr接口遍历Mat(模板函数)
  • 性能基本等同与地址访问
  • mat.ptr(row);//返回的指针
  • mat.ptr(row, col);
通过at接口遍历Mat(模板函数)
  • 接口最简单的遍历方法

    mat.at(row, col)[0] = 255;
    mat.at(row, col)[1] = 0;
    mat.at(row, col)[2] = 0;

at可以使用try{} catch(.../cv::Exception &ex){}捕获异常

通过迭代器遍历Mat
  • 可以不用管mat的行列
    auto it = mr.begin();
    auto it_end = mr.end();

ROI感兴趣区域

cv::Rect rect(100, 100, 300, 300);

像素格式和灰度图

RGB, YUV, GRAY

cvtColor(src, img, COLOR_BGR2GRAY);//源图像,目标凸显,转换方式,利用多线程等方式提高效率

自己实现转换:

Gray = (R30 + G59 + B*11 + 50)/100

二值化和阈值

  • THRESH_BINARY 二进制阈值化
  • THRESH_BINARY_INV 反二进制阈值化

改变图片的对比度和亮度

g(i,j) = a*f(i,j) + b

a 1.0~3.0(对比) b 0~100(亮度)

saturate_cast防止移除函数

图像尺寸调整

  • INTER_NEAREST 近邻算法(最快)

    int sx, sy = 0;//原图对应的坐标
    float fy = float(src.rows)/out.rows;
    float fx = float(src.cols)/out.cols;
    for(int y = 0; y< out.rows;y++){
    sy = fyy + 0.5;//+0.5四舍五入
    for(int x = 0; x < out.cols;x++){
    sx = fx
    x + 0.5;
    out.at(y,x) = src.at(sy, sx);
    }

    }

  • CV_INTER_LINEAR 双线程差值(缺省使用)

滤波:

输入图像中像素的小领域来产生输出图像的方法,在信号处理中,这种方法称为滤波(filtering).其中,最常用的是线性滤波:输出像素是输入领域像素的加权和.

双线性内插值:

是由源图像位置在它附近的2*2区域4个邻近像素的值通过加权平均计算得出的.

低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊.

图像金字塔

高斯金字塔(Gaussian pyramid):用来向下采样

  • 获取G(i+1)将G(i)与高斯内核卷积
  • 将所有偶数行和列去除

拉普拉斯金字塔(Laplacian pyramid):用来从金字塔底层图像重建上层未采样图像

  • 用来从金字塔底层图像重建上层未采样图像
  • 首先,将图像扩大两杯,新增以0填充
  • 高斯内核(乘以4)与放大后的图像卷积

两幅图像混合(blending)

  • dst = src1*a + src2*(1-a) + gamma//gamma增益
  • a=0\~1
  • 画面叠化(cross-dissolve)效果
  • addWeighted(src1, a, src2, 1-a, 0.0, dst);//两幅图像大小需一致

图像旋转和镜像

  • cv::rotate(src, dst, type);

    • ROTATE_180
    • ROTATE_90_CLOCKWISE
    • ROTATE_90_COUNTERCLOCKWISE
  • cv::flip(src,dst, type);//镜像type 0(x), 1(y), -1

###通过ROI图像合并

打开摄像头接口说明和源码分析

  • VideoCapture
  • bool open(int index)
  • VideoCapture cap(index)
  • open(int cameraNum, int apiPrefrence)

打开视频流文件

  • bool open(const String &filename)

  • VideoCapture cap(const String &file)

  • bool open(const String &filename, int apiPrefrence)

  • 关闭和空间释放

  • ~VideoCapture

  • release

读取一帧视频

read(OutputArray image);

  • bool grab() 读取并解码
  • virtual bool retrieve(OUtputArray , intflag= 0):图像色彩转换
  • vc>>mat

获取视频,相机属性

  • CAP_PROP_FPS帧率
  • CAP_PROP_FRAME_COUNT 总帧数
  • CAP_PROP_POS_FRAMES 播放帧的位置
  • CAP_PROP_FRAME_WIDTH HEIGHT

VideoWriter

  • open(const String &filename, int fourcc, //VideoWrite::fourcc('H', '2', '6', '4')
    double fps, Size frameSize,bool isColor=true)

release

  • void write(const Mat&)
  • cvVideoWriter_FFMPEG::writeFrame
相关推荐
冬奇Lab2 分钟前
开源项目第222期:security-audit — Cloudflare 的安全审计 Skill,把 Coding Agent 变成六阶段安全审计器
人工智能·开源·资讯
卤煮最下饭9 分钟前
在眼镜上背单词:一个 AIUI 对话式智能体的诞生
人工智能
Java后端的Ai之路16 分钟前
Python进阶探索17 - Python中的深拷贝与浅拷贝
人工智能·python·ai·浅拷贝·深拷贝
知识分享小能手32 分钟前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习
hzxxxz44 分钟前
26%的研发交给AI之后-人的位置换到了哪里
人工智能
m0_587383001 小时前
深圳24小时自助健身房系统软件开发实战:架构设计与部署指南
人工智能·数据挖掘·系统架构·需求分析
Joy T1 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者1 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
He BianGu1 小时前
【WPF-VisionMaster】机器视觉通用平台V5.0版本发行说明
opencv·c#·wpf·halcon·机器视觉·visionmaster
西柚研究生1234561 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测