练习3-5: 为一个图像创建多个图像头。读取一个大小至少为100×100的图像。另创建两个图像头并设置它们的origion,depth,nChannels和widthStep属性同之前读取的图像一样。在新的图像头中,设置宽度为20,高度为30。最后,将imageData指针分别指向像素(5,10)和(50,60)像素位置。传递这两个新的图像头给cvNot()。最后显示最初读取的图像,在那个大图像中应该有两个矩形,矩形内的值是原始值的求反值。
#include "cv.h"
#include "highgui.h"
int main()
{
IplImage *src=cvLoadImage("lena.jpg");
IplImage *dst1,*dst2;
dst1=cvCreateImage(cvSize(20,30),src->depth,src->nChannels);
dst1->origin=src->origin;
dst1->widthStep=src->widthStep;
dst2=cvCreateImage(cvSize(20,30),src->depth,src->nChannels);
dst2->origin=src->origin;
dst2->widthStep=src->widthStep;
dst1->imageData=src->imageData+10*src->widthStep+5*src->nChannels;
dst2->imageData=src->imageData+60*src->widthStep+50*src->nChannels;
cvNot(dst1,dst1);
cvNot(dst2,dst2);
cvNamedWindow("src",1);
cvShowImage("src",src);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst1);
cvReleaseImage(&dst2);
cvDestroyWindow("src");
return 0;
}
说明:dst1 ->imageData = src->imageData + 10 * src->widthStep + 5 *
这句话的执行程序为:
imagedata指针是字节类型的指针,包含一个指向第一行图像数据的指针;
而
widthStep是相邻行同列点之间的字节数;
所以src->imageData + 10 * src->widthStep就是指向了第10行起始点的图像数据;
由于图像不是单通道的,
所以
src->imageData + 10 * src->widthStep + 5 * src->nChannels就指向了像素点(5,10)的位置。
程序执行结果如下: