• 转 OpenCV Mat 数据读写


    转:https://blog.csdn.net/u011520181/article/details/83831866

    1、创建 Mat 对象:

    1. // 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat
    2. cv::Mat mBGRAImg = cv::Mat::zeros(320, 240, CV_8UC4);
    3. // 创建一个 320x240 的 8 位无符号型 1 通道全 0 的 Mat
    4. cv::Mat mGrayImg = cv::Mat::zeros(320, 240, CV_8UC1);

        对于 type,格式为:CV_位数+数值类型+C通道数,例如:
        CV_8UC1 表示:单通道阵列,8bit 无符号整数
        CV_8UC4 表示:4 通道阵列,8bit 无符号整数
        CV_32FC1 表示:单通道阵列,32bit float 型

    2、给 Mat 赋值:

    ① 从文件中读取图片到 Mat 中:

    1. // 从文件中读取内容到 Mat 中
    2. cv::Mat image = cv::imread(file_path, cv::IMREAD_UNCHANGED);
    3. // 将 RGBA 数据转成灰度数据
    4. cv::Mat gray;
    5. cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);

    ② 将 RGBA 裸数据赋值给 Mat:

    1. // 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat
    2. cv::Mat mRGBAImg = cv::Mat::zeros(320, 240, CV_8UC4);
    3. // 创建一个 320x240 的 8 位无符号型 1 通道全 0 的 Mat
    4. cv::Mat mGrayImg = cv::Mat::zeros(320, 240, CV_8UC1);
    5. //方法一:直接将数据指针赋值给 mat.data
    6. // 假设已经有了 RGBA 裸数据,如从 OpenGL 中 glReadPixels 读出来的
    7. // 或从 java 层传下来的:jbyte * mPicData = env->GetByteArrayElements(picture, NULL);
    8. uchar * rgba_data = xxx;
    9. mRGBAImg.data = (uchar *) rgba_data;
    10. // 将 RGBA 数据转成灰度数据
    11. cv::cvtColor(mRGBAImg, gGrayImg, cv::COLOR_RGBA2GRAY);
    12. //方法二:依次给 Mat 每个元素赋值
    13. for (int i = 0; i < height; ++i) {
    14. for (int j = 0; j < width; ++j) {
    15. // RGBA ==> cv::RGBA
    16. mRGBAImg.at<cv::Vec3b>(i, j)[0] = (mPicData[(i * width + j) * 4 + 0] & 0xFF);
    17. mRGBAImg.at<cv::Vec3b>(i, j)[1] = (mPicData[(i * width + j) * 4 + 1] & 0xFF);
    18. mRGBAImg.at<cv::Vec3b>(i, j)[2] = (mPicData[(i * width + j) * 4 + 2] & 0xFF);
    19. mRGBAImg.at<cv::Vec3b>(i, j)[3] = (mPicData[(i * width + j) * 4 + 3] & 0xFF);
    20. }
    21. }

    3、读取 Mat 中的数据:

    将 Mat 中的数据输出:

    1. // 如将人脸关键点坐标的 Mat 拼成字符串输出出来
    2. char str[2024];
    3. int offset = 0;
    4. for (int i = 0; i < face_key_pionts.rows; i+=2) {
    5. for (int j = 0; j < face_key_pionts.cols; ++j) {
    6. offset += sprintf(str + offset, "(%f, %f), ", face_key_pionts.at<float>(i, j), face_key_pionts.at<float>(i + 1, j));
    7. }
    8. }
    9. LOGE("FacePointTest()-->>face_key_pionts = %s ", str);

    ② 将 Mat 中的数据保存成文件:

    1. // 从文件中读取图片,并保存为 RGBA 裸数据
    2. cv::Mat image = cv::imread(img_file, cv::IMREAD_UNCHANGED);
    3. FILE * rgba_file = fopen(rgba_file_path, "wb");
    4. fwrite(image.data, image.elemSize(), image.cols * image.rows, rgba_file);
    5. fclose(rgba_file);
    6. // 将 RGBA 数据转成灰度数据并保存成文件
    7. cv::Mat gray;
    8. cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
    9. FILE * gray_file = fopen(gray_file_path, "wb");
    10. fwrite(gray.data, gray.elemSize(), gray.cols * gray.rows, gray_file);
    11. fclose(gray_file);

    ③ 图像裸数据 在线查看

        http://rawpixels.net

  • 相关阅读:
    分水岭分割算法(watershed segmentation)的C++实现(法2)
    ubuntu16.04下安装opencv3.3
    分水岭分割算法(watershed segmentation)的C++实现(法1)
    dpkg: 处理归档 /var/cache/apt/archives/swig2.0_2.0.12-1ubuntu4_amd64.deb (--unpack)时出错:
    ubuntu16.04安装pycharm
    ImportError: liblapack.so.3: cannot open shared object file问题
    Linux下使用Opencv打开笔记本摄像头
    目标跟踪算法meanshift优缺点
    Jacobian矩阵和Hessian矩阵
    机器视觉中的目标检测
  • 原文地址:https://www.cnblogs.com/sdu20112013/p/11231471.html
Copyright © 2020-2023  润新知