OpenCV Mat 数据读写

18 篇文章 3 订阅
16 篇文章 2 订阅

 

1、创建 Mat 对象:

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

// 创建一个 320x240 的 8 位无符号型 1 通道全 0 的 Mat
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 中:

// 从文件中读取内容到 Mat 中
cv::Mat image = cv::imread(file_path, cv::IMREAD_UNCHANGED);

// 将 RGBA 数据转成灰度数据
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);

② 将 RGBA 裸数据赋值给 Mat:

// 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat
cv::Mat mRGBAImg = cv::Mat::zeros(320, 240, CV_8UC4);

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


//方法一:直接将数据指针赋值给 mat.data
// 假设已经有了 RGBA 裸数据,如从 OpenGL 中 glReadPixels 读出来的
// 或从 java 层传下来的:jbyte * mPicData = env->GetByteArrayElements(picture, NULL);
uchar * rgba_data = xxx;
mRGBAImg.data = (uchar *) rgba_data;

// 将 RGBA 数据转成灰度数据
cv::cvtColor(mRGBAImg, gGrayImg, cv::COLOR_RGBA2GRAY);



//方法二:依次给 Mat 每个元素赋值
for (int i = 0; i < height; ++i) {
    for (int j = 0; j < width; ++j) {
        // RGBA ==> cv::RGBA
        mRGBAImg.at<cv::Vec3b>(i, j)[0] = (mPicData[(i * width + j) * 4 + 0] & 0xFF);
        mRGBAImg.at<cv::Vec3b>(i, j)[1] = (mPicData[(i * width + j) * 4 + 1] & 0xFF);
        mRGBAImg.at<cv::Vec3b>(i, j)[2] = (mPicData[(i * width + j) * 4 + 2] & 0xFF);
        mRGBAImg.at<cv::Vec3b>(i, j)[3] = (mPicData[(i * width + j) * 4 + 3] & 0xFF);
    }
} 

 

3、读取 Mat 中的数据:

将 Mat 中的数据输出:

// 如将人脸关键点坐标的 Mat 拼成字符串输出出来
char str[2024];
int offset = 0;

for (int i = 0; i < face_key_pionts.rows; i+=2) {
    for (int j = 0; j < face_key_pionts.cols; ++j) {
        offset += sprintf(str + offset, "(%f, %f), ", face_key_pionts.at<float>(i, j), face_key_pionts.at<float>(i + 1, j));
    }
}

LOGE("FacePointTest()-->>face_key_pionts = %s\n", str);

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

// 从文件中读取图片,并保存为 RGBA 裸数据
cv::Mat image = cv::imread(img_file, cv::IMREAD_UNCHANGED);

FILE * rgba_file = fopen(rgba_file_path, "wb");
fwrite(image.data, image.elemSize(), image.cols * image.rows, rgba_file);
fclose(rgba_file);


// 将 RGBA 数据转成灰度数据并保存成文件
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
FILE * gray_file = fopen(gray_file_path, "wb");
fwrite(gray.data, gray.elemSize(), gray.cols * gray.rows, gray_file);
fclose(gray_file);

③ 图像裸数据 在线查看

    http://rawpixels.net

 

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值