zoukankan      html  css  js  c++  java
  • Opencv Mat类

    Mat类的一些属性:

    class CV_EXPORTS Mat
    {
    public/ /一系列函数...
    /*
    flag 参数中包含序号关于矩阵的信息,如:
        -Mat 的标识
        -数据是否连续
        -深度
        -通道数目
        */
    int flags;
    
    int dims ;//!数组的维数,取值大于等于2//!行和列的数量,如果矩阵超过 2 维,那这两个值为-1
    
    int rows,cols;
    
    uchar *data ;//!指向数据的指针
    
    int * refcount ;//!指针的引用计数器 ;
    / / 阵列指向用户分配的数据时,当指针为 NULL
    
    / / 其他成员
    ...
    };

    由于Mat经常被用于cv::VideoWriter的一些函数中当作参数,比如说cv::VideoWriter把QImage写入到一个视频文件中

    打开文件:

    //videoWriter是cv::VideoWriter类型的
    videoWriter.open(avi.toStdString(), CV_FOURCC('D', 'I', 'V', 'X'), 10, cv::Size(width, height));

    两种方式:

           //构造函数 
        cv::VideoWriter out(
            const string& filename, // 输入文件名
            int fourcc, // 编码形式,使用 CV_FOURCC()宏
            double fps, // 输出视频帧率
            cv::Size frame_size, // 单帧图片的大小
            bool is_color = true // 如果是false,可传入灰度图像 
        );
        //open方式
        cv::VideoWriter out;
        out.open(
            "my_video.mpg", //输出文件名
            CV_FOURCC('D','I','V','X'), // MPEG-4 编码
            30.0, // 帧率 (FPS)
            cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
            true // 只输入彩色图
        );    

    open ( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );

    •   filename 输出视频文件名。
    •     fourcc为 四个字符用来表示压缩帧的codec 例如:
      • CV_FOURCC('P','I','M','1') = MPEG-1 codec
      • CV_FOURCC('M','J','P','G') = motion-jpeg codec
      • CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
      • CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
      • CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
      • CV_FOURCC('U', '2', '6', '3') = H263 codec
      • CV_FOURCC('I', '2', '6', '3') = H263I codec
      • CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
      • 若编码器代号为 -1,则运行时会弹出一个编码器选择框.
    • fps 被创建视频流的帧率。
    • frame_size 视频流的大小。
      • is_color 如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。

    像文件中写入Mat类型数据:

    cv::Mat image;
    videoWriter.write(image);

    关闭文件:

    videoWriter.release();

    这样的话写入Mat类型数据,如果把QImage转换为cv::Mat类型就可以完成视频的写入,实例如下:

    cv::Mat mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());

    那我们就来看一下cv::Mat的一些构造函数

    Mat的更多成员函数信息可看:https://blog.csdn.net/qq_37406130/article/details/78725406

                   https://blog.csdn.net/kakiebu/article/details/79085556

     下面仅给出构造函数

    1、Mat::Mat()
    无参数构造方法;
    2、Mat::Mat(int rows, int cols, int type)
    创建行数为 rows,列数为 col,类型为 type 的图像;
    3、Mat::Mat(Size size, int type)
    创建大小为 size,类型为 type 的图像;
    4、Mat::Mat(int rows, int cols, int type, const Scalar& s)
    创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s;
    5、Mat::Mat(Size size, int type, const Scalar& s)
    创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s;
    6、Mat::Mat(const Mat& m)
    将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据,属于浅拷贝;
    7、Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
    创建行数为rows,列数为col,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由 step指定。
    8、Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
    创建大小为size,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由step指定。
    9、Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
    创建的新图像为m的一部分,具体的范围由rowRange和colRange指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据;
    10、Mat::Mat(const Mat& m, const Rect& roi)
    创建的新图像为m的一部分,具体的范围roi指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据。

    这些构造函数中,很多都涉及到类型type。type可以是CV_8UC1,CV_16SC1,…,CV_64FC4 等。里面的 8U 表示 8 位无符号整数,16S 表示 16 位有符号整数,64F表示 64 位浮点数(即 double 类型);C 后面的数表示通道数,例如 C1 表示一个
    通道的图像,C4 表示 4 个通道的图像,以此类推。
    如果你需要更多的通道数,需要用宏 CV_8UC(n),例如:
    Mat M(3,2, CV_8UC(5));//创建行数为 3,列数为 2,通道数为 5 的图像。

     

  • 相关阅读:
    windows禅道环境搭建
    python-django开发学习笔记四
    迭代器
    小数据池
    正则表达式
    文件操作
    深浅拷贝
    隐藏文件夹命令
    python解释器安装教程以及环境变量配置
    计算机基础应用
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/15080988.html
Copyright © 2011-2022 走看看