opencv编程基础

opencv基础

  1. opencv中坐标系
    opencv坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。其中x的取值范围为0~width/cols,y的取值范围为0~height/rows。
    在使用image.at(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at(Point(x2, x1))效果相同。

  2. mat定义 以及 访问

mat定义

#include <opencv2/opencv.hpp>

Mat img;
img.create(rows, int cols, int type);
img.create(Size size, int type);

mat访问

for (int i = 0; i < img.rows; i++) {
    uchar* img_ptr = img.ptr<uchar>(i);
    for (int j = 0; j < img.cols; j++) {
        img_ptr[j];
    }
}

for (int i=0; i<img.rows; i++) {
    for (int j=0; j<img.cols; j++) {
        img.at<Vec3b>(i,j)[0] = 0;
        img.at<Vec3b>(i,j)[1] = 0;
        img.at<Vec3b>(i,j)[2] = 0;
    }
}

myMat.ptr<float>(y)[2*x]; // Point[x,y]的first channel
myMat.ptr<float>(y)[2*x+1]; // Point[x,y]的second channel

mat常用方法

img.channels();  //通道数
img.type();   //CV_8UF3 
img.depth();   //CV_8U
img.convertTo(OutputArray m, int rtype, double alpha=1, double beta=0); // rtype通常指depth,channels不变,alpha: scale factor, beta: value added to the scaled values
img.clone();  //深拷贝,在内存中开辟了新区域,而“=”赋值则是浅拷贝,实质未拷贝任何数据
img.copyTo(img_); // 同img.clone()

对mat局部区域的访问和修改

Mat img = imread("1.jpg");
imshow("test", img);
waitKey();
Mat tmp = img(Range(50,100), Range(50, 100));  //Mat Mat::operator()(Range rowRange, Range colRange)先行后列
Mat dst = Mat::zeros(50, 50, CV_8UC3);
dst.copyTo(tmp);
imshow("test", img);
waitKey();
  1. Point, Size, Rect, Scalar数据结构
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;

typedef Size_<int> Size2i;
typedef Size2i Size;
typedef Size_<float> Size2f;

typedef Rect_<int> Rect;

typedef Scalar_<double> Scalar;
  1. 常用的Mat操作(http://docs.opencv.org/modules/core/doc/operations_on_arrays.html)
addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1) //按权重点加和
void dft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0) //求DFT,注意src一般构造成双通道Mat,一个channel作为实部,另一个是虚部,flags有一些参数DFT_INVERSE|DFT_COMPLEX_OUTPUT|DFT_REAL_OUTPUT
void divide(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1) //点除,可以除标量
void exp(InputArray src, OutputArray dst) // 每个元素exp
void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1)
void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1 )
void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray()) //求出src中最大最小值及其位置Point,并且只能找单通道的Mat


Scalar mean(InputArray src, InputArray mask=noArray())//每个通道单独算平均
Scalar sum(InputArray src)//每个通道单独求和


void sort(InputArray src, OutputArray dst, int flags)//flags: CV_SORT_EVERY_ROW | CV_SORT_EVERY_COLUMN | CV_SORT_ASCENDING | CV_SORT_DESCENDING


void merge(const Mat* mv, size_t count, OutputArray dst) // count为mv中要merge的Mat数
void split(const Mat& src, Mat* mvbegin) // mvbegin可以是vector<Mat>类型,按通道split

