C++如何将一幅图像读入,并存为二维矩阵?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++如何将一幅图像读入,并存为二维矩阵?相关的知识,希望对你有一定的参考价值。

我在网上查了VS如何读取图像,都是长篇大论的,什么头文件,信息头,返回错误信息之类的一大堆,读一幅图像的代码有好几页,有这么复杂吗?C++中是否有读取图像的函数,类似于MATlab里面的imread函数。我想知道c++如何读取一幅图像最简洁最方便。

是这么的,每种图像文件(显而易见的是文件后缀区分)都有其统一的格式
比如果简单的BMP文件格式,它由文件头和数据矩阵表示
那么,C++读取的时候先读取文件头(这个很重要,它告诉你这张图像的大小等等,这是最基本的了),文件头之后就是数据区,读出来就是你所谓的二维矩阵了
参考技术A 没有听说过有直接读取图片的函数,只有图片控件用于显示图片之类的,你要存储为二维矩阵,这个还涉及到数学方面的东西,不要太浮躁,去图书馆节本相关书籍嘛,这个书还是挺好找的,代码也会有的,图形出来matlab本身就集成了很多东西,相当于一个本来就已近写好功能的软件,你直接输入命令调用就行,而vs是开发大众化的软件,没有matlab这个专一。 参考技术B 和MATLAB一样,调用opencv中的一个imread函数就可以

opencv c++:将图像矩阵从无符号字符转换为浮点数

【中文标题】opencv c++:将图像矩阵从无符号字符转换为浮点数【英文标题】:opencv c++: converting image matrix from unsigned char to float 【发布时间】:2015-08-08 14:36:17 【问题描述】:

我在转换图像矩阵时遇到问题。我用:

Mat image = imread(image_name, 0);

将图像读入 Mat 对象。当我查看调试器时,我看到数据存储为无符号字符。

接下来,我使用 convertTo 方法将数据转换为浮点值:

Mat image_f;
image.convertTo(image_f, CV_32F);

我再次查看调试器,数据仍然是 unsigned char 类型。

我做错了什么?

【问题讨论】:

【参考方案1】:

您检查的类型错误。您可能会查看image.data,对于任何图像类型,它始终是uchar*

再试一次,你的类型就OK了。

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()

    Mat image(100, 100, CV_8UC1);
    cout << image.type() << " == " << CV_8U << endl;

    Mat image_f;
    image.convertTo(image_f, CV_32F);
    cout << image_f.type() << " == " << CV_32F << endl;

    return 0;

您可以访问float 值,例如:

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()

    Mat m(10,10,CV_32FC1);

    // you can access element at row "r" and col "c" like:
    int r = 2;
    int c = 3;

    // 1
    float f1 = m.at<float>(r,c);

    // 2
    float* fData1 = (float*)m.data;
    float f2 = fData1[r*m.step1() + c];

    // 3
    float* fData2 = m.ptr<float>(0);
    float f3 = fData2[r*m.step1() + c];

    // 4
    float* fData3 = m.ptr<float>(r);
    float f4 = fData3[c];

    // 5
    Mat1f mm(m); // Or directly create like: Mat1f mm(10,10);
    float f5 = mm(r,c);

    // f1 == f2 == f3 == f4 == f5


    return 0;

【讨论】:

你知道如何从 image_f 访问一些浮点值吗?通过image_f.data我只能得到uchar。

以上是关于C++如何将一幅图像读入,并存为二维矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

二维数组 : 旋转矩阵

给定一个 n × n 的二维矩阵表示一个图像, 将图像顺时针旋转 90 度js实现

在 C++ 中使用二维向量乘以矩阵

OpenCV C++(五)----图像平滑

C++ 练气期之二维数组与矩阵运算

用MATLAB将一幅图分割成4*3的小块该怎么做呢?