opencv中三种基本的矩阵结构,IplImage和Mat用于读取图像,CvMat用于矩阵运算,下面总结其用法,可能总结不全,敬请谅解。
1 、IplImage对像素处理
1. 创建一副单通道字节性图像,令其像素全为黑
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
for (int i=0;i<img->height;i++)
{
for (int j=0;j<img->width;j++)
{
((uchar*)img->imageData+i*img->widthStep)[j]=255;
}
}
- 创建多通道字节型图像
IplImage* img1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
for (int i=0;i<img1->height;i++)
{
for (int j=0;j<img1->width;j++)
{
((uchar*)img1->imageData+i*img1->widthStep)[j*img1->nChannels+0]=100;//B
((uchar*)img1->imageData+i*img1->widthStep)[i*img1->nChannels+1]=100;//G
((uchar*)img1->imageData+i*img1->widthStep)[i*img1->nChannels+2]=100;//R
}
}
- 基于指针的直接访问,也是我最喜欢的用法
IplImage* img2=cvCreateImage(cvSize(240,160),IPL_DEPTH_8U,1);
int height=img2->height;
int width=img2->width;
int step=img2->widthStep/sizeof(uchar);
uchar* data=(uchar*)img2->imageData;//指向首地址
for (int i=0;i<height;i++)
{
for (int j=0;j<width;j++)
{
data[i*step+j]=128;
}
}
2、Mat像素处理
1. 利用at()函数处理
对于灰度图,获取i行j列的像素,令其等于255
image.at<uchar>(j,i)=255
彩色图
image.at<cv::Vec3b>(j,i)[0]=255 ;
image.at<cv::Vec3b>(j,i)[1]=255 ;
image.at<cv::Vec3b>(j,i)[1]=255 ;
2 指针遍历像素,获取j行的首地址(推荐)
uchar *data = image.ptr<uchar>(j) ;
j行i列的像素值为data[i]
3 底层指针运算
获得j行,i列的像素地址
uchar *data = image.data + j*image.step + i *image.elemSize() ;
3 、CvMat处理
1. 利用CV_MAT_ELEM宏访问
```
int A[]={1,2,3,4};
CvMat mat=cvMat(2,2,CV_32S,A);
cout<<CV_MAT_ELEM(mat,int,1,1)<<endl;
2 利用cvGetReal2D()访问
cout<<cvGetReal2D(&mat,1,1);
3 利用指针访问
for (int i=0;i<mat.rows;i++)
{
int *pData=(int*)(mat.data.ptr+i*mat.step);
for (int j=0;j<mat.cols;j++)
{
cout<<*pData<<" ";
pData++;
}
cout<<endl;
}
“`