Mat数据结构

xiaoxiao2021-02-28  167

class CV_EXPORTS Mat   //C++ 类 定义  存放图像所有像素 { public: // 标志位 int flags;   // 数组的维数,>= 2 int dims ;    // 行和列的数量或 (-1,-1) 此时数组已超过 2 维 int rows,cols;   // 指向数据的指针 uchar *data ; // 指针的引用计数器 阵列指向用户分配的数据时,当指针为 NULL int * refcount ;

};  

//对象调用,创建变量

// 方法1:创建无初始化矩阵   cv::Mat image1;     // 方法2:创建6行6列类型为8位单通道矩阵   cv::Mat image2( 6, 6, CV_8UC1 );   // 方法3:创建大小为7x7类型为8位3通道矩阵   cv::Mat image3( cv::Size(7,7), CV_8UC3 );   // 方法4:创建一个用1+3j填充的 8x8 复矩阵   cv::Mat image4( 8, 8, CV_32FC2, cv::Scalar(1,3) );   // 方法5:创建大小为 9x9 类型为8位3通道矩阵   cv::Mat image5( cv::Size(9,9), CV_8UC3, cv::Scalar(1,2,3) );   //方法6:创建以image2赋值给image6,共用数据对象   cv::Mat image6( image2 );  

//

// 矩阵行列数获取   std::cout << "Image1 row: " << Image1.rows << std::endl;   std::cout << "Image1 col: " << Image1.cols << std::endl;

 Image.size()

// 利用create方法重新创建 10X10的8位无符号3通道矩阵   Image2.create(10, 10, CV_8UC(3));   std::cout <<"Image2 channels:" <<  Image2.channels() << std::endl;   // 矩阵类型转换   Image2.convertTo(Image2, CV_32F);   std::cout <<"Image2 depth:" << Image2.depth() << std::endl;   // zeros 创建矩阵   cv::Mat Image3 =   cv::Mat::zeros(Image2.rows, Image2.cols, CV_8UC1); 

     在使用Opencv中,常常会出现读取一个图片内容后要把图片内容的像素信息转为浮点并把当前的mat作为矩形进行矩阵计算,那么这里就有一个类型转换问你,在新的opencv中mat有一个函数可以用于类型的相互转换

ConvertTo

oclMat::convertTo(oclMat& m, int rtype, double alpha=1, double beta=0) m:转为目标数据类型的矩阵; rtype: 指定目标数据类型,或者是depth(通道数),如果rtype:是负值,那么目标矩阵的数据类型和源矩形的数据类型是一致的; alpha:基于尺度的变化值; beta:在尺度上的加和;

比如:

cv::Mat matTemp = cv::Mat::zeros(100,100,CV_32F); //得到一个浮点型的100*100的矩阵 cv::Mat MatTemp2; matTemp.convertTo(MatTemp2, CV_8U); //把矩阵matTemp转为unsing char类型的矩阵,注在转换过程中有可能数值上会出现一些变化,这个要注意
OpenCV—矩阵数据类型转换cv::convertTo  

灰度图像遍历的三种方法

通过指针访问 通过迭代器访问 动态地址计算,通过at()函数实现、 实现代码:

#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat Img=imread("1.jpg",0); if(!Img.data) { cout<<"could not open"<<endl; return -1; } imshow("src",Img); Mat d_Img = Img.clone(); const int channels=d_Img.channels(); int nRows=d_Img.rows; int nCols=d_Img.cols*channels; //用指针访问像素,速度最快 uchar *p; for(int i=0;i<nRows;i++) { p=d_Img.ptr<uchar>(i);//获取每行首地址 for(int j=0;j<nCols;++j) { if(p[j]>128) p[j]=0; else p[j]=255; } } /* //通过迭代器访问,最安全 { MatIterator_<uchar>it,end; for(it=d_Img.begin<uchar>(),end=d_Img.end<uchar>();it!=end;++it) { if(*it>128) *it=0; else *it=255; } } */ /* // 动态地址计算,通过at()函数实现 for(int i=0;i<d_Img.rows;++i) { for(int j=0;j<d_Img.cols;++j) { if(d_Img.at<uchar>(i,j)>128) d_Img.at<uchar>(i,j)=0; else d_Img.at<uchar>(i,j)=255; } } */ imshow("dst",d_Img); waitKey(0); return 0; } 效果图:

                

       原图                              处理后图像

转载请注明原文地址: https://www.6miu.com/read-17451.html

最新回复(0)