如何在opencv中获取灰度图像的强度指针

时间:2012-07-13 10:32:35

标签: visual-studio-2010 visual-c++ opencv

我有一个16位强度的图像二进制文件。我已经用短数组读取了这些数据。并使用以下代码创建16位灰色图像。

 IplImage *img=cvCreateImage( cvSize( Image_width, Image_height ), IPL_DEPTH_16S, 1 );
 cvSetData(img,Data, sizeof(short )*Image_width); 

数据是短阵列。

然后我使用此功能为此图像设置ROI

cvSetImageROI(img, cvRect(crop_start.x, crop_start.y, crop_width, Image_height));

并且ROI正在成功设置。

现在设置ROI后,我想访问图像的强度意味着我想要指向裁剪图像强度的指针。我试过这段代码来访问强度

short *crop_Imagedata=(short *)img->imageData;

但是这个指针没有给出正确的强度,因为我通过调试代码来检查它。

任何人都可以告诉我如何获得图像强度的指针。

先谢谢

1 个答案:

答案 0 :(得分:0)

您好我已尝试以下内容找到您可能想做的事情:

IplImage *img=cvCreateImage( cvSize( 15, 15 ), IPL_DEPTH_16S, 1 );
cvSet(img,cvScalar(15));//sets all values to 15

cvSetImageROI(img, cvRect(4, 0, 10, 15));
short *crop_Imagedata=(short *)img->imageData;
((*crop_Imagedata) == 15) // true

你将获得的价值不在于roi! IplImage结构的imageData只是一个简单的指针,而不是一个函数! opencv的rois在我看来并不是一个记录良好且易于使用的东西。也许opencv的所有算法都以某种方式使用rois。我使用它们但没有这种自动功能与标准iplimage结构,以简单使用它们。 如果你想要更多魔法尝试使用新的cv :: Mat对象... 但如果你仍然不想使用rois那么你将不得不使用

     CvRect roi = cvGetImageROI(img);

方法一直检查位置。之后,您将不得不添加roi偏移量:

((short*)(img->imageData + (roi.y+ypos)*img-widthStep))[roi.x+xpos]

记住标准的Opencv是C库而不是C ++!什么时候混合cv :: Mat rois可能有点烦人。要将iplimage复制到没有roi的cv :: Mat,我必须执行以下操作:

CvRect roitmp = cvGetImageROI(ilimage);
cvResetImageROI(ilimage);
cv::Mat tmp = cv::Mat(ilimage).clone();
cvSetImageROI(ilimage,roitmp);

也许在这里有人知道使用rois的正确方法...