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图像存放方式(连续)

i[image](http://) ###### 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 = (R*30 + G*59 + 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 = fy*y + 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
相关推荐
牛客企业服务41 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
视觉语言导航1 小时前
RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
人工智能·深度学习·机器人·具身智能
**梯度已爆炸**1 小时前
自然语言处理入门
人工智能·自然语言处理
ctrlworks2 小时前
楼宇自控核心功能:实时监控设备运行,快速诊断故障,赋能设备寿命延长
人工智能·ba系统厂商·楼宇自控系统厂家·ibms系统厂家·建筑管理系统厂家·能耗监测系统厂家
BFT白芙堂2 小时前
睿尔曼系列机器人——以创新驱动未来,重塑智能协作新生态(上)
人工智能·机器学习·机器人·协作机器人·复合机器人·睿尔曼机器人
aneasystone本尊2 小时前
使用 MCP 让 Claude Code 集成外部工具
人工智能
静心问道2 小时前
SEW:无监督预训练在语音识别中的性能-效率权衡
人工智能·语音识别
羊小猪~~3 小时前
【NLP入门系列五】中文文本分类案例
人工智能·深度学习·考研·机器学习·自然语言处理·分类·数据挖掘
xwz小王子3 小时前
从LLM到WM:大语言模型如何进化成具身世界模型?
人工智能·语言模型·自然语言处理
我爱一条柴ya3 小时前
【AI大模型】深入理解 Transformer 架构:自然语言处理的革命引擎
人工智能·ai·ai作画·ai编程·ai写作