OpenCV中Mat与二维数组之间的转换

---恢复内容开始---

在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组。

全部代码如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp> //包含imread, imshow等标识符
#include "opencv2/imgproc/imgproc.hpp" //包含cvtColor等

using namespace std;
using namespace cv;

//测试Mat
void main5(){
    //读入图像
    Mat mat = imread("trabeculae.jpg");
    //判断读入图片是否有误
    if(mat.empty())
    {
        if (!mat.data) {
            printf("Oh,no,读取图片文件错误~! \n");
        }
        cout << "error" << endl;
    }  

    // 进行图像灰度化操作
    cvtColor(mat, mat, CV_BGR2GRAY);
    //获取 mat 的行和列
    int row = mat.rows;
    int col = mat.cols;
    cout << "  mat.rows : " << mat.rows << endl;
    cout << "  mat.cols : " << mat.cols << endl;

   //动态创建二维数组,row行col列
    int **La = new int *[row];
    for (int i = 0; i < row; i ++){
        La[i] = new int[col];
    }
    // 循环二维数组和mat,并将mat对应值赋给二维数组对应值,
    for (int i = 0; i < row; i ++){
        for (int j = 0; j < col; j ++){
            La[i][j] = mat.at<uchar>(i, j);
        }
    }
    // 释放分配空间
    for (int i = 0; i < row; i ++){
        delete []La[i];
    }
    delete [] La;

    cout << endl;
    waitKey(0);
    system("pause");
}

分析:

1. 读入一幅图像

    //读入图像
    Mat mat = imread("trabeculae.jpg");
    //判断读入图片是否有误
    if(mat.empty())
    {
        if (!mat.data) {
            printf("Oh,no,读取图片文件错误~! \n");
        }
        cout << "error" << endl;
    }  

2. 对图像进行灰度化操作,将Mat转为二维。

    // 进行图像灰度化操作
    cvtColor(mat, mat, CV_BGR2GRAY);

3. Mat有rows和cols属性,rows表示对应矩阵行数,cols表示对应矩阵列数:

    //保存mat的行和列
    int row = mat.rows;
    int col = mat.cols;

4. Mat还具有size () 方法,该方法可以得到width宽度和height高度:

    Size s = mat.size();
    int width = s.width;
    int height = s.height;

5. rows,cols,width,height 之间的关系:

    cout << "  s.width : " << s.width << endl;
    cout << "  s.height : " << s.height << endl;
    cout << "  mat.rows : " << mat.rows << endl;
    cout << "  mat.cols : " << mat.cols << endl;

6. 打印结果:

7. 结论:

由第5步和第6步可得:

mat.size().width = mat.cols;
mat.size().height = mat.rows;

8. 动态创建二维数组:

例:创建一个4行3列的二维数组,如下:

{ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }

即:{ { 0, 0, 0 },

{ 0, 0, 0 },

{ 0, 0, 0 },

{ 0, 0, 0 }

}

    // 创建一个二维数组中包含4个一维数组,即先定义4行
    int **array = new int *[4];
    // 循环二维数组,并将二维数组中的每个元素创建为包含3个元素的一维数组
    // 先分配多少行,再每行分配多少列
    for (int i = 0; i < 4; i ++){
        array[i] = new int[3];
    }
    // 循环遍历二维数组,行作为外循环,列作为内循环,一行一行地遍历
    for (int i = 0; i < 4; i ++){
        for (int j = 0; j < 3; j ++){
            array[i][j] = 0;
            cout << " " << array[i][j] ;
        }
        cout << endl;
    }
    // 使用完请求分配的数值需要释放分配空间(内存)
    // 释放分配空间,一行一行的删除
    for (int i = 0; i < 4; i ++){
        delete []array[i];
    }
    delete [] array;

结果:

9. 使用Mat图像的宽度和高度进行动态创建二维数组,Height(row)代表具有多少行,width(col)代表具有多少列。

    // 创建一个二维数组,height(row)行width(col)列
    int **La = new int *[height];
    for (int i = 0; i < height; i ++){
        La[i] = new int[width];
    }

    // 循环将Mat中对应的值赋给La二维数组
    for (int i = 0; i < row; i ++){
        for (int j = 0; j < col; j ++){
            La[i][j] = mat.at<uchar>(i, j);
            //cout << " " << La[i][j] ;
        }
        //cout << endl;
    }

    // 释放分配空间
    for (int i = 0; i < height; i ++){
        delete []La[i];
    }
    delete [] La;

