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 的图像。

 

原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/15080988.html