美文网首页
Mat对象和图像混合

Mat对象和图像混合

作者: 思思入扣 | 来源:发表于2019-06-23 22:51 被阅读0次

    一、在计算机中,一幅图片对应的是矩阵,矩阵包含了所有像素点的数值,opencv1.0是基于C语言写的,当时采用的是IplImage的C语言结构体,用户必须手动管理内存。但是从2.0开始,使用Mat类存储图像,它可以自动分配和释放图像的内存
    1.Mat的组成:一个是Matrix header 这部分的大小是固定的,包含矩阵的大小,存储方式,矩阵存储的地址等,另一个是指向矩阵包含像素值的指针
    2.Mat的创建
    (1)使用Mat构造函数

    Mat M(7,7,CV_32FC2,Scalar(1,3));
    

    创建了 7X7 的像素图像,每个像素有两个通道,且每个通道的值都为(1,3),深度为32,CV_32F表示每个元素的值的类型为32位浮点数,C2表示通道数为2,Scalar(1,3)表示对矩阵每个元素都赋值为(1,3),第一个通道中的值都是1,第二个通道中的值都是3
    值得注意是的,Mat 三通道依次是 BGR,而不是我们熟知的 RGB。
    (2)通过 create() 创建
    Mat M;

    //create不能指定初始值, CV_8UC(4)为自定义通道数
    M.create(100,60,CV_8UC(15)); 
    

    3.拷贝

    Mat A, C; // creates just the header parts
    A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // here we’ll know the method used (allocate matrix)
    Mat B(A); // Use the copy constructor
    C = A;
    

    copy这样的操作只是copy了矩阵的matrix header和那个指针,而不是矩阵的本身,也就意味着两个矩阵的数据指针指向的是同一个地址
    比如上面这段程序,A、B、C指向的是同一块数据,他们的header不同,但对于A的操作同样也影响着B、C的结果
    如果想建立互不影响的Mat,是真正的复制操作,需要使用函数clone()或者copyTo()
    4.Mat有3个重要的方法:
    Mat mat = imread(const String* filename); 读取图像
    imshow(const string frameName, InputArray mat); 显示图像
    imwrite (const string& filename, InputArray img); 储存图像

    相关文章

      网友评论

          本文标题:Mat对象和图像混合

          本文链接:https://www.haomeiwen.com/subject/baywqctx.html