摘要: 本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。 目录  [隐藏] 1 一、简介 1.1 1、OpenCV的特点 1.1.1 (1) 总体描述 1.1.2 (2) 功能 1.1.3 (3) OpenCV模块 1.2 2、有用的学习资源 1.2.1 (1) 参考手册: 1.2.2 (2) 网络资源: 1.2.3 (3) 书籍: 1.2.4 (4) 视频处理例程(在 /samples/c/): 1.2.5 (5) 图像处理例程 (在 /samples/c/): 1.3 3、OpenCV 命名规则 1.3.1 (1) 函数名: 1.3.2 (2) 矩阵数据类型: 1.3.3 (3) 图像数据类型: 1.3.4 (4) 头文件: 1.4 4、编译建议 1.4.1 (1) Linux: 1.4.2 (2) Windows: 1.5 5、C例程 2 二、GUI 指令 2.1 1、窗口管理 2.1.1 (1) 创建和定位一个新窗口: 2.1.2 (2) 载入图像: 2.1.3 (3) 显示图像: 2.1.4 (4) 关闭窗口: 2.1.5 (5) 改变窗口大小: 2.2 2、输入处理 2.2.1 (1) 处理鼠标事件: 2.2.2 (2) 处理键盘事件: 2.2.3 (3) 处理滑动条事件: 3 三、OpenCV的基本数据结构 3.1 1、图像数据结构 3.1.1 (1) IPL 图像: 3.2 2、矩阵与向量 3.2.1 (1) 矩阵: 3.2.2 (2) 一般矩阵: 3.2.3 (3) 标量: 3.3 3、其它结构类型 3.3.1 (1) 点: 3.3.2 (2) 矩形框大小(以像素为精度): 3.3.3 (3) 矩形框的偏置和大小: 4 四、图像处理 4.1 1、图像的内存分配与释放 4.1.1 (1) 分配内存给一幅新图像: 4.1.2 (2) 释放图像: 4.1.3 (3) 复制图像: 4.1.4 (4) 设置/获取感兴趣区域ROI: 4.1.5 (5) 设置/获取感兴趣通道COI: 4.2 2、图像读写 4.2.1 (1) 从文件中读入图像: 4.2.2 (2) 保存图像: 4.3 3、访问图像像素 4.3.1 (1) 假设你要访问第k通道、第i行、第j列的像素。 4.3.2 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) 4.3.3 (3) 直接访问: (效率高,但容易出错) 4.3.4 (4) 基于指针的直接访问: (简单高效) 4.3.5 (5) 基于 c++ wrapper 的直接访问: (更简单高效) 4.4 4、图像转换 4.4.1 (1) 字节型图像的灰度-彩色转换: 4.4.2 (2) 彩色图像->灰度图像: 4.4.3 (3) 不同彩色空间之间的转换: 4.5 5、绘图指令 4.5.1 (1) 绘制矩形: 4.5.2 (2) 绘制圆形: 4.5.3 (3) 绘制线段: 4.5.4 (4) 绘制一组线段: 4.5.5 (5) 绘制一组填充颜色的多边形: 4.5.6 (6) 文本标注: 5 五、矩阵处理 5.1 1、矩阵的内存分配与释放 5.1.1 (1) 总体上: 5.1.2 (2) 为新矩阵分配内存: 5.1.3 (3) 释放矩阵内存: 5.1.4 (4) 复制矩阵: 5.1.5 (5) 初始化矩阵: 5.1.6 (6) 初始化矩阵为单位矩阵: 5.2 2、访问矩阵元素 5.2.1 (1) 假设需要访问一个2D浮点型矩阵的第(i, j)个单元. 5.2.2 (2) 间接访问: 5.2.3 (3) 直接访问(假设矩阵数据按4字节行对齐): 5.2.4 (4) 直接访问(当数据的行对齐可能存在间隙时 possible alignment gaps): 5.2.5 (5) 对于初始化后的矩阵进行直接访问: 5.3 3、矩阵/向量运算 5.3.1 (1) 矩阵之间的运算: 5.3.2 (2) 矩阵之间的元素级运算: 5.3.3 (3) 向量乘积: 5.3.4 (4) 单一矩阵的运算: 5.3.5 (5) 非齐次线性方程求解: 5.3.6 (6) 特征值与特征向量 (矩阵为方阵): 6 六、视频处理 6.1 1、从视频流中捕捉一帧画面 6.1.1 (1) OpenCV 支持从摄像头或视频文件(AVI格式)中捕捉帧画面. 6.1.2 (2) 初始化一个摄像头捕捉器: 6.1.3 (3) 初始化一个视频文件捕捉器: 6.1.4 (4) 捕捉一帧画面: 6.1.5 (5) 释放视频流捕捉器: 6.2 2、获取/设置视频流信息 6.2.1 (1) 获取视频流设备信息:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值