关于OPENCV中IplImage所存储…

来源:互联网 发布:软件需求分析活动 编辑:程序博客网 时间:2024/06/06 13:59
原文地址:关于OPENCV中IplImage所存储数据的讨论作者:shelliar
OPENCV一书中,对IplImage和CvMat的讲述不够详细,很多时候当我们处理图像的时候,我们会避免用cvMat而是直接用IplImage的方法。
IplImage这个结构体中存储图像数据的部分是char *imageData,这个指针指向图像数组的首地址。而imageData是一个一维数组,遍历其数据的方法是使y从0~imageData->height,假设图像为img,则每一行y地址指针即ptr=img->imageData+y*img->widthStep,若图像是RGB即三通道的,则每行为3*img->width个数据(每个像素占3个数据),通过x和y的递归从而操作图像的数据。
另外IplImage的图像数据有的时候不得不转换到cvmat,特别是二维矩阵以便于矩阵的各种计算,这个时候,转换的方法为:

IplImage-> cv::Mat
IplImage* pImg =cvLoadImage("lena.jpg");
cv::Matimg(pImg,0);  //0是不複製影像,也就是pImg與img的data共用同個記憶體位置,header各自有

 

cv::Mat-> IplImage
// converts header to IplImage; nodata is copied
// operator IplImage()const; 
// img 是格式为cv::Mat的数据


IplImage pImg;
pImg =IplImage(img);  // 一樣檔案沒複製

CvMat 和 IplImage的类型转换,也可以用 cvGetMat , cvGetImage 两个函数来实现。

还有麻烦的办法,就是:

IplImage *pImg = cvLoadImage("2.jpg", 0);
CvMat header;
CvMat *mat;
mat = cvReshape(pImg, &header, 0,pImg->width *pImg->height);

原创粉丝点击