精华内容
下载资源
问答
  • 1、Mat转一维数组 Mat mat; //方法1,vector std::vector<uchar> array(mat.rows*mat.cols); if (mat.isContinuous()) array = mat.data; 或者 std::vector<uchar> array; if (mat...

    1、Mat转一维数组

    Mat mat;
    //方法1,vector
    std::vector<uchar> array(mat.rows*mat.cols);
    if (mat.isContinuous())
        array = mat.data;
    
    或者
    std::vector<uchar> array;
    if (mat.isContinuous()) {
      array.assign(mat.datastart, mat.dataend);
    } else {
      for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i)+mat.cols);
      }
    }
    
    //方法2,数组
    unsigned char *array=new unsigned char[mat.rows*mat.cols];
    if (mat.isContinuous())
        array = mat.data;

    2、一维数组转Mat

    Mat Array2Mat(uchar *array, int row, int col)
    {
     
        uchar **array = new uchar[row][col];
        for (int i = 0; i <row; ++i)
        {
            for (int j = 0; j < col; ++j)
            {
                array[i][j] =  array[i * col + j] ;
            }
        }
        
        Mat img(row ,col,  CV_8UC1, (unsigned char*)array);
        return img;
     
    }

    3、Mat转二维数组

    Mat Vec2Mat(uchar **array, int row, int col)
    {
     
        Mat img(row ,col,  CV_8UC1);
        uchar *ptmp = NULL;
        for (int i = 0; i <row; ++i)
        {
            ptmp = img.ptr<uchar>(i);
     
            for (int j = 0; j < col; ++j)
            {
                ptmp[j] = array[i][j];
            }
        }
        
        return img;
     
    }
    

    4、二维数组转Mat

    方法一:
    unsigned char array[height][width];
    cv::Mat mat(height, width, CV_8UC1, (unsigned char*)array );
    
    方法二:
    uchar** Mat2Vec(Mat mat)
    {
    	
    	uchar **array = new uchar*[mat.rows];
    	for (int i = 0; i<mat.rows; ++i)
    		array[i] = new uchar[mat.cols];
    	for (int i = 0; i < mat.rows; ++i)
    	{
    		for (int j = 0; j < mat.cols; ++j)
    		{
    			array[i][j] = mat.at<uchar>(i, j);
    		}
    	}
     
    	return array;
    }
    

    参考链接:https://blog.csdn.net/liufang0109/article/details/79472059?utm_source=blogxgwz4

    展开全文
  • Opencv C++ 图片一维buffer转换成Mat格式

    千次阅读 2020-05-07 10:46:14
    Opencv C++ 图片一维buffer转换成Mat格式 #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> using namespace cv; using namespace std; //************************************ // ...

    Opencv C++ 图片一维buffer转换成Mat格式

    #include <opencv2/opencv.hpp>
    #include <opencv2/highgui.hpp>
    
    using namespace cv;
    using namespace std;
    
    //************************************
    // Method:    TransBufferToMat
    // FullName:  图片buffer数据转换成 Mat数据格式;
    // Access:    public 
    // Returns:   cv::Mat
    // Qualifier:
    // Parameter: unsigned char * pBuffer  图片数据内容
    // Parameter: int nWidth	图片的宽度
    // Parameter: int nHeight  图片的高度
    // Parameter: int nBandNum 每个像素包含数据个数 (1, 3, 4 ) 1:Gray 3:RGB 4:RGBA
    // Parameter: int nBPB  每个像素数据 所占位数(1, 2) 1:8位  2:16位;
    //************************************
    cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB = 1)
    {
    	cv::Mat mDst;
    	if (nBandNum == 4)
    	{
    		if (nBPB == 1)
    		{
    			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC4);
    		}
    		else if (nBPB == 2)
    		{
    			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC4);
    		}
    	}
    	else if (nBandNum == 3)
    	{
    		if (nBPB == 1)
    		{
    			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC3);
    		}
    		else if (nBPB == 2)
    		{
    			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC3);
    		}
    	}
    	else if (nBandNum == 1)
    	{
    		if (nBPB == 1)
    		{
    			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC1);
    		}
    		else if (nBPB == 2)
    		{
    			mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC1);
    		}
    	}
    
    	for (int j = 0; j < nHeight; ++j)
    	{
    		unsigned char* data = mDst.ptr<unsigned char>(j);
    		unsigned char* pSubBuffer = pBuffer + (nHeight - 1 - j) * nWidth* nBandNum*nBPB;
    		memcpy(data, pSubBuffer, nWidth*nBandNum*nBPB);
    	}
    	if (nBandNum == 1)
    	{
    		cv::cvtColor(mDst, mDst, COLOR_GRAY2BGR);
    	}
    	else if (nBandNum == 3)
    	{
    		cv::cvtColor(mDst, mDst, COLOR_RGB2BGR);
    	}
    	else if (nBandNum == 4)
    	{
    		cv::cvtColor(mDst, mDst, COLOR_RGBA2BGR);
    	}
    
    	return mDst;
    }
    
    //灰度图片测试;
    void grayImageTest()
    {
    	//设置图片长宽 单位像素所占位数;
    	int width = 300;
    	int height = 200;
    	int nBandNum = 1;
    
    	//模拟灰度图片数据;
    	unsigned char* pBuffer = new unsigned char[width * height * nBandNum];
    
    	for (int i = 0; i < height; i++)
    	{
    		for (int j = 0; j < width; j++)
    		{
    			if (j < 100)
    			{
    				pBuffer[i * width + j] = 255;
    			}
    			else if (j>=100 && j <200)
    			{
    				pBuffer[i * width + j] = 128;
    			}
    			else
    			{
    				pBuffer[i * width + j] = 0;
    			}
    		}
    	}
    
    	// 灰度图片buffer数据转换成Mat格式;
    	Mat  grayImage = TransBufferToMat(pBuffer, width, height, 1);
    
    	//显示图片数据
    	cout << "高度" << grayImage.cols << endl;
    	cout << "宽度" << grayImage.rows << endl;
    	imshow("灰度图片", grayImage);
    	waitKey(0);
    
    	delete pBuffer;
    }
    
    //彩色图片测试;
    void colorImageTest()
    {
    	//设置图片长宽 单位像素所占位数;
    	int width = 300;
    	int height = 200;
    	int nBandNum = 3;
    
    	//模拟彩色图片数据;
    	unsigned char* pBuffer = new unsigned char[width * height * nBandNum];
    
    	for (int i = 0; i < height; i++)
    	{
    		for (int j = 0; j < width; j++)
    		{
    			if (j < 100)
    			{
    				pBuffer[i * width * nBandNum + j * nBandNum] = 255;
    				pBuffer[i * width * nBandNum + j * nBandNum + 1] = 0;
    				pBuffer[i * width * nBandNum + j * nBandNum + 2] = 0;
    			}
    			else if (100 <= j &&  j <200)
    			{
    				pBuffer[i * width * nBandNum + j * nBandNum] = 0;
    				pBuffer[i * width * nBandNum + j * nBandNum + 1] = 255;
    				pBuffer[i * width * nBandNum + j * nBandNum + 2] = 0;
    			}
    			else if (j >= 200)
    			{
    				pBuffer[i * width * nBandNum + j * nBandNum] = 0;
    				pBuffer[i * width * nBandNum + j * nBandNum + 1] = 0;
    				pBuffer[i * width * nBandNum + j * nBandNum + 2] = 255;
    			}
    		}
    	}
    
    	// 彩色图片buffer转换成Mat格式;
    	Mat  colorImage = TransBufferToMat(pBuffer, width, height, 3);
    
    	//显示图片数据;
    	cout << "宽度" << colorImage.cols << endl;
    	cout << "高度" << colorImage.rows << endl;
    	imshow("彩色图片", colorImage);
    	waitKey(0);
    
    	delete pBuffer;
    }
    
    int main()
    {
    
    	//灰度图片测试;
    	//grayImageTest();
    
    	//彩色图片测试;
    	colorImageTest();
    	
    	return 0;
    }
    

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • opencv中的Mat与数组互

    万次阅读 2019-07-09 16:24:25
    直接上代码,初步验证测试正确,数组形式与opencv的存储方式一致为BGR。 cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB = 1) { cv::Mat mDst; if ...

    直接上代码,初步验证测试正确,数组形式与opencv的存储方式一致为BGR。

    cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB = 1)
    {
        cv::Mat mDst;
        if (nBandNum == 4)
        {
            if (nBPB == 1)
            {
                mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC4);
            }
            else if (nBPB == 2)
            {
                mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC4);
            }
        }
        else if (nBandNum == 3)
        {
            if (nBPB == 1)
            {
                mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC3);
            }
            else if (nBPB == 2)
            {
                mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC3);
            }
        }
        else if (nBandNum == 1)
        {
            if (nBPB == 1)
            {
                mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC1);
            }
            else if (nBPB == 2)
            {
                mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC1);
            }
        }
    
        for (int j = 0; j < nHeight; ++j)
        {
            unsigned char* data = mDst.ptr<unsigned char>(j);
            unsigned char* pSubBuffer = pBuffer + (nHeight - 1 - j) * nWidth  * nBandNum * nBPB;
            memcpy(data, pSubBuffer, nWidth * nBandNum * nBPB);
        }
        if (nBandNum == 1)
        {
            cv::cvtColor(mDst, mDst, CV_GRAY2BGR);
        }
        else if (nBandNum == 3)
        {
            cv::cvtColor(mDst, mDst, CV_RGB2BGR);
        }
        else if (nBandNum == 4)
        {
            cv::cvtColor(mDst, mDst, CV_RGBA2BGR);
        }
    
        return mDst;
    }
    
    int TransMatToBuffer(cv::Mat mSrc, unsigned char** ppBuffer, int& nWidth, int& nHeight, int& nBandNum, int& nBPB)
    {
        if (*ppBuffer)
        {
            delete[] * ppBuffer;
            *ppBuffer = nullptr;
        }
    
        nWidth = mSrc.cols;
        //nWidth = ((nWidth + 3) / 4) * 4;
        nHeight = mSrc.rows;
        nBandNum = mSrc.channels();
        nBPB = (mSrc.depth() >> 1) + 1;
    
        size_t nMemSize = nWidth * nHeight * nBandNum * nBPB;
        //这样可以改变外部*pBuffer的值
        *ppBuffer = new uchar[nMemSize];
        memset(*ppBuffer, 0, nMemSize);
        uchar* pT = *ppBuffer;
        for (int j = 0; j < nHeight; ++j)
        {
            unsigned char* data = mSrc.ptr<unsigned char>(j);
            unsigned char* pSubBuffer = *ppBuffer + (j)* nWidth  * nBandNum * nBPB;
            memcpy(pSubBuffer, data, nWidth * nBandNum * nBPB);
        }
    
        return 0;
    }
    

     

    展开全文
  • openCV图像矩阵Mat和二数组的互相转换在openCV的应用中,我们获取图像的矩阵信息很简单。但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算。那么我们就需要把openCV读取到的类型(比如Mat类型)的...

    openCV图像矩阵Mat和二维数组的互相转换



    在openCV的应用中,我们获取图像的矩阵信息很简单。但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算。那么我们就需要把openCV读取到的类型(比如Mat类型)的矩阵信息传递到另外类型(比如Eigen库的MatrixXd类型)的矩阵。这该怎么办呢?由于目前在网络上搜不到特别符合楼主意愿的答案,故写此博客,希望能够帮助到同楼主一样徜徉在信息海洋里的各位!1

    代码

    只要您配置了openCV库,那么直接拷贝下面这段代码,稍加修改读取图片路径即可马上运行。 
    参考以下代码:

    //2018.1.19_21:09 by Cooper Liu
    //Questions? Contact me: angelpoint@foxmail.com
    //本程序为C++工程,编译环境需要配置openCV
    #include <iostream>  
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    //#include<opencv2/opencv.hpp>//如果要包含所有库
    
    using namespace cv;
    
    void main()
    {
        //这一段程序实现:图像img -> ptr[][] -> 图像img2 的传递过程,即图像->二维数组->图像
        int i = 0, j = 0;
        Mat img = imread("F:\\photoCollection\\flowergirl.png", 0);//读取图像img。0表示转换为灰度图像读入
        int row = img.rows;
        int col = img.cols;
        namedWindow("原图");
        imshow("原图", img);
    
        Mat img2 = Mat(row, col, CV_8UC1);//图像img2:row*col大小
    
        uchar **ptr = (uchar **)malloc(row*sizeof(uchar *));//二维数组ptr[][]
        for (i = 0; i < row; i++)
            ptr[i] = (uchar *)malloc(col*sizeof(uchar));
    
        uchar *ptmp = NULL;//这是关键的指针!!
    
        for (i = 0; i < row; i++)
        {
            ptmp = img2.ptr<uchar>(i);//指针指向img2的第i行
            for (j = 0; j < col; j++)
            {
                ptr[i][j] = img.at<uchar>(i, j);//img的矩阵数据传给二维数组ptr[][]
                ptmp[j] = ptr[i][j];//二维数组数据传给img2的第i行第j列
            }
        }
        namedWindow("新图");
        imshow("新图", img2);
    
        // 等待100000 ms后窗口自动关闭    
        waitKey(100000);
    }

    openCV图像矩阵Mat和二维数组的互相转换

    标签: OpenCV图像矩阵
      135人阅读  评论(0)  收藏  举报
      分类:
    数字图像处理(4) 

    目录(?)[+]

    openCV图像矩阵Mat和二维数组的互相转换

    • 目的
    • 代码

    阅读之前注意:

    本文阅读建议用时:9min 
    本文阅读结构如下表:

    项目下属项目测试用例数量
    目的0
    代码1

    目的

    在openCV的应用中,我们获取图像的矩阵信息很简单。但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算。那么我们就需要把openCV读取到的类型(比如Mat类型)的矩阵信息传递到另外类型(比如Eigen库的MatrixXd类型)的矩阵。这该怎么办呢?由于目前在网络上搜不到特别符合楼主意愿的答案,故写此博客,希望能够帮助到同楼主一样徜徉在信息海洋里的各位!1

    代码

    只要您配置了openCV库,那么直接拷贝下面这段代码,稍加修改读取图片路径即可马上运行。 
    参考以下代码:

    
    //2018.1.19_21:09 by Cooper Liu
    //Questions? Contact me: angelpoint@foxmail.com
    //本程序为C++工程,编译环境需要配置openCV
    #include <iostream>  
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    //#include<opencv2/opencv.hpp>//如果要包含所有库
    
    using namespace cv;
    
    void main()
    {
        //这一段程序实现:图像img -> ptr[][] -> 图像img2 的传递过程,即图像->二维数组->图像
        int i = 0, j = 0;
        Mat img = imread("F:\\photoCollection\\flowergirl.png", 0);//读取图像img。0表示转换为灰度图像读入
        int row = img.rows;
        int col = img.cols;
        namedWindow("原图");
        imshow("原图", img);
    
        Mat img2 = Mat(row, col, CV_8UC1);//图像img2:row*col大小
    
        uchar **ptr = (uchar **)malloc(row*sizeof(uchar *));//二维数组ptr[][]
        for (i = 0; i < row; i++)
            ptr[i] = (uchar *)malloc(col*sizeof(uchar));
    
        uchar *ptmp = NULL;//这是关键的指针!!
    
        for (i = 0; i < row; i++)
        {
            ptmp = img2.ptr<uchar>(i);//指针指向img2的第i行
            for (j = 0; j < col; j++)
            {
                ptr[i][j] = img.at<uchar>(i, j);//img的矩阵数据传给二维数组ptr[][]
                ptmp[j] = ptr[i][j];//二维数组数据传给img2的第i行第j列
            }
        }
        namedWindow("新图");
        imshow("新图", img2);
    
        // 等待100000 ms后窗口自动关闭    
        waitKey(100000);
    }

    展开全文
  • #include <iostream>...opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; i...
  • 目录opencv维mat矩阵增加行用途代码输出结果参考完 opencv维mat矩阵增加行 用途 有时候需要让矩阵增加行,遇上的实例是我想把求得的仿射矩阵(2x3)变成个透视变换矩阵(3x3)方便后面的运算,只需要增加{...
  • #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>...opencv2/opencv.hpp>//如果要包含所有库 using namespace cv; void main() ...
  • 在做图像处理中,常用的函数接口有Opencv中的Mat图像类,有时候需要直接用二指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像。本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应...
  • OpenCV实现Mat与vector,Mat与数组互

    万次阅读 多人点赞 2018-05-09 17:09:38
    OpenCV实现Mat与vector互 【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/80253066 1、Mat与vector互 下面是鄙人实现的Mat与vector互的方法,需要注意的是vector转Mat时...
  • opencv Mat创建高维数组(三及以上)

    千次阅读 2019-09-11 18:06:06
    想要创建高维数组,主要利用MatMat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);这成员函数。 假设要创建四数组,具体事例如下: int p = 1; int q = 2; int t = 3; ...
  • opencv将二向量转化成Mat

    千次阅读 2015-04-03 18:45:28
    在使用svm训练分类器时,输入需要是Mat类,故需要将vector类转化成Mat类,代码如下:void vector2Mat(vector< vector<double> > src,Mat & dst,int type) { Mat temp(src.size(),src.at(0).size(),type); for(int ...
  • 参考连接: 链接: https://www.freesion.com/article/8359826950/. 如有侵权,请联系本人删除。
  • 在用opencv做三重构时,新学习了Mat矩阵,对于Mat的创建赋值有了一定了解,代码简单小结如下: 1、创建零/矩阵 Mat mzeros = Mat::zeros(1, ix.rows, CV_32F); Mat mones = Mat::ones(1, ix.rows, CV_32F); 2...
  • #include <opencv2/opencv.hpp> using namespace cv; using namespace std;.../***************** Mat转vector **********************/ template<typename _Tp> vector<_Tp> convertMat
  • 就是 在main()中调用test()函数跑了一下,但我这打印出来的是个莫名其妙的Mat矩阵。好奇怪的结果,刚学opencv。 代码如下。求助 ![图片说明](https://img-ask.csdn.net/upload/201704/17/1492407106_96786.png) ...
  • opencvopencvMat类型转换 ConvertTo

    万次阅读 2018-08-22 09:25:26
    在使用Opencv中,常常会出现读取个图片内容后要把图片内容的像素信息转为浮点并把当前的mat作为矩形进行矩阵计算,那么这里就有个类型转换问你,在新的opencvmat个函数可以用于类型的相互转换 ...
  • 有时候这些算法需要用3维图展示效果,但c++的opencv里没有很方便的3立体图方式。 python的中有各种图形库,可以很方便的展示3立体图。(python比matlab显示立体图更加快捷) 可以用c++中调用python代码,实现3...
  • Opencv Mat 数组

    2020-08-14 15:59:48
    数组就是一维矩阵,很多操作是相同的,这里放到一起。重点是列出和Mat有关的操作。 OpenCV有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等。大多数函数...
  • 1.通过数组生成Mat 有时我们在工程中会接受数组类型的图像,处理起来不太方便,如果将它转化成Mat类型就可以opencv庞大的函数库了。...1.数组ImgData可以是一维数组也可以是二维数组,直接放进来就行。 2.第三个
  • opencv高维数组-4

    2021-04-27 16:41:45
    opencv高维数组-4创建高维数组创建高维图片数组从现有mat, 建立子mat 创建高维数组 #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(){ ...
  • OpenCV Mat类详解和用法

    万次阅读 多人点赞 2017-04-13 16:58:49
    OpenCV Mat类详解和用法  我们有多种方法可以获得从现实世界的数字图像:数码相机、扫描仪、计算机体层摄影或磁共振成像就是其中的几种。在每种情况下我们(人类)看到了什么是图像。但是,转换图像到我们的数字...
  • java程序利用OpenCvMat 矩阵进行计算操作,计算行列式对应的值计算出来的结果和已知的二位数组的计算方法进行比较,计算结果是相同的
  • 基于opencv一维Fourier变换

    千次阅读 2016-11-03 23:58:13
    基于opencv一维Fourier变换 此程序主要实现了fft、ifft计算。原本是用于cpu雷达信号脉冲压缩的C++实现。程序调试后无错误,可以运行,程序需要读取磁盘中的.dat文件实现数据导入。 调试环境:VS2015+opencv//2016....
  • C# opencvsharp学习笔记 (mat转array)

    千次阅读 2020-06-04 16:20:17
    C# opencvsharp学习笔记 (mat矩阵array数组) ** Mat.GetArray opencvsharp调用方法: public void GetArray(int row, int col, data); row:起始行 col:起始列 data:输出数据,包含类型byte[],byte[,],int[],...
  • OpenCV Mat个普通数组来用

    千次阅读 2017-08-02 14:26:39
      在网上,关于OpenCV,关于Mat的文章,代码都非常多,但是都是相对简单的应用,当做个图像数据来用,用到的格式也基本都是CV_8U和CV_8UC3类型。   CV_8UC就是创建单通道的图像,在读取图像...
  • opencvmat详细解析

    万次阅读 2018-04-16 21:23:52
    OpenCV作为强大的计算机视觉开源库,很大程度上参考了MatLab的实现细节和风格,比如说,在OpenCV2.x 版本以后,越来越多的函数实现了MatLab具有的功能,甚至干脆连函数名都一模一样(如 imread, imshow,imwriter等)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,803
精华内容 5,921
关键字:

matopencv一维转