1

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

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

其中 Data 是短数组。

然后我使用这个函数为这个图像设置 ROI

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

并且投资回报率设置成功。

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

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

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

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

提前致谢

4

1 回答 1

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

您将获得的价值不在投资回报率中!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 的正确方法......

于 2012-07-13T11:54:52.940 回答