Mat数据结构

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;
}

效果图:

                

       原图                              处理后图像



    
    


   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值