【opencv】Mat 数据操作

来源:互联网 发布:macbook视频制作软件 编辑:程序博客网 时间:2024/05/18 16:39


<span style="white-space:pre"></span>t = (double)getTickCount();Mat img1(1000, 1000, CV_32F);for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){img1.at<float>(i,j) = 3.2f;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());//***************************************************************t = (double)getTickCount();Mat img2(1000, 1000, CV_32F);for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){img2.ptr<float>(i)[j] = 3.2f;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());//***************************************************************t = (double)getTickCount();Mat img3(1000, 1000, CV_32F);float* pData = (float*)img3.data;for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){*(pData) = 3.2f;pData++;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());//***************************************************************t = (double)getTickCount();Mat img4(1000, 1000, CV_32F);for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){((float*)img3.data)[i*1000+j] = 3.2f;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());/*********加强版********/t = (double)getTickCount();Mat img5(1000, 1000, CV_32F);float *pData1;for (int i=0; i<1000; i++) { pData1=img5.ptr<float>(i);for (int j=0; j<1000; j++) { pData1[j] = 3.2f; } } t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());/*******终极版*****/t = (double)getTickCount();Mat img6(1000, 1000, CV_32F);float *pData2;Size size=img6.size();if(img2.isContinuous()){size.width = size.width*size.height;size.height = 1;}size.width*=img2.channels();for(int i=0; i<size.height; i++){pData2 = img6.ptr<float>(i);for(int j=0; j<size.width; j++){pData2[j] = saturate_cast<float>(3.2f);}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());



1.存取单个像素值
最通常的方法就是

img.at<uchar>(i,j) = 255;img.at<Vec3b>(i,j)[0] = 255;


2.如果你觉得at操作显得太笨重了,不想用Mat这个类,也可以考虑使用轻量级的Mat_类,使用重载操作符()实现取元素的操作。

cv::Mat_<uchar> im2= img; // im2 refers to imageim2(50,100)= 0; // access to row 50 and column 100


3.用迭代器iterator扫描图像
Mat_<Vec3b>::iterator it = img.begin<Vec3b>();Mat_<Vec3b>::iterator itend = img.end<Vec3b>();for (; it!=itend; it++){         (*it)[0] = 255;}

5.整行整列像素值的赋值
对于整行或者整列的数据,可以考虑这种方式处理

img.row(i).setTo(Scalar(255));  img.col(j).setTo(Scalar(255));  

0 0
原创粉丝点击