OPENCV中关于imagedata的问题。

intmain(intargc,char**argv){IplImage*interest_img;CvRectinterest_rect;if(argc==7&&((i... int main(int argc, char** argv)
{
IplImage* interest_img;
CvRect interest_rect;
if( argc == 7 && ((interest_img=cvLoadImage(argv[1],1)) != 0 ))
{
interest_rect.x = atoi(argv[2]);
interest_rect.y = atoi(argv[3]);
interest_rect.width = atoi(argv[4]);
interest_rect.height = atoi(argv[5]);
int add = atoi(argv[6]);

IplImage *sub_img = cvCreateImageHeader(
cvSize(
interest_rect.width,
interest_rect.height
),
interest_img->depth,
interest_img->nChannels
);

sub_img->origin = interest_img->origin;
sub_img->widthStep = interest_img->widthStep;
sub_img->imageData = interest_img->imageData +
interest_rect.y * interest_img->widthStep +
interest_rect.x * interest_img->nChannels;

cvAddS( sub_img, cvScalar(add), sub_img );

cvReleaseImageHeader(&sub_img);

cvNamedWindow( "Roi_Add", CV_WINDOW_AUTOSIZE );
cvShowImage( "Roi_Add", interest_img );
cvWaitKey();
}
return 0;
}
上面这个程序是用于在一张图片中,用一个矩形框选出指定位置。
sub_img->imageData = interest_img->imageData +
interest_rect.y * interest_img->widthStep +
interest_rect.x * interest_img->nChannels;
这句代码的意思,应该是让sub_img的imageData指向指定矩形框的左上角的元素的地址吧。
为何此时,sub_img就获得了图像数据,不是仅指向了一个元素的地址而已吗?
还是,再通过 cvAddS( sub_img, cvScalar(add), sub_img );这句增加灰度的语句后,
发现原本的图像interest_img也出现了相应的矩形框.但是从上面的语句来看,interet_img的图像数据
并不见得有改变啊。这又是为什么呢?

小弟初学OPENCV,请大神赐教!
展开
 我来答
房子a房子a
推荐于2016-11-08 · TA获得超过2047个赞
知道小有建树答主
回答量:783
采纳率:85%
帮助的人:562万
展开全部
产生此问题的原因是opencv的IplImage类型中关于图像实际数据的存储问题导致的。IplImage类型与图像的实际存储地址实际上是不一样的,IplImage类型其实仅仅是一个imageheader,存储的图像数据和IplImage类型数据是分开的。也就是IplImage a ,IplImage b。使用b给a赋值(a=b)时,图像数据并没有拷贝。也就是说其实你的程序中sub_img仅仅相当于一个指针,指向了interet_img图像数据中的一个位置而已。对sub_img的操作实际上也是对interet_img操作。所以调整灰度的时候interet_img图像也被修改了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式