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,请大神赐教! 展开
{
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,请大神赐教! 展开
1个回答
展开全部
产生此问题的原因是opencv的IplImage类型中关于图像实际数据的存储问题导致的。IplImage类型与图像的实际存储地址实际上是不一样的,IplImage类型其实仅仅是一个imageheader,存储的图像数据和IplImage类型数据是分开的。也就是IplImage a ,IplImage b。使用b给a赋值(a=b)时,图像数据并没有拷贝。也就是说其实你的程序中sub_img仅仅相当于一个指针,指向了interet_img图像数据中的一个位置而已。对sub_img的操作实际上也是对interet_img操作。所以调整灰度的时候interet_img图像也被修改了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询