我正在将一些代码从旧的C接口移植到新的C ++接口,我有一个小问题。给出灰度图像处理的代码:
const int MARGIN = 5;
IplImage image = ....;
cvSetImageROI(image, cvRect(MARGIN, 0, image.width - MARGIN, image.height));
for (int y = MARGIN; y < image.height - MARGIN; y++)
{
uchar ptr = (uchar *) image.imageData + y * image.widthStep + MARGIN;
for (int x = MARGIN; x < image.width - MARGIN; x++, ptr++)
{
// ...code referencing *ptr only
ptr++;
}
}
转换为C ++接口,我使用:
cv::Mat image = ....;
cv::Mat roiImage = image(cv::Rect(MARGIN, 0, image.cols - MARGIN, image.rows));
for (int y = MARGIN; y < roiImage.rows - MARGIN; y++)
{
uchar ptr = roiImage.ptr<uchar>(y);
for (int x = 0; x < roiImage.cols; x++, ptr++)
{
// ...code referencing *ptr only
ptr++;
}
}
这给了我与以前基本相同的结果。
但是,现有代码尝试访问ptr[-1]
和ptr[+1]
,这是第一次和最后一次内循环的边距。在此示例中roiImage.ptr<uchar>(y)[-1]
是否安全,或者我应该按原样使用image
,而不会在我访问image.ptr<uchar>(y)[MARGIN-1]
时切换投资回报率?