精华内容
下载资源
问答
  • OpenCV中构造Mat矩阵赋值和复制的

    千次阅读 2017-06-29 10:20:28
    对OpenCV中的Mat矩阵的复制,创建等操作的时间消耗 代码如下: clock_t t1,t2; t1 = clock(); Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0)); t2 = clock(); cout<<"Mat mat1(10000,5000,CV_64FC1,Scalar::all...

    对OpenCV中的Mat矩阵的复制,创建等操作的时间消耗
    代码如下:
    clock_t t1,t2;
    t1 = clock();
    Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0));
    t2 = clock();
    cout<<"Matmat1(10000,5000,CV_64FC1,Scalar::all(0.0))\t"<<t2-t1<<endl;
     
    {
    t1 = clock();
    Mat mat2(mat1);
    t2 = clock();
    cout<<"Mat mat2(mat1)\t"<<t2-t1<<endl;
    }
     
    {
    Mat mat3(500,500,CV_64FC1,Scalar::all(0.0));
    t1 = clock();
    mat3 = mat1;
    t2 = clock();
    cout<<"mat3 = mat1;\t"<<t2-t1<<endl;
    }
     
    {
    Mat mat4;
    t1 = clock();
    mat1.copyTo(mat4);
    t2 = clock();
    cout<<"mat1.copyTo(mat4);\t"<<t2-t1<<endl;
    }
     
    {
    Mat mat4;
    t1 = clock();
    mat4 = mat1.clone();
    t2 = clock();
    cout<<"mat4 =mat1.clone();\t"<<t2-t1<<endl;
    }
     
    {
    Mat mat5(10000,5000,CV_32FC1,Scalar::all(0.0));
    t1 = clock();
    mat1.convertTo(mat5,CV_32FC1);
    t2 = clock();
    cout<<"mat1.convertTo(mat5,CV_32FC1);\t"<<t2-t1<<endl;
    }
    一个典型的输出。
    Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0)) 540
    Mat mat2(mat1)  0
    mat3 = mat1;   1
    mat1.copyTo(mat4);     515
    mat4 =mat1.clone();   465
    mat1.convertTo(mat5,CV_32FC1);  488
    另一个运行的输出。
    Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0)) 391
    Mat mat2(mat1)  0
    mat3 = mat1;   0
    mat1.copyTo(mat4);     433
    mat4 =mat1.clone();   453
    mat1.convertTo(mat5,CV_32FC1);  495
    从结果中可以看到,拷贝构造函数和赋值的时间可以忽略不计,但Mat::copyTo、Mat::clone、Mat::convertTo等需要申请空间或复制数据的操作就需要大量的时间。
    附:

    for (std::vector::iterator iter = vecSrcImg.begin(); iter !=vecSrcImg.end(); iter++)
    {

    t1 = (double)cvGetTickCount();

    Mat srcMat( srcImg.rows, srcImg.cols, CV_8UC(1), Scalar::all(0));
    //12ms
    Mat srcMat(srcMatTemp);
    //0.2ms

    srcMat = *iter;
    //10ms
    //Mat dstMat(srcImg.rows, srcImg.cols, CV_8UC(1),Scalar::all(0));//12ms
    Mat dstMat(srcMatTemp);//0.2ms

    Gassian_Histogram(srcMat, dstMat, 2.0);

    unsigned char* imgData = srcMat.data;
    Gassian_like_histogram(imgData, srcImg.cols, srcImg.rows, 2.0);

    tempT = (double)cvGetTickCount() - t1;

    printf( " histogramGaussian cost time = %gms\n",tempT/((double)cvGetTickFrequency()*1000.) );

      dstMat.data = imgData;

    vecDstImg.push_back(dstMat);

    }

    展开全文
  • 对OpenCV中的Mat矩阵的复制,创建等操作的时间消耗 代码如下: clock_t t1,t2; t1 = clock(); Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0)); t2 = clock(); cout   { t1 = ...


    对OpenCV中的Mat矩阵的复制,创建等操作的时间消耗

    代码如下:

    clock_t t1,t2;

    t1 = clock();

    Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0));

    t2 = clock();

    cout<<"Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0))\t"<<t2-t1<<endl;

     

    {

    t1 = clock();

    Mat mat2(mat1);

    t2 = clock();

    cout<<"Mat mat2(mat1)\t"<<t2-t1<<endl;

    }

     

    {

    Mat mat3(500,500,CV_64FC1,Scalar::all(0.0));

    t1 = clock();

    mat3 = mat1;

    t2 = clock();

    cout<<"mat3 = mat1;\t"<<t2-t1<<endl;

    }

     

    {

    Mat mat4;

    t1 = clock();

    mat1.copyTo(mat4);

    t2 = clock();

    cout<<"mat1.copyTo(mat4);\t"<<t2-t1<<endl;

    }

     

    {

    Mat mat4;

    t1 = clock();

    mat4 = mat1.clone();

    t2 = clock();

    cout<<"mat4 = mat1.clone();\t"<<t2-t1<<endl;

    }

     

    {

    Mat mat5(10000,5000,CV_32FC1,Scalar::all(0.0));

    t1 = clock();

    mat1.convertTo(mat5,CV_32FC1);

    t2 = clock();

    cout<<"mat1.convertTo(mat5,CV_32FC1);\t"<<t2-t1<<endl;

    }

    一个典型的输出。

    Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0))  540

    Mat mat2(mat1)  0

    mat3 = mat1;    1

    mat1.copyTo(mat4);      515

    mat4 = mat1.clone();    465

    mat1.convertTo(mat5,CV_32FC1);  488

    另一个运行的输出。

    Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0))  391

    Mat mat2(mat1)  0

    mat3 = mat1;    0

    mat1.copyTo(mat4);      433

    mat4 = mat1.clone();    453

    mat1.convertTo(mat5,CV_32FC1);  495

    从结果中可以看到,拷贝构造函数和赋值的时间可以忽略不计,但Mat::copyTo、Mat::clone、Mat::convertTo等需要申请空间或复制数据的操作就需要大量的时间。

    附:


    for (std::vector<Mat>::iterator iter = vecSrcImg.begin(); iter != vecSrcImg.end(); iter++/****/)
    {
    t1 = (double)cvGetTickCount();
    //Mat srcMat( srcImg.rows, srcImg.cols, CV_8UC(1), Scalar::all(0) );//12ms
    Mat srcMat(srcMatTemp);//0.2ms
    srcMat = *iter;//10ms
    //Mat dstMat(srcImg.rows, srcImg.cols, CV_8UC(1), Scalar::all(0));//12ms
    Mat dstMat(srcMatTemp);//0.2ms
    //Gassian_Histogram(srcMat, dstMat, 2.0);
     
      unsigned char* imgData = srcMat.data;
    Gassian_like_histogram(imgData, srcImg.cols, srcImg.rows, 2.0);
    tempT = (double)cvGetTickCount() - t1;
    printf( " histogramGaussian cost time = %gms\n", tempT/((double)cvGetTickFrequency()*1000.) );

      dstMat.data = imgData;

    vecDstImg.push_back(dstMat);

    }

    展开全文
  • 那样a矩阵的数据区还是指向p的,如果delete了p数组,a的指针就无效了。     矩阵之间的复制问题 Mat b=a; 这个是浅复制,即a.release()之后b就无效了。 Mat b; a.copyTo(b); 或者 b=a.clone() 都是深复制,即是...

    如果定义为
    uchar *p=new uchar[9];
    Mat a(3,3,CV_8UC1,p);
    那样a矩阵的数据区还是指向p的,如果delete了p数组,a的指针就无效了。

     

     


    矩阵之间的复制问题
    Mat b=a;
    这个是浅复制,即a.release()之后b就无效了。
    Mat b; a.copyTo(b);
    或者
    b=a.clone()
    都是深复制,即是数据区会复制一份。

    展开全文
  • 1 inline 2 Mat Mat::clone() const 3 { 4 Mat m; 5 copyTo(m); 6 return m; 7 } 1 void Mat::copyTo( OutputArray _dst ) const 2 { 3 int dtype = _dst.type(); 4 ...
    1 inline
    2 Mat Mat::clone() const
    3 {
    4     Mat m;
    5     copyTo(m);
    6     return m;
    7 }
     1 void Mat::copyTo( OutputArray _dst ) const
     2 {
     3     int dtype = _dst.type();
     4     if( _dst.fixedType() && dtype != type() )
     5     {
     6         CV_Assert( channels() == CV_MAT_CN(dtype) );
     7         convertTo( _dst, dtype );
     8         return;
     9     }
    10 
    11     if( empty() )
    12     {
    13         _dst.release();
    14         return;
    15     }
    16 
    17     if( _dst.isUMat() )
    18     {
    19         _dst.create( dims, size.p, type() );
    20         UMat dst = _dst.getUMat();
    21 
    22         size_t i, sz[CV_MAX_DIM], dstofs[CV_MAX_DIM], esz = elemSize();
    23         for( i = 0; i < (size_t)dims; i++ )
    24             sz[i] = size.p[i];
    25         sz[dims-1] *= esz;
    26         dst.ndoffset(dstofs);
    27         dstofs[dims-1] *= esz;
    28         dst.u->currAllocator->upload(dst.u, data, dims, sz, dstofs, dst.step.p, step.p);
    29         return;
    30     }
    31 
    32     if( dims <= 2 )
    33     {
    34         _dst.create( rows, cols, type() );
    35         Mat dst = _dst.getMat();
    36         if( data == dst.data )
    37             return;
    38 
    39         if( rows > 0 && cols > 0 )
    40         {
    41             // For some cases (with vector) dst.size != src.size, so force to column-based form
    42             // It prevents memory corruption in case of column-based src
    43             if (_dst.isVector())
    44                 dst = dst.reshape(0, (int)dst.total());
    45 
    46             const uchar* sptr = data;
    47             uchar* dptr = dst.data;
    48 
    49             CV_IPP_RUN(
    50                     (size_t)cols*elemSize() <= (size_t)INT_MAX &&
    51                     (size_t)step <= (size_t)INT_MAX &&
    52                     (size_t)dst.step <= (size_t)INT_MAX
    53                     ,
    54                     ippiCopy_8u_C1R(sptr, (int)step, dptr, (int)dst.step, ippiSize((int)(cols*elemSize()), rows)) >= 0
    55             )
    56 
    57             Size sz = getContinuousSize(*this, dst);
    58             size_t len = sz.width*elemSize();
    59 
    60             for( ; sz.height--; sptr += step, dptr += dst.step )
    61                 memcpy( dptr, sptr, len );
    62         }
    63         return;
    64     }
    65 
    66     _dst.create( dims, size, type() );
    67     Mat dst = _dst.getMat();
    68     if( data == dst.data )
    69         return;
    70 
    71     if( total() != 0 )
    72     {
    73         const Mat* arrays[] = { this, &dst };
    74         uchar* ptrs[2];
    75         NAryMatIterator it(arrays, ptrs, 2);
    76         size_t sz = it.size*elemSize();
    77 
    78         for( size_t i = 0; i < it.nplanes; i++, ++it )
    79             memcpy(ptrs[1], ptrs[0], sz);
    80     }
    81 }
    View Code

    测试代码:

    #include <iostream>
    #include <vector>
    #include <numeric>
    #include "opencv2/opencv.hpp"
    using  namespace std;
    int main()
    {
        const std::string path = "415-DST.bmp";
        cv::Mat src = cv::imread(path, cv::IMREAD_COLOR);
    
        cv::Mat dst1;
        cv::Mat dst2;
        
        std::vector<double> ratios;
    
        for (int i = 0; i < 1000; i++)
        {
            double t = cv::getTickCount();
            dst1 = src.clone();
            t = (cv::getTickCount() - t);
            cout << "clone:" << t << endl;
    
            double t1 = cv::getTickCount();
            src.copyTo(dst2);
            t1 = (cv::getTickCount() - t1) ;
            cout << "copyTo:" << t1 << endl;
    
            double r = t / t1;
            ratios.push_back(r);
            cout << "clone-CopytTo Ratio: " << r << endl;
            cout << "--------------------------------\n";
        }
    
        double avg = std::accumulate(ratios.begin(), ratios.end(), 0.0) / ratios.size();
        cout << "average ratio:" << avg << endl;
        system("pause");
        return 0;
    }
    

      

     

    结论: clone()函数要比copyTo函数慢3倍左右

    转载于:https://www.cnblogs.com/wfh2017/p/7261705.html

    展开全文
  • Opencv之Mat矩阵

    2019-05-13 11:05:48
    对于opencv来说,Mat矩阵是很基础也很重要数据类型,之前也常常用到,但最近用到时候,出现一个问题,才意识到之前掌握知识存在漏洞。 Mat赋值: 1)以固定大小,固定类型,全0,初始化 Mat fgMask = Mat:...
  • 1、Mat矩阵值传递时候,如果在函数内部类型发生改变时候,传出来数据会变化,所以需要在函数内部重新复制一块区域给他,才能传出想要Mat void getDes(Mat& des) { temp = Mat(10,10,CV_32FC1); temp....
  • Mat之间的复制

    2020-01-06 18:47:30
    OpenCV里的Mat矩阵复制分为“浅拷贝”、“深拷贝”两种, “浅拷贝”:共享同一块内存空间,改变其中一个Mat 矩阵的值,另一个也会改变; “深拷贝”:不共享同一块内存空间,两个矩阵的数据相同,但是互不影响。 A...
  • Opencv学习——Mat矩阵操作

    千次阅读 2017-05-06 17:36:58
    Opencv2出现以后图像的操作可以...一般复制操作只是复制了矩阵头和指向矩阵的指针,并不会复制矩阵本身的数据。一些基本操作如下: Mat A, C; //只创建了矩阵头 A = imread(argv[1], CV_LOAD_IMAGE_COLOR); //创建方法
  • Mat的复制

    2018-12-10 22:57:31
    Mat的复制引言法一法二法三 引言 模式识别中,经常需要将所有样本导入到一个矩阵中去。就涉及到将一张图片转为一行数据然后复制到大矩阵中。这里以自己练习中遇到情况举例:200个图片样本。vectorcv::Mat train...
  • 矩阵操作通常不会进行元素复制,应注意: Mat a=Mat(100,100,CV_32S); Mat b=Mat(100,100,CV_32S); b=a.col(8);//此时并未进行元素赋值,而只是将b第9列指向了a,所以对b操作将会影响a。
  • 将matlab 生成的mat矩阵存储到txt中。

    千次阅读 2014-01-12 11:23:25
    所以想把.mat内容复制到txt中读取。  问题在于,txt每行容积是有限,而要使用软件缺陷样本有几千列float型数据, 到一定位置时就会自动换行。 然而,虽然有几千列数据,但是行数只在几十左右,  ...
  • #include <opencv2\opencv.hpp> #include <iostream> #include <math.h> using namespace std; using namespace cv; int main(int argc, char** argv)... Mat Z = Mat::zeros(2, 3, CV_8UC1);...
  • Header中主要包含矩阵的大小,存储方式,存储地址等信息;Pointer中存储指向像素值的指针。关于Mat数据复制:前面说过Mat包括头和数据指针,当使用Mat的构造函数初始化的时候,会将头和数据指针复制(注意:只是指针...
  • 1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以 Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 ...
  • MAT复制

    2015-12-25 10:43:58
    其思路是让每个 Mat 对象有自己信息头,但共享同一个矩阵。这通过让矩阵指针指向同一地址而实现。而拷贝构造函数则 只拷贝信息头和矩阵指针 ,而不拷贝矩阵。 1 2 3 4 5 6 Mat A, C; //...
  • Mat基本上是一个包含两个数据部分的类:矩阵头(包含诸如矩阵大小,用于存储的方法,存储矩阵的地址等信息)和指向包含矩阵的矩阵的指针。像素值(取决于选择存储的方法取任何维度)。矩阵标题大小是恒定的,但是...
  • 其实方法很简单。 Mat之间赋值,如果不用clone或copyto话,只是赋值指针。 所以,让某个Mat等于另外一个Mat的一部分话。就可以对另一个Mat的一部分进行操作。...那么a内容就复制到了c该部分
  • Mat复制

    2016-03-14 10:17:06
    1.Mat::row()函数作用:截取特定行数矩阵,并创建矩阵头部信息(header)。 **复杂度:**O(1),原因是新的矩阵数据与源矩阵共享,并不会创建新存储空间。所以导致问题是下方代码并不会执行: for (int i = A....
  • Mat的优势是Mat自动内存管理,不需要显式释放(当然也可以手动调用release()方法强制Mat矩阵数据释放) CvMat则需要调用cvReleaseMat(&cvmat)来释放 //CvMat*之间的复制:REAL COPY CvMat* a = cvCloneMat(b); /...
  • 复制(部分复制,完全复制) Mat对象

    千次阅读 2018-04-16 09:52:10
    (1) 部分复制:不会复制Mat对象的数据部分(即指针指向的矩阵),只会复制它的头(包括矩阵的尺寸/存储方法/存储地址等信息)和指针部分(指向存储所有像素值的矩阵)。 方法1: Mat B(A);//B是A的部分复制 方法2(创建...
  • Mat 复制详解

    千次阅读 2015-06-25 18:06:57
     ... 在OpenCV中Mat、CvMat和IplImage类型都可以代表和显示图像。IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -> CvMat -> IplImage,Mat类型则是C++版本的矩阵类型(CvArr用作函数参数,无论传入是C
  • OpenCV关于Mat图片复制

    千次阅读 2018-09-02 15:14:05
    srcimage.copyTo(firstimage);...Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法不同矩阵可以是不同维数)指针。 ...
  • MATLAB矩阵复制及扩充

    2021-02-05 11:22:33
    4 5 6],可用Mat替代function中原矩阵的位置 例二:(行方向和列方向分别平铺矩阵,红框2,3表示平铺倍数) 例三:(列方向平铺矩阵,红框2表示平铺矩阵的倍数) 例四:(行方向平铺矩阵,红框3表示平铺矩阵的...
  • opencv Mat之间赋值(复制)

    万次阅读 2016-03-03 10:44:12
    //注意:浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c任意一个都会对另外2个产生同样作用) Mat a; Mat b = a; //a "copy" to b Mat c(a); //a "copy" to c 深拷贝 //注意:深拷贝 Mat a; Mat b...
  • 图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分...Mat类型的图像在内存中包含两部分的内容:矩阵头与图像数据矩阵的指针。矩阵头包含了图像的基本信息(如...
  • OpenCV 矩阵复制(copyto,clone)

    千次阅读 2017-03-29 01:03:56
    矩阵之间的复制总结 Mat b=a; 这个是浅复制,即a.release()之后b就无效了。Mat b; a.copyTo(b); 或者 b=a.clone()都是深复制,即是数据区会复制一份。
  • Mat对象拷贝

    2019-06-13 15:08:15
    //使用拷贝构造函数创建一个新的Mat类对象B C = A;//使用赋值操作符把A对象复制给C 上面所有的Mat对象最终都指向了同一个数据区块。区别只是矩阵头不一样。使用其中一个比如A对象修改数据,那...
  • Mat常用操作

    2016-01-05 17:27:01
    一、 Mat的复制,就是从一个矩阵A,生成相关的另一个矩阵B。 (1)使用赋值的方法,比如通过构造函数生成矩阵N,通过复制生成矩阵P cv::Mat N(M);  cv::Mat P;  P=M;   这样生成的矩阵,只是新生成一...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 289
精华内容 115
关键字:

mat矩阵的复制