10. 创建一个和二维数组行列大小的Mat:

当知道二维数组的大小,需要将二维数组中的值赋给同样大小的Mat,使用Mat显示。

    //创建一个Mat变量  height(row)行width(col)列
    Mat temp = Mat(height, width, CV_8U, Scalar::all(0));
    // 循环赋值
    for (int i = 0; i < height; i ++){
        for (int j = 0; j < width; j ++){
            mat.at<uchar>(i, j) = La[i][j];
        }
    }

---恢复内容结束---

原文地址:https://www.cnblogs.com/xiaoxiaoyibu/p/9491858.html

时间: 2024-11-05 22:13:00

OpenCV中Mat与二维数组之间的转换的相关文章

OpenCV中Mat,图像二维指针和CxImage类的转换

在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系. 一.OpenCV的Mat类到图像二值指针的转换 以下为函数代码: unsigned char** MatTopImgData(Mat img) { //获取图像参数 int row = img.rows; int col = img.cols; int band = img.c

php中向前台js中传送一个二维数组

在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的ajax一部传送的返货函数中接收,最重要的是接受的时候设置一下接收参数的类型: $.post(              "http:"+$('#url').val()+"/search",              {drug_name:drug_name},    

C++中动态申请二维数组

这里主要介绍C++中动态申请二维数组的两种方式,直接给出代码,很容易明白,简单的作为一个笔记. #include <iostream> #include <iomanip> // 输入输出操纵 #include <vector> using namespace std; // 法一:new 方式申请 void dynamicArray() { int rows, cols; cin >> rows >> cols; int **element =

C++中动态申请二维数组并释放方法

C/C++中动态开辟一维.二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下. C++中有三种方法来动态申请多维数组 (1)C中的malloc/free (2)C++中的new/delete (3)STL容器中的vector 下面逐一介绍: 第一种:malloc/free 1.动态开辟一维数组 [cpp] view plaincopy //动态开辟一维数组 void dynamicCreate1Array() { int m; int i; int *p; printf("

指针、函数、二维数组之间的联系

1.传递数组指针 1 #include <stdio.h> 2 void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组 3 { 4 int i,j; 5 for( i=0;i<n;i++ ){ 6 for( j=0;j<3;j++ ) 7 printf("%d ", pa[i][j] ); 8 printf("\n"); 9 } 10 } 11 void main() 12 { 13 int

以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简单分析动态二维数组,若有不足或错误之处,还请指出! 在讲这之前,以一维数组为例,先重新认识一下数组: int array[5] = {1, 2, 3, 4, 5}; 首先数组名称是该数组的首地址常量,即数组名称就是指针,就有&array[0] == array! 那么我们可以推出*array ==

C++中vecotr表示二维数组并自己实现一个Grid类

1 C++中使用vector来表示二维数组 声明一个二维数组: vector<vector<int>> dp(row, vector<int>(col)); 将变量dp初始化为一个含有row个元素的vector对象,其中每个元素又都是含有col个元素的vector对象.内部的vector对象的基类型为int,外部vector对象的基类型为 vector< int >. 获取数组的row和col vector<vector<int>>&

如何在C++中动态建立二维数组(转)

http://blog.sina.com.cn/s/blog_7c073a8d0100qp1w.html http://blog.163.com/[email protected]/blog/static/7198839920117252550574/ C++中用new动态创建二维数组的格式一般是这样: TYPE (*p)[N] = new TYPE [][N]; 其中,TYPE是某种类型,N是二维数组的列数.采用这种格式,列数必须指出,而行数无需指定.在这里,p的类型是TYPE*[N],即是指

opencv中Mat与IplImage,CVMat类型之间转换

opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Matlab中的各种矩阵运算),所以将IplImage类型和CvMat类型转换为Mat类型更易于数据处理. Mat类型可用于直接存储图像信息,通过函数imread.imwrite.imshow等实现(与Matlab中的函数相