【QT+OpenCV】OpenCV的基本功能

Matg格式:
    Mat是matrix(矩阵)的缩写,本质上就是一个二维数组,用于存放图片数据的类
    int cv::cols   宽度
    int cv::rows   高度
    int cv::depth() 深度
    int cv::channels() 通道
    uchar* cv::data  数据指针

Mat图片数据:
    图片宽度:横向像素点个数
    图片高度:纵向像素点个数
    图片深度:单一像素数据表示(精度)    U/S/F ->uchar/short/float
    #define CV_8U  0       #define CV_8S  1
    #define CV_16U  2     #define CV_16S  3
    #define CV_32S  4     #define CV_32F  5
    #define CV_64F  6     #define CV_16F  7
    图片通道:像素通道  C1 -> 灰度C3 -> RGB C4 -> ARGB

以下是通过QT界面展示,OpenCV中Mat的基本属性:

1.在OpenCV通过Cmake编译后,将编译后的文件目录按照代码的方式放置到新建项目的.pro文件

 2.在widget.cpp中添加OpenCV两个头文件,新建一个Mat对象并初始化,详细内容看上面说明,接着用qDebug输出Mat对象的基本属性

imgproc模块:
    1.读取图片,imgproc模块中的接口
    cv::Mat cv::imread(const String & filename, int flags = IMREAD_COLOR)
    filename:文件名
    flags:读取图片的模式,默认为1,IMREAD_COLOR三通道图像

    2.保存图片,imgproc模块中的接口
    bool imwrite(const string& filename, inputArray img, const vector<int>&params=vector<int>());
    filename:文件名
    img:要保存的图片
    params:特指参数,一般不写

 highgui模块:
    1.显示图片在窗口中
    void cv::imshow(const String & winname, InputArray mat)
    winname:窗口的名字
    mat:图片的矩阵

    2.等待按键
    int cv::waitKey(int delay = 0)
    delay:延迟等待的秒数,如果等待时间内没有按下键盘,返回-1,成功返回按下的按键编码,默认0表示永远等待

以下是imgpro和highguil两个模块的基本函数,读取保存图片,展示等操作

1.首先说明保存图片的方式,新建Mat对象并初始化,输出相关信息,将新建的Mat对象保存至某个文件路径下(这里的"\"应换成"\\",关于不可打印字符的表示),并设置名字和格式

2.运行程序后,在桌面(设置的路径)上能看见保存的图片

 3.右键打开属性,查看详细信息,跟设置的属性一致,因为没有设置图片的颜色或者没有保存已有的图片,所以默认输出一张没有颜色的图片

 4.读取文件目录下的图片并保存至Mat对象中,输出Mat对象基本属性并展示在窗口中

 5.添加waitKey(0),则先显示图片,后点击任意键QT默认窗口显示

Mat对象改变大小:
    resize:改变图像大小,imgproc中的接口
    void resize(InputArray src, OutputArray dst,Size dsize, double fx=0,double fy=0,int interpolation=INTER_LINEAR);
    src:源图片,即将此图片进行改变大小操作
    dst:目标图片,即改变完毕之后的图片保存在此
    dsize:目标大小
    fx,fy:缩放比例,若dsize为(0,0),则横向按照fx缩放比例,纵向按照fy缩放比例
    缩放方式,默认为INTER_LINEAR,线性插值缩放 

以下是Mat对象改变大小的操作:

1.第一种方式,改变宽高。读取图片保存至Mat对象中,新建一个Mat对象保存改变后大小的图片,设置改变后的图片大小

 2.第二种方式,改变宽高比例。当设置大小为默认0时,可通过添加宽高的比例因子,缩放图片

 Mat对象旋转:
    getRotationMatrix2D:获取旋转矩阵,imgproc中的接口
    cv::Mat cv::getRotationMatrix2D(cv::Point2f center, double angle, double scale);
    center:旋转中心点
    angle:角度
    scale:缩放比例

    wareAffine:仿射变换,可用于旋转图片,imgproc中的接口
    void wareAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode=BORDER_CONSTANT,const Scalar&borderValue=Scalar());
    src:源图片,即将图片进行旋转操作
    dst:目标图片,即旋转完毕之后的图片保存在此
    M:变换矩阵,即getRotationMatrix2D获取的旋转角度信息
    dsize:旋转大小
    flags:缩放模式,默认为INTER_LINEAR, 与resize中的interpola一致
    borderMode:边界像素模式,有默认值BORDER_CONSTANT,即填充
    borderValue:边界取值,有默认Scalar()即0,全黑,填充颜色

以下是关于Mat对象旋转的展示:

1.读取图片保存至Mat对象中, 新建Mat对象,利用函数将Mat对象进行缩放旋转,背景色填充等操作后保存至新建Mat对象

Mat对象抠图:
    ROI:区域选择,即旋转图片中的某个区域,可用于抠图等操作,imgproc模块中的接口
    Mat::operator(Rect rect)
    rect::截取范围,Rect(x,y,width,height),即左上角的(x,y)坐标,加上宽高

    Mat中的成员clone,深拷贝自己的内容
    Mat Mat::clone()const;

    Mat中的成员copyTo,将自己的图片拷贝至目标
    void Mat::copyTo(OutputArray m)const
    m:拷贝至m图片

    Mat中的成员setTO,将自己设置为某个图片,其中根据选择的mask决定,可以做去背景等操作
    Mat& Mat::setTo(InputArray value, InputArray mask=noArray());
    value:目标图片
    mask:mask中的数据为0的点不会被value覆盖,数据为非0的点才会被value覆盖

以下是Mat对象抠图,其中一些函数可自行尝试:

 Mat对象灰度图切换:
    cvtColor:颜色空间转换,即将一个图片颜色空间改变并赋值给另一个图片,可以转换灰度图,imgproc模块中的接口
    void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0);
    src:源图片,即将此图片进行颜色转换操作
    dst:目标图片,即颜色转换之后的图片保存在此
    code:颜色映射类型,BGR2GRAY为灰度图
    dstCn:颜色通道,默认为0

    在新版本中,CV_BGR@GRAY被COLOR_BGR2GRAY替换,只需将CV改成COLO即可

以下是Mat对象灰度图切换:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值