opencv中有时只需要创建结构,而不分配内存。图像头的创建由 cvCreateImageHeader()完成。
当在一副已经读入的图像中对特定的子图像进行操作,除了使用ROI,这种方法也可以。
例如党读入一张大小大于100*100的灰度图,将其子图像进行取反操作。可以创建一个新的图像头,将origin,depth,nchannels,widthStep属性设置成与原图像属性相同,imageSize设置成要处理的子图像大小,使用imagedata指针可以将新图像头的指针指向原图像中要处理的子图像的初始位置,则可以将新的图像头传递给cvNot()函数,对子图像求反。
具体的函数如下:
#include "highgui.h" #include "cv.h" int main(int argc, char* argv) { IplImage* imOrigin = cvLoadImage("E:\gray_image.jpg",1); IplImage* im1 = cvCreateImageHeader(CvSize(40,60),imOrigin->depth,imOrigin->nChannels); IplImage* im2 = cvCreateImageHeader(CvSize(40,60),imOrigin->depth,imOrigin->nChannels); im1->widthStep = imOrigin->widthStep; im2->widthStep = imOrigin->widthStep; im1->imageData = imOrigin->imageData + 5*im1->widthStep +10; im2->imageData = imOrigin->imageData + 50*im1->widthStep +60; cvNot(im1,im1); cvNot(im2,im2); cvNamedWindow("example",1); cvShowImage("example",imOrigin); cvWaitKey(); cvReleaseImage(&imOrigin); cvReleaseImageHeader(&im1); cvReleaseImageHeader(&im2); cvDestroyWindow("example"); return 0; }
这段代码在一张灰度图中设置了两种子图像。这种新建与原图像各种属性(imageSize除外)相同的图像头,使用imagedata指针指向原图像像素地址来处理原图像子图的方法是很有用的,在模板匹配等中可以得到应用。