cvSetImageROI与cv :: Mat(cv :: Rect())

时间:2015-12-24 09:42:23

标签: c++ opencv

我正在将一些代码从旧的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]时切换投资回报率?

0 个答案:

没有答案