opencv笔记(五)——IplImage和CvMat

    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::Mat img(pImg,0);  // 0是不複製影像,也就是pImg與img的data共用同個記憶體位置,header各自有

cv::Mat -> IplImage
// converts header to IplImage; no data 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);

http://blog.csdn.net/xiaowei_cqu/article/details/7557063

http://www.360doc.com/content/13/0716/22/13123526_300478086.shtml

  cvReleaseImage(img)和free、delete相同,只是把该指针img所指的内存给释放掉,但并没有把img指针本身干掉,其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,成了野指针。如果此时不把img设置为NULL,会让人误以为img是个合法的指针。

     在继续使用img之前,通常会用语句if (img != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

转自:https://blog.csdn.net/ayuee1992/article/details/38122609

猜你喜欢

转载自blog.csdn.net/qq_37764129/article/details/81225561