003Mat对象与IpIImage对象

00Mat对象与Ipllmage对象

  • Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分

  • IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题

01Mat对象构造函数与常用方法

 

 

02Mat对象使用

  • 部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分

    Mat A= imread(imgFilePath);

    Mat B(A) // 只复制

  • 完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现

    Mat F = A.clone(); 或 Mat G; A.copyTo(G);

03Mat对象创建

  • cv::Mat::Mat构造函数

    Mat M(2,2,CV_8UC3, Scalar(0,0,255))

    其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致

     

     

     

  • 创建多维数组cv::Mat::create

    int sz[3] = {2,2,2};

    Mat L(3,sz, CV_8UC1, Scalar::all(0));

  • lcv::Mat::create实现

    Mat M;

    M.create(4, 3, CV_8UC2);

    M = Scalar(127,127);

    cout << "M = " << endl << " " << M << endl << endl;

    uchar* firstRow = M.ptr<uchar>(0);

    printf("%d", *firstRow);

     

     

 

  • Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

    cout << "C = " << endl << " " << C << endl << endl;

 

#include<opencv2/opencv.hpp>
#include<highgui.hpp>

using namespace cv;

int main003(int argc, char** argv)
{
    //加载图像
    Mat testImage = imread("C:/Users/aber/Desktop/data/baboon.jpg");
    if (testImage.empty())
    {
        std::cout << "could not load image...." << std::endl;
        return -1;
    }
    CV_Assert(testImage.depth() == CV_8U);
    namedWindow("test_image", 1);
    imshow("test_image", testImage);

    /*Mat dst;
    dst = Mat(testImage.size(), testImage.type());
    dst = Scalar(127, 0, 255);
    namedWindow("output", 1);
    imshow("output", dst);*/

    Mat dst;
    namedWindow("output", 1);

    cvtColor(testImage, dst, COLOR_BGR2GRAY);
    printf("input image channels:%d\n", testImage.channels());
    printf("output image channels:%d\n", dst.channels());

    int cols = dst.cols;
    int rows = dst.rows;

    //通道数
    printf("rows:%d cols:%d\n", dst.channels());
    //像素行数与列数
    printf("rows:%d  cols:%d\n", rows, cols);
    //通过指针访问像素值
    const uchar* firstRow = dst.ptr<uchar>(0);
    printf("first pixel value:%d\n", *firstRow);

    Mat M(100, 100, CV_8UC3, Scalar(0, 0, 255));
    //std::cout << "M=" << std::endl << M << std:: endl;


    imshow("output",dst);
    //使用Filter2D函数
    Mat result;
    //定义小数组
    Mat kern = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    filter2D(testImage, result, testImage.depth(), kern);

    //显示结果
    namedWindow("result_image", 1);
    imshow("result_image", result);
    waitKey(0);
    return 0;
}

 

 

 

 

 

 

posted @ 2021-06-03 20:03  阿尔飞  阅读(143)  评论(0)    收藏  举报